Bagikan melalui


Pintasan Siri di Xamarin.iOS

Di iOS 10, Apple memperkenalkan SiriKit, memungkinkan untuk membuat pesan, panggilan VoIP, pembayaran, latihan, pemesanan perjalanan, dan aplikasi pencarian foto yang berinteraksi dengan Siri.

Di iOS 11, SiriKit mendapatkan dukungan untuk lebih banyak jenis aplikasi dan fleksibilitas yang lebih besar untuk penyesuaian UI.

iOS 12 menambahkan Pintasan Siri, memungkinkan semua jenis aplikasi mengekspos fungsionalitasnya ke Siri. Siri mempelajari kapan tugas berbasis aplikasi tertentu paling relevan dengan pengguna dan menggunakan pengetahuan ini untuk menyarankan potensi tindakan melalui pintasan. Mengetuk pintasan atau memanggilnya dengan perintah suara akan membuka aplikasi atau menjalankan tugas latar belakang.

Pintasan harus digunakan untuk mempercepat kemampuan pengguna untuk menyelesaikan tugas umum - dalam banyak kasus tanpa membuka aplikasi yang dimaksud.

Aplikasi sampel: Soup Chef

Untuk lebih memahami Pintasan Siri, lihat aplikasi sampel Soup Chef. Soup Chef memungkinkan pengguna untuk melakukan pemesanan dari restoran sup imajiner, melihat riwayat pesanan mereka, dan menentukan frasa yang akan digunakan saat memesan sup dengan berinteraksi dengan Siri.

Tip

Sebelum menguji Soup Chef pada simulator atau perangkat iOS 12, aktifkan dua pengaturan berikut, yang berguna saat menelusuri kesalahan pintasan:

  • Di aplikasi Pengaturan, aktifkan Pintasan Terbaru Tampilan Pengembang>.
  • Di aplikasi Pengaturan, aktifkan Donasi Tampilan Pengembang > di Layar Kunci.

Pengaturan debug ini memudahkan untuk menemukan pintasan yang baru dibuat (alih-alih diprediksi) di layar kunci iOS dan layar pencarian.

Untuk menggunakan aplikasi sampel:

  • Instal dan jalankan aplikasi sampel Soup Chef di simulator atau perangkat iOS 12.
  • Klik tombol + di sudut kanan atas untuk membuat urutan baru.
  • Pilih jenis sup, tentukan kuantitas dan opsi, lalu ketuk Urutan Tempat.
  • Pada layar Riwayat Pesanan, ketuk urutan yang baru dibuat untuk melihat detailnya.
  • Di bagian bawah layar detail pesanan, ketuk Tambahkan ke Siri.
  • Rekam frasa suara untuk dikaitkan dengan pesanan dan ketuk Selesai.
  • Minimalkan Soup Chef, panggil Siri, dan lakukan pemesanan lagi dengan menggunakan frasa suara yang Anda rekam.
  • Setelah Siri menyelesaikan pesanan, buka kembali Soup Chef dan perhatikan bahwa pesanan baru tercantum di layar Riwayat Pesanan.

Aplikasi sampel menunjukkan cara:

Info.plist dan Entitlements.plist

Sebelum menggali lebih dalam ke kode Soup Chef, lihat file Info.plist dan Entitlements.plist-nya.

Info.plist

File Info.plist dalam proyek SoupChef mendefinisikan Pengidentifikasi Bundel sebagai com.xamarin.SoupChef. Pengidentifikasi bundel ini akan digunakan sebagai awalan untuk pengidentifikasi bundel ekstensi antarmuka pengguna Niat dan Niat yang dibahas nanti dalam dokumen ini.

File Info.plist juga berisi entri berikut:

<key>NSUserActivityTypes</key>
<array>
    <string>OrderSoupIntent</string>
    <string>com.xamarin.SoupChef.viewMenu</string>
</array>

Pasangan kunci/nilai ini NSUserActivityTypes menunjukkan bahwa Soup Chef tahu cara menangani OrderSoupIntent, dan NSUserActivity memiliki ActivityType "com.xamarin.SoupChef.viewMenu".

Aktivitas dan niat kustom yang diteruskan ke aplikasi itu sendiri, dibandingkan dengan ekstensinya, ditangani dalam AppDelegate (dengan UIApplicationDelegateContinueUserActivity metode .

Entitlements.plist

File Entitlements.plist dalam proyek SoupChef berisi entri berikut:

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>
<key>com.apple.developer.siri</key>
<true/>

Konfigurasi ini menunjukkan bahwa aplikasi menggunakan grup aplikasi "group.com.xamarin.SoupChef". Ekstensi aplikasi SoupChefIntents menggunakan grup aplikasi yang sama ini, yang memungkinkan kedua proyek berbagiNSUserDefaults Data.

Kunci com.apple.developer.siri menunjukkan bahwa aplikasi berinteraksi dengan Siri.

Catatan

Konfigurasi build proyek SoupChef menetapkan Pemberian Izin Kustom ke Entitlements.plist.

Menggunakan pintasan NSUserActivity untuk membuka aplikasi

Untuk membuat pintasan yang membuka aplikasi untuk menampilkan konten tertentu, buat NSUserActivity dan lampirkan ke pengontrol tampilan untuk layar yang ingin Anda buka pintasannya.

Menyiapkan NSUserActivity

Pada layar menu, SoupMenuViewController membuat NSUserActivity dan menetapkannya ke properti pengontrol UserActivity tampilan:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    UserActivity = NSUserActivityHelper.ViewMenuActivity;
}

UserActivity Mengatur properti menyumbangkan aktivitas ke Siri. Dari donasi ini, Siri mendapatkan informasi tentang kapan dan di mana aktivitas ini relevan dengan pengguna dan belajar untuk lebih menyarankannya di masa depan.

NSUserActivityHelper adalah kelas utilitas yang termasuk dalam solusi SoupChef , di pustaka kelas SoupKit . Ini membuat dan mengatur berbagai properti yang NSUserActivity terkait dengan Siri dan pencarian:

public static string ViewMenuActivityType = "com.xamarin.SoupChef.viewMenu";

public static NSUserActivity ViewMenuActivity {
    get
    {
        var userActivity = new NSUserActivity(ViewMenuActivityType)
        {
            Title = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            EligibleForSearch = true,
            EligibleForPrediction = true
        };

        var attributes = new CSSearchableItemAttributeSet(NSUserActivityHelper.SearchableItemContentType)
        {
            ThumbnailData = UIImage.FromBundle("tomato").AsPNG(),
            Keywords = ViewMenuSearchableKeywords,
            DisplayName = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            ContentDescription = NSBundleHelper.SoupKitBundle.GetLocalizedString("VIEW_MENU_CONTENT_DESCRIPTION", "View menu content description")
        };
        userActivity.ContentAttributeSet = attributes;

        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_SUGGESTED_PHRASE", "Voice shortcut suggested phrase");
        userActivity.SuggestedInvocationPhrase = phrase;
        return userActivity;
    }
}

Perhatikan fitur-fitur berikut secara khusus:

  • Pengaturan EligibleForPrediction ke true menunjukkan bahwa Siri dapat memprediksi aktivitas ini dan menampilkannya sebagai pintasan.
  • Array ContentAttributeSet adalah standar CSSearchableItemAttributeSet yang digunakan untuk menyertakan NSUserActivity dalam hasil pencarian iOS.
  • SuggestedInvocationPhrase adalah frasa yang akan disarankan Siri kepada pengguna sebagai pilihan potensial saat menetapkan frasa ke pintasan.

Menangani pintasan NSUserActivity

Untuk menangani pintasan yang NSUserActivity dipanggil oleh pengguna, aplikasi iOS harus mengambil ContinueUserActivity alih metode AppDelegate kelas, merespons berdasarkan ActivityType bidang objek yang diteruskan NSUserActivity :

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    // ...
    else if (userActivity.ActivityType == NSUserActivityHelper.ViewMenuActivityType)
    {
        HandleUserActivity();
        return true;
    }
    // ...
}

Metode ini memanggil HandleUserActivity, yang menemukan segue ke layar menu dan memanggilnya:

void HandleUserActivity()
{
    var rootViewController = Window?.RootViewController as UINavigationController;
    var orderHistoryViewController = rootViewController?.ViewControllers?.FirstOrDefault() as OrderHistoryTableViewController;
    if (orderHistoryViewController is null)
    {
        Console.WriteLine("Failed to access OrderHistoryTableViewController.");
        return;
    }
    var segue = OrderHistoryTableViewController.SegueIdentifiers.SoupMenu;
    orderHistoryViewController.PerformSegue(segue, null);
}

Menetapkan frasa ke NSUserActivity

Untuk menetapkan frasa ke NSUserActivity, buka aplikasi iOS Pengaturan dan pilih Siri & Cari > Pintasan Saya. Kemudian, pilih pintasan (dalam hal ini, "Pesan Makan Siang") dan rekam frasa.

Memanggil Siri dan menggunakan frasa ini akan membuka Soup Chef ke layar menu.

Menggunakan pintasan niat kustom untuk melakukan tugas

Menentukan niat kustom

Untuk menyediakan pintasan yang memungkinkan pengguna menyelesaikan tugas tertentu yang terkait dengan aplikasi Anda dengan cepat, buat niat kustom. Niat kustom mewakili tugas yang mungkin ingin diselesaikan pengguna, parameter yang relevan dengan tugas tersebut, dan respons potensial yang dihasilkan dari eksekusi tugas. Bergantung pada bagaimana niat kustom ditentukan, memanggilnya dapat membuka aplikasi Anda atau menjalankan tugas latar belakang.

Gunakan Xcode 10 untuk membuat niat kustom. Di repositori SoupChef, niat kustom ditentukan dalam OrderSoupIntentCodeGen, sebuah Objective-C proyek. Buka proyek ini dan pilih file Intents.intentdefinition di Navigator Proyek untuk melihat niat OrderSoup.

Perhatikan fitur-fitur berikut:

  • Niat memiliki Kategori Pesanan. Ada berbagai kategori yang telah ditentukan sebelumnya yang dapat digunakan untuk niat kustom; pilih salah satu yang paling cocok dengan tugas yang akan diaktifkan niat kustom Anda. Karena solusi ini adalah aplikasi pemesanan sup, OrderSoupIntent menggunakan Order.
  • Kotak centang Konfirmasi menunjukkan apakah Siri harus meminta konfirmasi sebelum menjalankan tugas atau tidak. Untuk niat Sop Pesanan di Soup Chef, opsi ini diaktifkan karena pengguna melakukan pembelian.
  • Bagian Parameter dari file .intentdefinition menentukan parameter yang relevan dengan pintasan. Untuk menempatkan pesanan sup, Soup Chef harus mengetahui jenis sup, kuantitasnya, dan opsi terkait. Setiap parameter memiliki jenis; parameter yang tidak dapat diwakili oleh jenis yang telah ditentukan sebelumnya diatur sebagai Kustom.
  • Antarmuka Jenis Pintasan menjelaskan berbagai kombinasi parameter yang dapat digunakan Siri saat menyarankan pintasan Anda. Bagian Judul dan Subtitel terkait memungkinkan Anda menentukan pesan yang akan digunakan Siri saat menyajikan pintasan yang disarankan kepada pengguna.
  • Kotak centang Mendukung Eksekusi Latar Belakang harus dipilih untuk pintasan apa pun yang dapat dijalankan tanpa membuka aplikasi untuk interaksi pengguna lebih lanjut.

Menentukan respons niat kustom

Item Respons yang ditumpuk di bawah niat OrderSoup mewakili respons potensial yang dihasilkan dari urutan sup.

Dalam definisi respons niat OrderSoup, perhatikan fitur berikut:

  • Properti respons dapat digunakan untuk menyesuaikan pesan yang dikomunikasikan kembali kepada pengguna. Respons niat OrderSoup memiliki properti soup dan waitTime.
  • Templat Respons menentukan berbagai pesan keberhasilan dan kegagalan yang dapat digunakan untuk menunjukkan status setelah tugas niat selesai.
  • Kotak centang Berhasil harus dipilih untuk respons yang menunjukkan keberhasilan.
  • Respons keberhasilan OrderSoupIntent menggunakan properti sup dan waitTime untuk memberikan pesan yang ramah dan berguna yang menjelaskan kapan pesanan sup akan siap.

Membuat kode untuk niat kustom

Membangun proyek Xcode yang berisi definisi niat kustom ini menyebabkan Xcode menghasilkan kode yang dapat digunakan untuk berinteraksi secara terprogram dengan niat kustom dan responsnya.

Untuk melihat kode yang dihasilkan ini:

  • Buka AppDelegate.m.
  • Tambahkan impor ke file header niat kustom: #import "OrderSoupIntent.h"
  • Dalam metode apa pun di kelas , tambahkan referensi ke OrderSoupIntent.
  • Klik kanan dan OrderSoupIntent pilih Lompat ke Definisi.
  • Klik kanan dalam file yang baru dibuka, OrderSoupIntent.h, dan pilih Tampilkan di Finder.
  • Tindakan ini akan membuka jendela Finder yang berisi file .h dan .m yang berisi kode yang dihasilkan.

Kode yang dihasilkan ini meliputi:

  • OrderSoupIntent – Kelas yang mewakili niat kustom.
  • OrderSoupIntentHandling – Protokol yang mendefinisikan metode yang akan digunakan untuk mengonfirmasi bahwa niat harus dijalankan dan metode yang benar-benar menjalankannya.
  • OrderSoupIntentResponseCode – Enum yang mendefinisikan berbagai status respons.
  • OrderSoupIntentResponse – kelas yang mewakili respons terhadap eksekusi niat.

Membuat pengikatan ke niat kustom

Untuk menggunakan kode yang dihasilkan oleh Xcode di aplikasi Xamarin.iOS, buat pengikatan C# untuknya.

Membuat pustaka statis dan definisi pengikatan C#

Di repositori SoupChef, lihat di folder OrderSoupIntentStaticLib, dan buka proyek OrderSoupIntentStaticLib.xcodeproj Xcode.

Proyek Pustaka Statis Sentuhan Kakao ini berisi file OrderSoupIntent.h dan OrderSoupIntent.m yang dihasilkan oleh Xcode.

Mengonfigurasi pengaturan build proyek pustaka statis

Di Navigator Proyek Xcode, pilih proyek tingkat atas, OrderSoupIntentStaticLib, dan navigasikan ke Sumber Kompilasi Fase > Build. Perhatikan bahwa OrderSoupIntent.m (yang mengimpor OrderSoupIntent.h) tercantum di sini. Di Link Binary With Libraries, perhatikan bahwa Intents.framework dan Foundation.framework disertakan. Dengan pengaturan ini di tempat, kerangka kerja akan dibangun dengan benar.

Membangun pustaka statis dan menghasilkan definisi pengikatan C#

Untuk membangun pustaka statis dan menghasilkan definisi pengikatan C#untuk itu, ikuti langkah-langkah berikut:

  • Instal Objective Sharpie, alat yang digunakan untuk menghasilkan definisi pengikatan dari file .h dan .m yang dibuat oleh Xcode.

  • Konfigurasikan sistem Anda untuk menggunakan Xcode 10 Command Line Tools:

    Peringatan

    Memperbarui Alat Baris Perintah yang dipilih berdampak pada semua versi Xcode yang diinstal pada sistem Anda. Setelah selesai menggunakan aplikasi sampel Soup Chef, pastikan untuk mengembalikan pengaturan ini ke konfigurasi aslinya.

    • Di Xcode, pilih Lokasi Preferensi > Xcode > dan atur Alat Baris Perintah ke penginstalan Xcode 10 terbaru yang tersedia di sistem Anda.
  • Di terminal, cd ke direktori OrderSoupIntentStaticLib .

  • Ketik make, yang membangun:

    • Pustaka statis, libOrderSoupIntentStaticLib.a
    • Dalam direktori output bo, definisi pengikatan C#:
      • ApiDefinitions.cs
      • StructsAndEnums.cs

Proyek OrderSoupIntentBindings , yang bergantung pada pustaka statis ini dan definisi pengikatan terkait, membangun item ini secara otomatis. Namun, berjalan secara manual melalui proses di atas akan memastikan bahwa proses tersebut dibangun seperti yang diharapkan.

Untuk informasi selengkapnya tentang membuat pustaka statis dan menggunakan Objective Sharpie untuk membuat definisi pengikatan C#, lihat panduan Mengikat pustaka iOSObjective-C.

Membuat pustaka pengikatan

Dengan pustaka statis dan definisi pengikatan C#yang dibuat, bagian yang tersisa yang diperlukan untuk menggunakan kode terkait niat yang dihasilkan Xcode dalam proyek Xamarin.iOS adalah pustaka pengikatan.

Di repositori Soup Chef, buka file SoupChef.sln. Antara lain, solusi ini berisi OrderSoupIntentBinding, pustaka pengikatan untuk pustaka statis yang dihasilkan sebelumnya.

Perhatikan secara khusus bahwa proyek ini meliputi:

  • ApiDefinitions.cs – File yang dihasilkan sebelumnya oleh Objective Sharpie dan ditambahkan ke proyek ini. Tindakan Build file ini diatur ke ObjcBindingApiDefinition.

  • StructsAndEnums.cs – File lain yang dihasilkan sebelumnya oleh Objective Sharpie dan ditambahkan ke proyek ini. Tindakan Build file ini diatur ke ObjcBindingCoreSource.

  • Referensi Asli ke libOrderSoupIntentStaticLib.a, pustaka statis yang dibuat sebelumnya. Perbarui properti referensi asli dan tentukan nilai berikut:

    1. Kerangka kerja = Foundation Intents
    2. Tautan Pintar = On
    3. Paksa Beban = On
    4. Jenis = Static

Catatan

Baik ApiDefinitions.cs maupun StructsAndEnums.cs berisi atribut seperti [Watch (5,0), iOS (12,0)]. Atribut ini, yang dihasilkan oleh Objective Sharpie, telah dikomentari karena tidak diperlukan untuk proyek ini.

Untuk informasi selengkapnya tentang membuat pustaka pengikatan C#, lihat panduan Mengikat Pustaka iOSObjective-C.

Perhatikan bahwa proyek SoupChef berisi referensi ke OrderSoupIntentBinding, yang berarti sekarang dapat mengakses, di C#, kelas, antarmuka, dan enum yang berisi:

  • OrderSoupIntent
  • OrderSoupIntentHandling
  • OrderSoupIntentResponse
  • OrderSoupIntenseResponseCode

Membuat kerangka kerja Swift

Kode asli definisi niat dihasilkan oleh Xcode secara default menggunakan bahasa proyek asli Anda. Jika Anda menentukan file Intents.intentdefinition dalam proyek Swift, Xcode akan menghasilkan satu file Swift dengan semua kelas yang diperlukan, yang dapat Anda gunakan untuk membuat kerangka kerja Swift.

Tip

Anda dapat memilih bahasa yang diinginkan untuk kode niat yang dihasilkan di pengaturan build Xcode. Buka Target niat > Build Pengaturan > Pengkompilasi Definisi Niat - Pembuatan Kode dan pilih Swift atau Objective-C. Anda juga dapat menyimpannya secara otomatis agar sesuai dengan bahasa target Anda.

Proses pembuatan kerangka kerja Swift mirip dengan yang dijelaskan sebelumnya:

  1. Buat proyek kerangka kerja Swift baru.
  2. Salin file Swift yang dihasilkan secara otomatis dengan kode niat ke proyek ini, Anda dapat menemukan file ini seperti yang dijelaskan di sini.
  3. Objective-C Aktifkan header bridging, sehingga kerangka kerja secara otomatis dihasilkan dengan file header yang diperlukan oleh Objective-C sharpie.

Setelah kerangka kerja dibuat, ikuti langkah-langkah yang sama yang dijelaskan sebelumnya untuk membuat pengikatan Xamarin. Anda dapat membaca selengkapnya tentang membuat pengikatan untuk kerangka kerja Swift di sini.

Menambahkan file definisi niat ke solusi Anda

Dalam solusi C# SoupChef , proyek SoupKit berisi kode yang dibagikan antara aplikasi dan ekstensinya. File Intents.intentdefinition telah ditempatkan di direktori Base.lproj SoupKit, dan memiliki TindakanBuild Konten. Proses build menyalin file ini ke dalam bundel aplikasi Soup Chef, di mana aplikasi harus berfungsi dengan benar.

Menyumbangkan niat

Agar Siri menyarankan pintasan, harus terlebih dahulu memahami kapan pintasan relevan.

Untuk memberi Siri pemahaman ini, Soup Chef menyumbangkan niat kepada Siri setiap kali pengguna menempatkan pesanan sup. Berdasarkan sumbangan ini - ketika didonasikan, di mana sumbangannya, parameter yang dikandungnya - Siri mempelajari kapan harus menyarankan pintasan di masa mendatang.

SoupChef menggunakan SoupOrderDataManager kelas untuk menempatkan donasi. Ketika dipanggil untuk menempatkan pesanan sup untuk pengguna, metode pada gilirannya PlaceOrder memanggil DonateInteraction:

void DonateInteraction(Order order)
{
    var interaction = new INInteraction(order.Intent, null);
    interaction.Identifier = order.Identifier.ToString();
    interaction.DonateInteraction((error) =>
    {
        // ...
    });
}

Setelah mengambil niat, niat tersebut dibungkus dalam INInteraction. diberikan INInteractionIdentifier yang cocok dengan ID unik pesanan (akan membantu nanti saat menghapus donasi niat yang tidak lagi valid). Kemudian, interaksi disalurkan kepada Siri.

Panggilan ke getter order.Intent mengambil yang OrderSoupIntent mewakili urutan dengan mengatur Quantity, , Soup, Optionsdan gambar, dan frasa pemanggilan untuk digunakan sebagai saran ketika pengguna merekam frasa bagi Siri untuk dikaitkan dengan niat:

public OrderSoupIntent Intent
{
    get
    {
        var orderSoupIntent = new OrderSoupIntent();
        orderSoupIntent.Quantity = new NSNumber(Quantity);
        orderSoupIntent.Soup = new INObject(MenuItem.ItemNameKey, MenuItem.LocalizedString);

        var image = UIImage.FromBundle(MenuItem.IconImageName);
        if (!(image is null))
        {
            var data = image.AsPNG();
            orderSoupIntent.SetImage(INImage.FromData(data), "soup");
        }

        orderSoupIntent.Options = MenuItemOptions
            .ToArray<MenuItemOption>()
            .Select<MenuItemOption, INObject>(arg => new INObject(arg.Value, arg.LocalizedString))
            .ToArray<INObject>();

        var comment = "Suggested phrase for ordering a specific soup";
        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_SOUP_SUGGESTED_PHRASE", comment);
        orderSoupIntent.SuggestedInvocationPhrase = String.Format(phrase, MenuItem.LocalizedString);

        return orderSoupIntent;
    }
}

Menghapus donasi yang tidak valid

Penting untuk menghapus sumbangan yang tidak lagi valid sehingga Siri tidak membuat saran pintasan yang tidak membantu atau membingungkan.

Di Soup Chef, layar Konfigurasi Menu dapat digunakan untuk menandai item menu sebagai tidak tersedia. Siri seharusnya tidak lagi menyarankan pintasan untuk memesan item menu yang tidak tersedia, sehingga RemoveDonation metode menghapus sumbangan SoupMenuManager untuk item menu yang tidak lagi tersedia. Aplikasi ini mengimplementasikan fungsionalitas ini dengan:

  • Menemukan pesanan yang terkait dengan item menu yang sekarang tidak tersedia.
  • Mengambil pengidentifikasi mereka.
  • Menghapus interaksi yang memiliki pengidentifikasi yang sama.
void RemoveDonation(MenuItem menuItem)
{
    if (!menuItem.IsAvailable)
    {
        Order[] orderHistory = OrderManager?.OrderHistory.ToArray<Order>();
        if (orderHistory is null)
        {
            return;
        }

        string[] orderIdentifiersToRemove = orderHistory
            .Where<Order>((order) => order.MenuItem.ItemNameKey == menuItem.ItemNameKey)
            .Select<Order, string>((order) => order.Identifier.ToString())
            .ToArray<string>();

        INInteraction.DeleteInteractions(orderIdentifiersToRemove, (error) =>
        {
            if (!(error is null))
            {
                Console.WriteLine($"Failed to delete interactions with error {error.ToString()}");
            }
            else
            {
                Console.WriteLine("Successfully deleted interactions");
            }
        });
    }
}

Memvalidasi donasi yang berhasil

Solusinya mencakup beberapa proyek dan konfigurasi tertentu. Dalam beberapa kasus, aplikasi dapat mengalami crash karena konfigurasi yang tidak lengkap, dalam kasus lain, aplikasi dapat secara diam-diam gagal menyumbangkan interaksi. Penting untuk memvalidasi donasi yang berhasil dan pengaturan Pengembang iOS membantunya. Navigasi ke pengembang Pengaturan > dan aktifkan opsi pengembang berikut untuk melihat sumbangan dan pintasan terbaru:

  • Tampilkan Pintasan Terkini
  • Tampilkan Donasi di Layar Kunci

Setelah diaktifkan, setiap donasi yang berhasil akan muncul di layar kunci dan di bawah opsi saran Siri. Jika setelah menjalankan aplikasi, Anda tidak melihat sumbangan di sana, tinjau kasus pemecahan masalah berikut:

  1. Aplikasi gagal membuat OrderSoupIntent dengan kesalahan berikut:

    Tidak dapat membuat instans asli dari jenis 'NativeLibrary.OrderSoupIntent': kelas asli belum dimuat.

    Kesalahan ini berarti bahwa Xamarin tidak dapat memuat kelas asli melalui pengikatan Xamarin. Untuk memperbaikinya, verifikasi bahwa pustaka asli menyertakan kode yang diperlukan, yang dirujuk oleh proyek pengikatan, dan bendera yang tepat diatur, seperti yang dijelaskan di sini, atur Force Load bendera ke On.

  2. Aplikasi gagal menginisialisasi instans asli yang dimuat dari kelas niat dengan kesalahan berikut:

    Tidak dapat menginisialisasi instans jenis 'NativeLibrary.OrderSoupIntent': metode 'init' asli yang dikembalikan nihil.

    Masalah ini terkait dengan file definisi niat yang hilang. Aplikasi Xamarin harus menyertakan file definisi niat asli dengan jenisnya, seperti yang Content dijelaskan di sini.

  3. Aplikasi membuat niat dan memanggil metode donasi tanpa crash tetapi output konsol menunjukkan peringatan tentang jenis niat yang tidak diketahui dan tidak ada donasi yang dibuat:

    Tidak dapat menyumbangkan interaksi dengan OrderSoupIntent yang tidak memiliki jenis pintasan yang valid

    Untuk memperbaiki masalah, niat harus ditentukan dengan benar dalam plist, pemberian izin Siri harus diaktifkan dan dipilih untuk konfigurasi build saat ini melalui pengaturan proyek.

    Info.plist aplikasi:

    <key>NSUserActivityTypes</key>
    <array>
        <string>ScheduleMeetingIntent</string>
    </array>
    

    Entitlements.plist aplikasi dengan kemampuan Siri:

    <key>com.apple.developer.siri</key>
    <true/>
    

    Penetapan kustom harus dipilih untuk konfigurasi build yang ditargetkan. Buka Pengaturan > proyek Membangun > Penandatanganan Bundel iOS dan atur Pemberian Hak Kustom ke file Entitlements.plist yang berisi hak yang diperlukan.

Membuat ekstensi Niat

Kode yang berjalan ketika Siri memanggil niat ditempatkan dalam ekstensi Niat, yang dapat ditambahkan sebagai proyek baru ke solusi yang sama dengan aplikasi Xamarin.iOS yang ada seperti Soup Chef. Dalam solusi SoupChef, ekstensi ini disebut SoupChefIntents.

SoupChefIntents – Info.plist dan Entitlements.plist

SoupChefIntents – Info.plist

Info.plist dalam proyek SoupChefIntents mendefinisikan Pengidentifikasi Bundel sebagai com.xamarin.SoupChef.SoupChefIntents.

File Info.plist juga berisi entri berikut:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsRestrictedWhileLocked</key>
        <array/>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <key>IntentsRestrictedWhileProtectedDataUnavailable</key>
        <array/>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-service</string>
    <key>NSExtensionPrincipalClass</key>
    <string>IntentHandler</string>
</dict>

Pada Info.plist di atas:

  • IntentsRestrictedWhileLocked mencantumkan niat yang akan ditangani ketika perangkat tidak terkunci.
  • IntentsSupported mencantumkan niat yang ditangani oleh ekstensi ini.
  • NSExtensionPointIdentifier menentukan jenis ekstensi aplikasi. Untuk informasi selengkapnya, lihat dokumentasi Apple.
  • NSExtensionPrincipalClass menentukan kelas yang harus digunakan untuk menangani niat yang didukung oleh ekstensi ini.
SoupChefIntents – Entitlements.plist

Entitlements.plist dalam proyek SoupChefIntents memiliki kemampuan Grup Aplikasi. Kemampuan ini dikonfigurasi untuk menggunakan grup aplikasi yang sama dengan proyek SoupChef :

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>

Soup Chef menyimpan data dengan NSUserDefaults. Untuk berbagi data antara aplikasi dan ekstensi aplikasi, mereka mereferensikan grup aplikasi yang sama dalam file Entitlements.plist mereka.

Catatan

Konfigurasi build proyek SoupChefIntents menetapkan Pemberian Izin Kustom ke Entitlements.plist.

Menangani tugas latar belakang OrderSoupIntent

Ekstensi Niat menjalankan tugas latar belakang yang diperlukan untuk pintasan berdasarkan niat kustom.

Siri memanggil GetHandler metode IntentHandler kelas (didefinisikan dalam Info.plist sebagai NSExtensionPrincipalClass) untuk mendapatkan instans OrderSoupIntentHandlingkelas yang memperluas , yang dapat digunakan untuk menangani OrderSoupIntent:

[Register("IntentHandler")]
public class IntentHandler : INExtension
{
    public override NSObject GetHandler(INIntent intent)
    {
        if (intent is OrderSoupIntent)
        {
            return new OrderSoupIntentHandler();
        }
        throw new Exception("Unhandled intent type: ${intent}");
    }

    protected IntentHandler(IntPtr handle) : base(handle) { }
}

OrderSoupIntentHandler, yang didefinisikan dalam proyek SoupKit dari kode bersama, menerapkan dua metode penting:

  • ConfirmOrderSoup – Mengonfirmasi apakah tugas yang terkait dengan niat harus benar-benar dijalankan atau tidak
  • HandleOrderSoup – Menempatkan pesanan sup dan merespons pengguna dengan memanggil handler penyelesaian passed-in

Menangani OrderSoupIntent yang membuka aplikasi

Aplikasi harus menangani niat yang tidak berjalan di latar belakang dengan benar. Niat ini ditangani dengan cara yang sama seperti NSUserActivity pintasan, dalam ContinueUserActivity metode AppDelegate:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    var intent = userActivity.GetInteraction()?.Intent as OrderSoupIntent;
    if (!(intent is null))
    {
        HandleIntent(intent);
        return true;
    }
    // ...
}  

Menyediakan antarmuka pengguna untuk niat kustom

Ekstensi UI Niat menyediakan antarmuka pengguna kustom untuk ekstensi Niat. Dalam solusi SoupChef, SoupChefIntentsUI adalah ekstensi UI Niat yang menyediakan antarmuka untuk SoupChefIntents.

SoupChefIntentsUI – Info.plist dan Entitlements.plist

SoupChefIntentsUI – Info.plist

Info.plist dalam proyek SoupChefIntentsUI mendefinisikan Pengidentifikasi Bundel sebagai com.xamarin.SoupChef.SoupChefIntentsui.

File Info.plist juga berisi entri berikut:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <!-- ... -->
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-ui-service</string>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
</dict>

Pada Info.plist di atas:

  • IntentsSupported menunjukkan bahwa ditangani OrderSoupIntent oleh ekstensi UI Niat ini.
  • NSExtensionPointIdentifier menentukan jenis ekstensi aplikasi. Untuk informasi selengkapnya, lihat dokumentasi Apple.
  • NSExtensionMainStoryboard menentukan papan cerita yang menentukan antarmuka utama ekstensi ini

SoupChefIntentsUI – Entitlements.plist

Proyek SoupChefIntentsUI tidak memerlukan file Entitlements.plist .

Membuat antarmuka pengguna

Karena Info.plist untuk SoupChefIntentsUI mengatur NSExtensionMainStoryboard kunci ke MainInterface, file MainInterace.storyboard menentukan antarmuka untuk ekstensi Antarmuka Pengguna Niat.

Di papan cerita ini, ada pengontrol tampilan tunggal, dari jenis IntentViewController. Ini mereferensikan dua tampilan:

  • invoiceView, dari jenis InvoiceView
  • confirmationView, dari jenis ConfirmOrderView

Catatan

Antarmuka untuk invoiceView dan confirmationView didefinisikan dalam Main.storyboard sebagai tampilan sekunder. Visual Studio untuk Mac dan Visual Studio 2017 tidak menyediakan dukungan untuk melihat atau mengedit tampilan sekunder; untuk melakukannya, buka Main.storyboard di Interface Builder Xcode.

IntentViewController mengimplementasikan IINUIHostedViewControlling antarmuka, digunakan untuk menyediakan antarmuka kustom saat bekerja dengan Niat Siri. Tje ConfigureView metode dipanggil untuk menyesuaikan antarmuka, menampilkan konfirmasi atau faktur, tergantung pada apakah interaksi sedang dikonfirmasi (INIntentHandlingStatus.Ready) atau telah berhasil dijalankan (INIntentHandlingStatus.Success):

[Export("configureViewForParameters:ofInteraction:interactiveBehavior:context:completion:")]
public void ConfigureView(
    NSSet<INParameter> parameters,
    INInteraction interaction,
    INUIInteractiveBehavior interactiveBehavior,
    INUIHostedViewContext context,
    INUIHostedViewControllingConfigureViewHandler completion)
{
    // ...
    if (interaction.IntentHandlingStatus == INIntentHandlingStatus.Ready)
    {
        desiredSize = DisplayInvoice(order, intent);
    }
    else if(interaction.IntentHandlingStatus == INIntentHandlingStatus.Success)
    {
        var response = interaction.IntentResponse as OrderSoupIntentResponse;
        if (!(response is null))
        {
            desiredSize = DisplayOrderConfirmation(order, intent, response);
        }
    }
    completion(true, parameters, desiredSize);
}

Tip

Untuk informasi selengkapnya tentang metode ini ConfigureView , tonton presentasi WWDC 2017 Apple, Apa yang Baru di SiriKit.

Membuat pintasan suara

Soup Chef menyediakan antarmuka untuk menetapkan pintasan suara ke setiap pesanan, sehingga memungkinkan untuk memesan sup dengan Siri. Bahkan, antarmuka yang digunakan untuk merekam dan menetapkan pintasan suara disediakan oleh iOS dan memerlukan sedikit kode kustom.

Di OrderDetailViewController, saat pengguna mengetuk baris Tambahkan ke Siri tabel, RowSelected metode menyajikan layar untuk menambahkan atau mengedit pintasan suara:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    // ...
    else if (TableConfiguration.Sections[indexPath.Section].Type == OrderDetailTableConfiguration.SectionType.VoiceShortcut)
    {
        INVoiceShortcut existingShortcut = VoiceShortcutDataManager?.VoiceShortcutForOrder(Order);
        if (!(existingShortcut is null))
        {
            var editVoiceShortcutViewController = new INUIEditVoiceShortcutViewController(existingShortcut);
            editVoiceShortcutViewController.Delegate = this;
            PresentViewController(editVoiceShortcutViewController, true, null);
        }
        else
        {
            // Since the app isn't yet managing a voice shortcut for
            // this order, present the add view controller
            INShortcut newShortcut = new INShortcut(Order.Intent);
            if (!(newShortcut is null))
            {
                var addVoiceShortcutVC = new INUIAddVoiceShortcutViewController(newShortcut);
                addVoiceShortcutVC.Delegate = this;
                PresentViewController(addVoiceShortcutVC, true, null);
            }
        }
    }
}

Berdasarkan apakah pintasan suara yang ada ada atau tidak untuk urutan yang ditampilkan saat ini, RowSelected menyajikan pengontrol tampilan jenis INUIEditVoiceShortcutViewController atau INUIAddVoiceShortcutViewController. Dalam setiap kasus, OrderDetailViewController menetapkan dirinya sebagai pengontrol Delegatetampilan , itulah sebabnya juga mengimplementasikan IINUIAddVoiceShortcutViewControllerDelegate dan IINUIEditVoiceShortcutViewControllerDelegate.

Pengujian pada perangkat

Untuk menjalankan Soup Chef di perangkat, ikuti instruksi di bagian ini. Baca juga catatan tentang provisi otomatis.

Grup Aplikasi, ID Aplikasi, Profil Provisi

Di bagian Sertifikat, ID & Profil di Portal Pengembang Apple, lakukan langkah-langkah berikut:

  • Buat grup aplikasi untuk berbagi data antara aplikasi Soup Chef dan ekstensinya. Misalnya: group.com.yourcompanyname.SoupChef

  • Buat tiga ID Aplikasi: satu untuk aplikasi itu sendiri, satu untuk ekstensi Niat, dan satu untuk ekstensi UI Niat. Contohnya:

    • Aplikasi: com.yourcompanyname.SoupChef

      • Untuk ID Aplikasi ini, tetapkan kemampuan SiriKit dan Grup Aplikasi.
    • Ekstensi niat: com.yourcompanyname.SoupChef.Intents

      • Untuk ID Aplikasi ini, tetapkan kemampuan Grup Aplikasi.
    • Ekstensi UI niat: com.yourcompanyname.SoupChef.Intentsui

      • ID Aplikasi ini tidak memerlukan kemampuan khusus.
  • Setelah membuat ID Aplikasi di atas, edit kemampuan Grup Aplikasi yang ditetapkan ke aplikasi dan ekstensi Niat, menentukan grup aplikasi tertentu yang dibuat sebelumnya.

  • Buat tiga profil provisi pengembangan baru, satu untuk setiap ID Aplikasi baru.

  • Unduh profil provisi ini dan klik dua kali masing-masing untuk menginstalnya. Jika Visual Studio untuk Mac atau Visual Studio 2017 sudah berjalan, mulai ulang untuk memastikan visual Studio untuk mendaftarkan profil provisi baru.

Mengedit Info.plist, Entitlements.plist, dan kode sumber

Di Visual Studio untuk Mac atau Visual Studio 2017, lakukan langkah-langkah berikut:

  • Perbarui berbagai file Info.plist dalam solusi. Atur aplikasi, ekstensi Niat, dan Pengidentifikasi Bundel ekstensi UI Niat ke ID Aplikasi yang ditentukan sebelumnya:

    • Aplikasi: com.yourcompanyname.SoupChef
    • Ekstensi Niat: com.yourcompanyname.SoupChef.Intents
    • Ekstensi UI Niat: com.yourcompanyname.SoupChef.Intentsui
  • Perbarui file Entitlements.plist untuk proyek SoupChef:

    • Untuk kemampuan Grup Aplikasi, atur grup ke grup aplikasi baru yang dibuat sebelumnya (dalam contoh di atas, itu group.com.yourcompanyname.SoupChef).
    • Pastikan SiriKit diaktifkan.
  • Perbarui file Entitlements.plist untuk proyek SoupChefIntents:

    • Untuk kemampuan Grup Aplikasi, atur grup ke grup aplikasi baru yang dibuat sebelumnya (dalam contoh di atas, itu group.com.yourcompanyname.SoupChef).
  • Terakhir, buka NSUserDefaultsHelper.cs. Atur AppGroup variabel ke nilai grup aplikasi baru Anda (misalnya, atur ke group.com.yourcompanyname.SoupChef).

Mengonfigurasi pengaturan build

Di Visual Studio untuk Mac atau Visual Studio 2017:

  • Buka opsi/properti untuk proyek SoupChef . Pada tab Penandatanganan Bundel iOS, atur Identitas Penandatanganan ke otomatis dan Profil Provisi ke profil provisi khusus aplikasi baru yang Anda buat sebelumnya.

  • Buka opsi/properti untuk proyek SoupChefIntents . Pada tab Penandatanganan Bundel iOS, atur Identitas Penandatanganan ke profil otomatis dan Provisi ke profil provisi khusus ekstensi Niat baru yang Anda buat sebelumnya.

  • Buka opsi/properti untuk proyek SoupChefIntentsUI . Pada tab Penandatanganan Bundel iOS, atur Identitas Penandatanganan ke otomatis dan Profil Provisi ke profil provisi khusus ekstensi Antarmuka Pengguna Niat baru yang Anda buat sebelumnya.

Dengan perubahan ini, aplikasi akan berjalan pada perangkat iOS.

Provisi otomatis

Anda dapat menggunakan provisi otomatis untuk menyelesaikan banyak tugas provisi ini langsung di IDE. Namun, provisi otomatis tidak menyiapkan grup aplikasi. Anda harus mengonfigurasi file Entitlements.plist secara manual dengan nama grup aplikasi yang ingin Anda gunakan, kunjungi Portal Pengembang Apple untuk membuat grup aplikasi, menetapkan grup aplikasi tersebut ke setiap ID Aplikasi yang dibuat dengan provisi otomatis, meregenerasi profil provisi (aplikasi, ekstensi Niat, ekstensi UI Niat) untuk menyertakan grup aplikasi yang baru dibuat, dan unduh dan instal.