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+