Section 13/181 menit
13. Migrasi dari SiriKit / INIntent
13. Migrasi dari SiriKit / INIntent
Langkah Migrasi
swift
// ❌ LAMA: INIntent + Extension (SiriKit)
// File: OrderCoffeeIntent.intentdefinition
// Target: CoffeeApp Intents Extension (separate bundle)
class OrderCoffeeIntentHandler: NSObject, OrderCoffeeIntentHandling {
func handle(intent: OrderCoffeeIntent,
completion: @escaping (OrderCoffeeIntentResponse) -> Void) {
// Perlu app group untuk akses data
let defaults = UserDefaults(suiteName: "group.com.myapp.shared")!
let menu = defaults.data(forKey: "menu").flatMap {
try? JSONDecoder().decode([MenuItem].self, from: $0)
} ?? []
guard let item = menu.first(where: { $0.id == intent.itemIdentifier }) else {
completion(.init(code: .failure, userActivity: nil))
return
}
completion(.success(totalPrice: NSDecimalNumber(value: item.price)))
}
}
swift
// ✓ BARU: App Intents — satu file, akses langsung ke service layer
struct OrderCoffeeIntent: AppIntent {
static var title: LocalizedStringResource = "Pesan Kopi"
@Parameter(title: "Menu Item")
var item: MenuItemEntity
@Parameter(title: "Ukuran", default: .medium)
var size: DrinkSize
func perform() async throws -> some IntentResult & ProvidesDialog {
// Akses langsung — tidak perlu app group!
let order = try await CoffeeService.shared.placeOrder(
itemID: item.id,
size: size
)
return .result(dialog: "Pesanan \(item.name) sudah masuk! Total: Rp\(order.totalPrice).")
}
}
Checklist Migrasi
swift
□ Hapus Intents Extension target dari Xcode
□ Hapus .intentdefinition file
□ Hapus Info.plist entries untuk NSExtension
□ Buat struct yang conform AppIntent untuk setiap intent lama
□ Buat AppEntity untuk setiap INObject yang digunakan
□ Buat EntityQuery untuk setiap resolve handler
□ Buat AppShortcutsProvider untuk menggantikan INVoiceShortcut
□ Hapus App Group dependency (tidak lagi diperlukan)
□ Update minimum deployment target ke iOS 16+