Bagikan melalui


Handoff di Xamarin.iOS

Artikel ini membahas cara bekerja dengan Handoff di aplikasi Xamarin.iOS untuk mentransfer aktivitas pengguna antar aplikasi yang berjalan di perangkat lain pengguna.

Apple memperkenalkan Handoff di iOS 8 dan OS X Yosemite (10.10) untuk menyediakan mekanisme umum bagi pengguna untuk mentransfer aktivitas yang dimulai di salah satu perangkat mereka, ke perangkat lain yang menjalankan aplikasi yang sama atau aplikasi lain yang mendukung aktivitas yang sama.

Contoh melakukan operasi Handoff

Artikel ini akan melihat sekilas tentang mengaktifkan berbagi aktivitas di aplikasi Xamarin.iOS dan membahas kerangka kerja Handoff secara rinci:

Tentang Handoff

Handoff (juga dikenal sebagai Continuity) diperkenalkan oleh Apple di iOS 8 dan OS X Yosemite (10.10) sebagai cara bagi pengguna untuk memulai aktivitas di salah satu perangkat mereka (baik iOS atau Mac) dan melanjutkan aktivitas yang sama di perangkat lain mereka (seperti yang diidentifikasi oleh Akun iCloud pengguna).

Handoff diperluas di iOS 9 untuk juga mendukung kemampuan Pencarian baru yang ditingkatkan. Untuk informasi selengkapnya, silakan lihat dokumentasi Penyempurnaan Pencarian kami.

Misalnya, pengguna dapat memulai email di i Telepon mereka dan melanjutkan email dengan lancar di Mac mereka, dengan semua informasi pesan yang sama diisi dan kursor di lokasi yang sama dengan yang mereka tinggalkan di iOS.

Salah satu aplikasi Anda yang memiliki ID Tim yang sama memenuhi syarat untuk menggunakan Handoff untuk melanjutkan aktivitas pengguna di seluruh aplikasi selama aplikasi ini dikirimkan melalui iTunes App Store atau ditandatangani oleh pengembang terdaftar (untuk aplikasi Mac, Enterprise, atau Ad Hoc).

Aplikasi apa pun NSDocument atau UIDocument berbasis secara otomatis memiliki handoff yang mendukung bawaan, dan memerlukan perubahan minimal untuk mendukung Handoff.

Melanjutkan Aktivitas Pengguna

Kelas NSUserActivity (bersama dengan beberapa perubahan kecil pada UIKit dan AppKit) memberikan dukungan untuk menentukan aktivitas pengguna yang berpotensi dilanjutkan di perangkat pengguna lain.

Agar aktivitas diteruskan ke perangkat pengguna lain, aktivitas harus dienkapsulasi dalam instans NSUserActivity, ditandai sebagai Aktivitas Saat Ini, apakah itu set payload (data yang digunakan untuk melakukan kelanjutan) dan aktivitas kemudian harus ditransmisikan ke perangkat tersebut.

Handoff meneruskan informasi minimum untuk menentukan aktivitas yang akan dilanjutkan, dengan paket data yang lebih besar disinkronkan melalui iCloud.

Pada perangkat penerima, pengguna akan menerima pemberitahuan bahwa aktivitas tersedia untuk kelanjutan. Jika pengguna memilih untuk melanjutkan aktivitas di perangkat baru, aplikasi yang ditentukan diluncurkan (jika belum berjalan) dan payload dari NSUserActivity digunakan untuk memulai ulang aktivitas.

Gambaran umum Tentang Melanjutkan Aktivitas Pengguna

Hanya aplikasi yang berbagi ID Tim pengembang yang sama dan merespons Jenis Aktivitas tertentu yang memenuhi syarat untuk kelanjutan. Aplikasi menentukan Jenis Aktivitas yang didukungnya di bawah NSUserActivityTypes kunci file Info.plist-nya. Mengingat hal ini, perangkat berkelanjutan memilih aplikasi untuk melakukan kelanjutan berdasarkan ID Tim, Jenis Aktivitas, dan secara opsional Judul Aktivitas.

Aplikasi penerima menggunakan informasi dari NSUserActivityUserInfo kamus untuk mengonfigurasi antarmuka penggunanya dan memulihkan status aktivitas yang diberikan sehingga transisi tampak mulus ke pengguna akhir.

Jika kelanjutan memerlukan lebih banyak informasi daripada yang dapat dikirim secara efisien melalui NSUserActivity, aplikasi melanjutkan dapat mengirim panggilan ke aplikasi asal dan membuat satu atau beberapa aliran untuk mengirimkan data yang diperlukan. Misalnya, jika aktivitas mengedit dokumen teks besar dengan beberapa gambar, streaming akan diperlukan untuk mentransfer informasi yang diperlukan untuk melanjutkan aktivitas pada perangkat penerima. Untuk informasi selengkapnya, lihat bagian Aliran Kelanjutan Pendukung di bawah ini.

Seperti yang dinyatakan di atas, NSDocument atau UIDocument aplikasi berbasis secara otomatis memiliki dukungan Handoff bawaan. Untuk informasi selengkapnya, lihat bagian Handoff Pendukung di Aplikasi Berbasis Dokumen di bawah ini.

Kelas NSUserActivity

Kelas NSUserActivity adalah objek utama dalam pertukaran Handoff dan digunakan untuk merangkum status Aktivitas Pengguna yang tersedia untuk kelanjutan. Aplikasi akan membuat salinan untuk aktivitas apa pun yang NSUserActivity didukungnya dan ingin melanjutkan di perangkat lain. Misalnya, editor dokumen akan membuat aktivitas untuk setiap dokumen yang saat ini terbuka. Namun, hanya dokumen paling depan (ditampilkan di Jendela atau Tab paling depan) yang merupakan Aktivitas Saat Ini dan tersedia untuk kelanjutan.

Instans NSUserActivity diidentifikasi oleh properti dan Title miliknyaActivityType. Properti UserInfo kamus digunakan untuk membawa informasi tentang status aktivitas. Atur properti ke NeedsSavetrue jika Anda ingin malas memuat informasi status melalui NSUserActivitydelegasi . AddUserInfoEntries Gunakan metode untuk menggabungkan data baru dari klien lain ke dalam UserInfo kamus sesuai kebutuhan untuk mempertahankan status aktivitas.

Kelas NSUserActivityDelegate

NSUserActivityDelegate digunakan untuk menjaga informasi dalam NSUserActivitykamus diperbarui UserInfo dan sinkron dengan status aktivitas saat ini. Ketika sistem membutuhkan informasi dalam aktivitas yang akan diperbarui (seperti sebelum kelanjutan pada perangkat lain), sistem memanggil UserActivityWillSave metode delegasi.

Anda harus menerapkan UserActivityWillSave metode dan membuat perubahan apa pun pada NSUserActivity (seperti UserInfo, , Titledll.) untuk memastikan bahwa metode tersebut masih mencerminkan status Aktivitas Saat Ini. Ketika sistem memanggil UserActivityWillSave metode , NeedsSave bendera akan dihapus. Jika Anda mengubah salah satu properti data aktivitas, Anda harus mengaturnya NeedsSavetrue lagi.

Alih-alih menggunakan metode yang UserActivityWillSave disajikan di atas, Anda dapat secara opsional memiliki UIKit atau AppKit mengelola aktivitas pengguna secara otomatis. Untuk melakukan ini, atur properti objek UserActivity responden dan terapkan UpdateUserActivityState metode . Lihat bagian Handoff Pendukung di Responden di bawah ini untuk informasi selengkapnya.

Dukungan App Framework

Baik UIKit (iOS) maupun AppKit (OS X) menyediakan dukungan bawaan untuk Handoff di NSDocumentkelas , Responder (NSResponderUIResponder/), dan .AppDelegate Meskipun setiap OS mengimplementasikan Handoff sedikit berbeda, mekanisme dasar dan APInya sama.

Aktivitas Pengguna di Aplikasi Berbasis Dokumen

Aplikasi iOS dan OS X berbasis dokumen secara otomatis memiliki dukungan Handoff bawaan. Untuk mengaktifkan dukungan ini, Anda harus menambahkan NSUbiquitousDocumentUserActivityType kunci dan nilai untuk setiap CFBundleDocumentTypes entri dalam file Info.plist aplikasi.

Jika kunci ini ada, baik NSDocument dan UIDocument secara otomatis membuat NSUserActivity instans untuk dokumen berbasis iCloud dari jenis yang ditentukan. Anda harus menyediakan jenis aktivitas untuk setiap jenis dokumen yang didukung aplikasi dan beberapa jenis dokumen dapat menggunakan jenis aktivitas yang sama. Baik NSDocument dan UIDocument secara otomatis mengisi UserInfo properti NSUserActivity dengan nilai properti mereka FileURL .

Pada OS X, yang NSUserActivity dikelola oleh AppKit dan terkait dengan responden secara otomatis menjadi Aktivitas Saat Ini ketika jendela dokumen menjadi jendela utama. Di iOS, untuk NSUserActivity objek yang dikelola oleh UIKit, Anda harus memanggil BecomeCurrent metode secara eksplisit atau mengatur properti dokumen UserActivity saat UIViewController aplikasi datang ke latar depan.

AppKit akan secara otomatis memulihkan properti apa pun yang UserActivity dibuat dengan cara ini pada OS X. Ini terjadi jika ContinueUserActivity metode mengembalikan false atau jika tidak di-unimplementasi. Dalam situasi ini, dokumen dibuka dengan OpenDocument metode NSDocumentController dan kemudian akan menerima RestoreUserActivityState panggilan metode.

Lihat bagian Handoff Pendukung di Aplikasi Berbasis Dokumen di bawah ini untuk informasi selengkapnya.

Aktivitas dan Responden Pengguna

Baik UIKit dan AppKit dapat mengelola aktivitas pengguna secara otomatis jika Anda mengaturnya sebagai properti objek UserActivity responden. Jika status telah dimodifikasi, Anda harus mengatur NeedsSave properti responden UserActivity ke true. Sistem akan secara otomatis menyimpan UserActivity ketika diperlukan, setelah memberikan waktu responden untuk memperbarui status dengan memanggil metodenya UpdateUserActivityState .

Jika beberapa responden berbagi satu NSUserActivity instans, mereka menerima UpdateUserActivityState panggilan balik saat sistem memperbarui objek aktivitas pengguna. Responden perlu memanggil AddUserInfoEntries metode untuk memperbarui NSUserActivitykamus untuk UserInfo mencerminkan status aktivitas saat ini pada saat ini. UserInfo Kamus dibersihkan sebelum setiap UpdateUserActivityState panggilan.

Untuk memisahkan diri dari aktivitas, responden dapat mengatur propertinya UserActivity ke null. Saat instans terkelola NSUserActivity kerangka kerja aplikasi tidak memiliki lebih banyak responden atau dokumen terkait, instans tersebut secara otomatis tidak valid.

Lihat bagian Handoff Pendukung di Responden di bawah ini untuk informasi selengkapnya.

Aktivitas Pengguna dan AppDelegate

Aplikasi AppDelegate Anda adalah titik masuk utamanya saat menangani kelanjutan Handoff. Ketika pengguna merespons pemberitahuan Handoff, aplikasi yang sesuai diluncurkan (jika belum berjalan) dan WillContinueUserActivityWithType metode AppDelegate akan dipanggil. Pada titik ini, aplikasi harus memberi tahu pengguna bahwa kelanjutan dimulai.

NSUserActivity Instans dikirimkan ketika AppDelegatemetode dipanggilContinueUserActivity. Pada titik ini, Anda harus mengonfigurasi antarmuka pengguna aplikasi dan melanjutkan aktivitas yang diberikan.

Lihat bagian Menerapkan Handoff di bawah ini untuk informasi selengkapnya.

Mengaktifkan Handoff di Aplikasi Xamarin

Karena persyaratan keamanan yang diberlakukan oleh Handoff, aplikasi Xamarin.iOS yang menggunakan kerangka kerja Handoff harus dikonfigurasi dengan benar di Portal Pengembang Apple dan dalam file proyek Xamarin.iOS.

Lakukan:

  1. Masuk ke Portal Pengembang Apple.

  2. Klik Sertifikat, Pengidentifikasi & Profil.

  3. Jika Anda belum melakukannya, klik Pengidentifikasi dan buat ID untuk aplikasi Anda (misalnya com.company.appname), atau edit ID yang sudah ada.

  4. Pastikan bahwa layanan iCloud telah diperiksa untuk ID yang diberikan:

    Mengaktifkan layanan iCloud untuk ID yang diberikan

  5. Simpan perubahan.

  6. Klik Pengembangan Profil Provisi>dan buat profil provisi pengembangan baru untuk aplikasi Anda:

    Membuat profil provisi pengembangan baru untuk aplikasi

  7. Unduh dan instal profil provisi baru atau gunakan Xcode untuk mengunduh dan menginstal profil.

  8. Edit opsi proyek Xamarin.iOS Anda dan pastikan Anda menggunakan profil provisi yang baru saja Anda buat:

    Pilih profil provisi yang baru saja dibuat

  9. Selanjutnya, edit file Info.plist Anda dan pastikan Anda menggunakan ID Aplikasi yang digunakan untuk membuat profil provisi:

    Atur ID Aplikasi

  10. Gulir ke bagian Mode Latar Belakang dan periksa item berikut:

    Mengaktifkan mode latar belakang yang diperlukan

  11. Simpan perubahan ke semua file.

Dengan pengaturan ini di tempat, aplikasi sekarang siap untuk mengakses API Kerangka Kerja Handoff. Untuk informasi terperinci tentang provisi, silakan lihat Panduan Provisi dan Provisi Aplikasi Perangkat kami.

Menerapkan Handoff

Aktivitas pengguna dapat dilanjutkan di antara aplikasi yang ditandatangani dengan ID Tim pengembang yang sama dan mendukung Jenis Aktivitas yang sama. Menerapkan Handoff di aplikasi Xamarin.iOS mengharuskan Anda membuat Objek Aktivitas Pengguna (baik di atau UIKitAppKit), memperbarui status objek untuk melacak aktivitas, dan melanjutkan aktivitas pada perangkat penerima.

Mengidentifikasi Aktivitas Pengguna

Langkah pertama dalam menerapkan Handoff adalah mengidentifikasi jenis aktivitas pengguna yang didukung aplikasi Anda, dan melihat aktivitas mana yang merupakan kandidat yang baik untuk kelanjutan di perangkat lain. Misalnya: aplikasi ToDo mungkin mendukung pengeditan item sebagai satu Jenis Aktivitas Pengguna, dan mendukung penjelajahan daftar item yang tersedia sebagai item lainnya.

Aplikasi dapat membuat Jenis Aktivitas Pengguna sebanyak yang diperlukan, satu untuk fungsi apa pun yang disediakan aplikasi. Untuk setiap Jenis Aktivitas Pengguna, aplikasi perlu melacak kapan aktivitas jenis dimulai dan berakhir, dan perlu mempertahankan informasi status terbaru untuk melanjutkan tugas tersebut di perangkat lain.

Aktivitas Pengguna dapat dilanjutkan pada aplikasi apa pun yang ditandatangani dengan ID Tim yang sama tanpa pemetaan satu-ke-satu antara aplikasi pengiriman dan penerimaan. Misalnya, aplikasi tertentu dapat membuat empat jenis aktivitas yang berbeda, yang dikonsumsi oleh aplikasi individual yang berbeda di perangkat lain. Ini adalah kemunculan umum antara versi Mac app (yang mungkin memiliki banyak fitur dan fungsi) dan app iOS, di mana setiap app lebih kecil dan berfokus pada tugas tertentu.

Membuat Pengidentifikasi Jenis Aktivitas

Pengidentifikasi Jenis Aktivitas adalah string pendek yang ditambahkan ke NSUserActivityTypes array file Info.plist aplikasi yang digunakan untuk mengidentifikasi Jenis Aktivitas Pengguna tertentu secara unik. Akan ada satu entri dalam array untuk setiap aktivitas yang didukung aplikasi. Apple menyarankan penggunaan notasi bergaya DNS terbalik untuk Pengidentifikasi Jenis Aktivitas untuk menghindari tabrakan. Misalnya: com.company-name.appname.activity untuk aktivitas berbasis aplikasi tertentu atau com.company-name.activity untuk aktivitas yang dapat berjalan di beberapa aplikasi.

Pengidentifikasi Jenis Aktivitas digunakan saat membuat NSUserActivity instans untuk mengidentifikasi jenis aktivitas. Saat aktivitas dilanjutkan di perangkat lain, Jenis Aktivitas (bersama dengan ID Tim aplikasi) menentukan aplikasi mana yang akan diluncurkan untuk melanjutkan aktivitas.

Sebagai contoh, kita akan membuat aplikasi sampel bernama MonkeyBrowser. Aplikasi ini akan menyajikan empat tab, masing-masing dengan URL yang berbeda terbuka dalam tampilan browser web. Pengguna akan dapat melanjutkan tab apa pun di perangkat iOS lain yang menjalankan aplikasi.

Untuk membuat Pengidentifikasi Jenis Aktivitas yang diperlukan untuk mendukung perilaku ini, edit file Info.plist dan beralih ke tampilan Sumber . NSUserActivityTypes Tambahkan kunci dan buat pengidentifikasi berikut:

Kunci NSUserActivityTypes dan pengidentifikasi yang diperlukan di editor plist

Kami membuat empat Pengidentifikasi Jenis Aktivitas baru, satu untuk setiap tab dalam contoh aplikasi MonkeyBrowser . Saat membuat aplikasi Anda sendiri, ganti konten NSUserActivityTypes array dengan Pengidentifikasi Jenis Aktivitas khusus untuk aktivitas yang didukung aplikasi Anda.

Melacak Perubahan Aktivitas Pengguna

Saat membuat instans NSUserActivity baru kelas, kami akan menentukan NSUserActivityDelegate instans untuk melacak perubahan pada status aktivitas. Misalnya, kode berikut dapat digunakan untuk melacak perubahan status:

using System;
using CoreGraphics;
using Foundation;
using UIKit;

namespace MonkeyBrowse
{
    public class UserActivityDelegate : NSUserActivityDelegate
    {
        #region Constructors
        public UserActivityDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void UserActivityReceivedData (NSUserActivity userActivity, NSInputStream inputStream, NSOutputStream outputStream)
        {
            // Log
            Console.WriteLine ("User Activity Received Data: {0}", userActivity.Title);
        }

        public override void UserActivityWasContinued (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity Was Continued: {0}", userActivity.Title);
        }

        public override void UserActivityWillSave (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity will be Saved: {0}", userActivity.Title);
        }
        #endregion
    }
}

Metode UserActivityReceivedData ini dipanggil ketika Aliran Kelanjutan telah menerima data dari perangkat pengirim. Untuk informasi selengkapnya, lihat bagian Aliran Kelanjutan Pendukung di bawah ini.

Metode UserActivityWasContinued ini dipanggil ketika perangkat lain telah mengambil alih aktivitas dari perangkat saat ini. Bergantung pada jenis aktivitas, seperti menambahkan item baru ke daftar ToDo, aplikasi mungkin perlu membatalkan aktivitas pada perangkat pengirim.

Metode UserActivityWillSave ini dipanggil sebelum perubahan pada aktivitas disimpan dan disinkronkan di seluruh perangkat yang tersedia secara lokal. Anda dapat menggunakan metode ini untuk membuat perubahan menit terakhir pada UserInfo properti NSUserActivity instans sebelum dikirim.

Membuat Instans NSUserActivity

Setiap aktivitas yang ingin diberikan aplikasi Anda kemungkinan kelanjutan pada perangkat lain harus dienkapsulasi dalam NSUserActivity instans. Aplikasi ini dapat membuat aktivitas sebanyak yang diperlukan dan sifat aktivitas tersebut tergantung pada fungsionalitas dan fitur aplikasi yang dimaksud. Misalnya, aplikasi email mungkin membuat satu aktivitas untuk membuat pesan baru, dan yang lain untuk membaca pesan.

Untuk contoh aplikasi kami, aplikasi baru NSUserActivity dibuat setiap kali pengguna memasukkan URL baru di salah satu tampilan browser web bertab. Kode berikut menyimpan status tab tertentu:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSUserActivity UserActivity { get; set; }
...

UserActivity = new NSUserActivity (UserActivityTab1);
UserActivity.Title = "Weather Tab";
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Ini membuat baru NSUserActivity menggunakan salah satu Jenis Aktivitas Pengguna yang dibuat di atas dan menyediakan judul yang dapat dibaca manusia untuk Aktivitas. Ini melekat pada instans NSUserActivityDelegate yang dibuat di atas untuk mengawasi perubahan status dan memberi tahu iOS bahwa Aktivitas Pengguna ini adalah Aktivitas Saat Ini.

Mengisi Kamus UserInfo

Seperti yang telah kita lihat di atas, UserInfo properti NSUserActivity kelas adalah pasangan kunci-nilai yang NSDictionary digunakan untuk menentukan status aktivitas tertentu. Nilai yang disimpan UserInfo di harus salah satu jenis berikut: NSArray, , , NSDateNSData, NSNullNSDictionary, , NSNumber, NSSet, NSString, atau NSURL. NSURL nilai data yang menunjuk ke dokumen iCloud akan secara otomatis disesuaikan sehingga menunjuk ke dokumen yang sama di perangkat penerima.

Dalam contoh di atas, kami membuat NSMutableDictionary objek dan mengisinya dengan satu kunci yang menyediakan URL yang saat ini dilihat pengguna pada tab yang diberikan. Metode AddUserInfoEntries Aktivitas Pengguna digunakan untuk memperbarui aktivitas dengan data yang akan digunakan untuk memulihkan aktivitas pada perangkat penerima:

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

Apple menyarankan agar informasi tetap terkirim paling minimum untuk memastikan bahwa aktivitas dikirim tepat waktu ke perangkat penerima. Jika informasi yang lebih besar diperlukan, seperti gambar yang dilampirkan ke dokumen yang perlu diedit perlu dikirim, Anda harus menggunakan Aliran Kelanjutan. Lihat bagian Aliran Kelanjutan Pendukung di bawah ini untuk detail selengkapnya.

Melanjutkan Aktivitas

Handoff akan secara otomatis menginformasikan perangkat iOS dan OS X lokal yang berada di dekat perangkat asal dan masuk ke akun iCloud yang sama, tentang ketersediaan Aktivitas Pengguna yang dapat dilanjutkan. Jika pengguna memilih untuk melanjutkan aktivitas di perangkat baru, sistem akan meluncurkan aplikasi yang sesuai (berdasarkan ID Tim dan Jenis Aktivitas) dan informasi bahwa AppDelegate kelanjutannya perlu terjadi.

Pertama, WillContinueUserActivityWithType metode ini dipanggil sehingga aplikasi dapat memberi tahu pengguna bahwa kelanjutan akan dimulai. Kami menggunakan kode berikut dalam file AppDelegate.cs aplikasi contoh kami untuk menangani kelanjutan mulai:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSString UserActivityTab2 = new NSString ("com.xamarin.monkeybrowser.tab2");
public NSString UserActivityTab3 = new NSString ("com.xamarin.monkeybrowser.tab3");
public NSString UserActivityTab4 = new NSString ("com.xamarin.monkeybrowser.tab4");
...

public FirstViewController Tab1 { get; set; }
public SecondViewController Tab2 { get; set;}
public ThirdViewController Tab3 { get; set; }
public FourthViewController Tab4 { get; set; }
...

public override bool WillContinueUserActivity (UIApplication application, string userActivityType)
{
    // Report Activity
    Console.WriteLine ("Will Continue Activity: {0}", userActivityType);

    // Take action based on the user activity type
    switch (userActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Inform view that it's going to be modified
        Tab1.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Inform view that it's going to be modified
        Tab2.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Inform view that it's going to be modified
        Tab3.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Inform view that it's going to be modified
        Tab4.PreparingToHandoff ();
        break;
    }

    // Inform system we handled this
    return true;
}

Dalam contoh di atas, setiap Pengontrol Tampilan mendaftar dengan AppDelegate dan memiliki metode publik PreparingToHandoff yang menampilkan Indikator Aktivitas dan pesan yang memberi tahu pengguna bahwa aktivitas akan diserahkan ke perangkat saat ini. Contoh:

private void ShowBusy(string reason) {

    // Display reason
    BusyText.Text = reason;

    //Define Animation
    UIView.BeginAnimations("Show");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0.5f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PreparingToHandoff() {
    // Inform caller
    ShowBusy ("Continuing Activity...");
}

Dari ContinueUserActivityAppDelegate akan dipanggil untuk benar-benar melanjutkan aktivitas yang diberikan. Sekali lagi, dari contoh aplikasi kami:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

Metode publik PerformHandoff setiap Pengontrol Tampilan benar-benar melakukan preformasi handoff dan memulihkan aktivitas pada perangkat saat ini. Dalam kasus contoh, ini menampilkan URL yang sama di tab tertentu yang dijelajahi pengguna di perangkat yang berbeda. Contoh:

private void HideBusy() {

    //Define Animation
    UIView.BeginAnimations("Hide");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PerformHandoff(NSUserActivity activity) {

    // Hide busy indicator
    HideBusy ();

    // Extract URL from dictionary
    var url = activity.UserInfo ["Url"].ToString ();

    // Display value
    URL.Text = url;

    // Display the give webpage
    WebView.LoadRequest(new NSUrlRequest(NSUrl.FromString(url)));

    // Save activity
    UserActivity = activity;
    UserActivity.BecomeCurrent ();

}

Metode ini ContinueUserActivity mencakup UIApplicationRestorationHandler yang dapat Anda panggil untuk aktivitas berbasis dokumen atau responden yang dipicu. Anda harus meneruskan NSArray objek atau yang dapat di-restorable ke Handler Pemulihan saat dipanggil. Contohnya:

completionHandler (new NSObject[]{Tab4});

Untuk setiap objek yang diteruskan, metodenya RestoreUserActivityState akan dipanggil. Setiap objek kemudian dapat menggunakan data dalam UserInfo kamus untuk memulihkan statusnya sendiri. Contohnya:

public override void RestoreUserActivityState (NSUserActivity activity)
{
    base.RestoreUserActivityState (activity);

    // Log activity
    Console.WriteLine ("Restoring Activity {0}", activity.Title);
}

Untuk aplikasi berbasis dokumen, jika Anda tidak menerapkan ContinueUserActivity metode atau mengembalikan false, UIKit atau AppKit dapat melanjutkan aktivitas secara otomatis. Lihat bagian Handoff Pendukung di Aplikasi Berbasis Dokumen di bawah ini untuk informasi selengkapnya.

Gagal Melakukan Handoff Dengan Anggun

Karena Handoff bergantung pada transmisi informasi antara koleksi perangkat iOS dan OS X yang terhubung secara longgar, proses transfer terkadang dapat gagal. Anda harus merancang aplikasi Anda untuk menangani kegagalan ini dengan anggun dan memberi tahu pengguna tentang situasi apa pun yang muncul.

Jika terjadi kegagalan, DidFailToContinueUserActivitiy metode AppDelegate akan dipanggil. Contohnya:

public override void DidFailToContinueUserActivitiy (UIApplication application, string userActivityType, NSError error)
{
    // Log information about the failure
    Console.WriteLine ("User Activity {0} failed to continue. Error: {1}", userActivityType, error.LocalizedDescription);
}

Anda harus menggunakan yang disediakan NSError untuk memberikan informasi kepada pengguna tentang kegagalan tersebut.

Handoff Aplikasi Asli ke Browser Web

Pengguna mungkin ingin melanjutkan aktivitas tanpa menginstal aplikasi asli yang sesuai pada perangkat yang diinginkan. Dalam beberapa situasi, antarmuka berbasis web dapat menyediakan fungsionalitas yang diperlukan dan aktivitas masih dapat dilanjutkan. Misalnya, akun email pengguna dapat menyediakan UI dasar web untuk membuat dan membaca pesan.

Jika asal, aplikasi asli mengetahui URL untuk antarmuka web (dan sintaks yang diperlukan untuk mengidentifikasi item yang diberikan dilanjutkan), aplikasi tersebut dapat mengodekan informasi ini di WebpageURL properti NSUserActivity instans. Jika perangkat penerima tidak memiliki aplikasi asli yang sesuai yang diinstal untuk menangani kelanjutan, antarmuka web yang disediakan dapat dipanggil.

Browser Web ke Handoff Aplikasi Asli

Jika pengguna menggunakan antarmuka berbasis web pada perangkat asal, dan aplikasi asli pada perangkat penerima mengklaim bagian WebpageURL domain properti, maka sistem akan menggunakan aplikasi tersebut untuk menangani kelanjutan. Perangkat baru akan menerima NSUserActivity instans yang menandai Jenis Aktivitas sebagai BrowsingWeb dan WebpageURL akan berisi URL yang dikunjungi pengguna, UserInfo kamus akan kosong.

Agar aplikasi dapat berpartisipasi dalam jenis Handoff ini, aplikasi harus mengklaim domain dalam com.apple.developer.associated-domains pemberian hak dengan format <service>:<fully qualified domain name> (misalnya: activity continuation:company.com).

Jika domain yang ditentukan cocok dengan WebpageURL nilai properti, Handoff mengunduh daftar ID aplikasi yang disetujui dari situs web di domain tersebut. Situs web harus menyediakan daftar ID yang disetujui dalam file JSON yang ditandatangani bernama apple-app-site-association (misalnya, https://company.com/apple-app-site-association).

File JSON ini berisi kamus yang menentukan daftar ID aplikasi dalam formulir <team identifier>.<bundle identifier>. Contohnya:

{
    "activitycontinuation": {
        "apps": [    "YWBN8XTPBJ.com.company.FirstApp",
            "YWBN8XTPBJ.com.company.SecondApp" ]
    }
}

Untuk menandatangani file JSON (sehingga memiliki benar Content-Typeapplication/pkcs7-mime), gunakan aplikasi Terminal dan openssl perintah dengan sertifikat dan kunci yang dikeluarkan oleh otoritas sertifikat yang dipercaya oleh iOS (lihat https://support.apple.com/kb/ht5012 untuk daftar). Contohnya:

echo '{"activitycontinuation":{"apps":["YWBN8XTPBJ.com.company.FirstApp",
"YWBN8XTPBJ.com.company.SecondApp"]}}' > json.txt

cat json.txt | openssl smime -sign -inkey company.com.key
-signer company.com.pem
-certfile intermediate.pem
-noattr -nodetach
-outform DER > apple-app-site-association

Perintah mengeluarkan openssl file JSON yang ditandatangani yang Anda tempatkan di situs web Anda di URL apple-app-site-association . Contohnya:

https://example.com/apple-app-site-association.

Aplikasi ini akan menerima aktivitas apa pun yang WebpageURL domainnya com.apple.developer.associated-domains berhak. http Hanya protokol dan https yang didukung, protokol lain akan menimbulkan pengecualian.

Mendukung Handoff di Aplikasi Berbasis Dokumen

Seperti yang dinyatakan di atas, pada iOS dan OS X, aplikasi berbasis dokumen akan secara otomatis mendukung Handoff dokumen berbasis iCloud jika file Info.plist aplikasi berisi CFBundleDocumentTypes kunci NSUbiquitousDocumentUserActivityType. Contohnya:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>NSRTFDPboardType</string>
        . . .
        <key>LSItemContentTypes</key>
        <array>
        <string>com.myCompany.rtfd</string>
        </array>
        . . .
        <key>NSUbiquitousDocumentUserActivityType</key>
        <string>com.myCompany.myEditor.editing</string>
    </dict>
</array>

Dalam contoh ini, string adalah perancang aplikasi reverse-DNS dengan nama aktivitas yang ditambahkan. Jika dimasukkan dengan cara ini, entri jenis aktivitas tidak perlu diulang dalam NSUserActivityTypes array file Info.plist .

Objek Aktivitas Pengguna yang dibuat secara otomatis (tersedia melalui properti dokumen UserActivity ) dapat direferensikan oleh objek lain dalam aplikasi dan digunakan untuk memulihkan status pada kelanjutan. Misalnya, untuk melacak pemilihan item dan posisi dokumen. Anda perlu mengatur properti aktivitas NeedsSave ini ke true setiap kali status berubah dan memperbarui UserInfo kamus dalam UpdateUserActivityState metode .

Properti UserActivity dapat digunakan dari utas apa pun dan sesuai dengan protokol pengamatan nilai kunci (KVO), sehingga dapat digunakan untuk menjaga dokumen tetap sinkron saat bergerak masuk dan keluar dari iCloud. Properti UserActivity akan divalidasi ketika dokumen ditutup.

Untuk informasi selengkapnya, lihat Dokumentasi Dukungan Aktivitas Pengguna Apple di Aplikasi Berbasis Dokumen.

Mendukung Handoff di Responder

Anda dapat mengaitkan responden (diwariskan dari UIResponder iOS atau NSResponder di OS X) ke aktivitas dengan mengatur propertinya UserActivity . Sistem secara otomatis menyimpan properti pada UserActivity waktu yang sesuai, memanggil metode responden UpdateUserActivityState untuk menambahkan data saat ini ke objek Aktivitas Pengguna menggunakan AddUserInfoEntriesFromDictionary metode .

Mendukung Aliran Kelanjutan

Mungkin situasi di mana jumlah informasi yang diperlukan untuk melanjutkan aktivitas tidak dapat ditransfer secara efisien oleh payload Handoff awal. Dalam situasi ini, aplikasi penerima dapat membuat satu atau beberapa streaming antara dirinya sendiri dan aplikasi asal untuk mentransfer data.

Aplikasi asal akan mengatur SupportsContinuationStreams properti NSUserActivity instans ke true. Contohnya:

// Create a new user Activity to support this tab
UserActivity = new NSUserActivity (ThisApp.UserActivityTab1){
    Title = "Weather Tab",
    SupportsContinuationStreams = true
};
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Aplikasi penerima kemudian dapat memanggil GetContinuationStreams metode NSUserActivity di dalamnya AppDelegate untuk membuat aliran. Contohnya:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

Pada perangkat asal, Delegasi Aktivitas Pengguna menerima aliran dengan memanggil metodenya DidReceiveInputStream untuk menyediakan data yang diminta untuk melanjutkan aktivitas pengguna pada perangkat melanjutkan.

Anda akan menggunakan NSInputStream untuk menyediakan akses baca-saja untuk mengalirkan data, dan menyediakan NSOutputStream akses tulis-saja. Aliran harus digunakan dengan cara permintaan dan respons, di mana aplikasi penerima meminta lebih banyak data dan aplikasi asal menyediakannya. Sehingga, data yang ditulis ke aliran output pada perangkat asal dibaca dari aliran input pada perangkat yang berkelanjutan, dan sebaliknya.

Bahkan dalam situasi di mana Aliran Kelanjutan diperlukan, harus ada komunikasi bolak-balik minimal antara kedua aplikasi.

Untuk informasi selengkapnya, lihat Dokumentasi Aliran Menggunakan Kelanjutan Apple.

Praktik Terbaik Handoff

Keberhasilan implementasi kelanjutan Aktivitas Pengguna yang lancar melalui Handoff memerlukan desain yang cermat karena semua berbagai komponen yang terlibat. Apple menyarankan untuk mengadopsi praktik terbaik berikut untuk app yang diaktifkan Handoff Anda:

  • Rancang Aktivitas Pengguna Anda untuk memerlukan payload sekecil mungkin untuk menghubungkan status aktivitas untuk dilanjutkan. Semakin besar payload, semakin lama waktu yang dibutuhkan untuk memulai.
  • Jika Anda harus mentransfer data dalam jumlah besar untuk keberhasilan kelanjutan, pertimbangkan biaya yang terlibat dalam konfigurasi dan overhead jaringan.
  • Umum bagi aplikasi Mac besar untuk membuat Aktivitas Pengguna yang ditangani oleh beberapa app khusus tugas yang lebih kecil di perangkat iOS. Versi aplikasi dan OS yang berbeda harus dirancang untuk bekerja sama dengan baik atau gagal dengan baik.
  • Saat menentukan Jenis Aktivitas Anda, gunakan notasi reverse-DNS untuk menghindari tabrakan. Jika aktivitas khusus untuk aplikasi tertentu, namanya harus disertakan dalam definisi jenis (misalnya com.myCompany.myEditor.editing). Jika aktivitas dapat berfungsi di beberapa aplikasi, letakkan nama aplikasi dari definisi (misalnya com.myCompany.editing).
  • Jika aplikasi Anda perlu memperbarui status Aktivitas Pengguna (NSUserActivity) atur NeedsSave properti ke true. Pada waktu yang tepat, Handoff akan memanggil metode delegasi UserActivityWillSave sehingga Anda dapat memperbarui UserInfo kamus sesuai kebutuhan.
  • Karena proses Handoff mungkin tidak langsung diinisialisasi pada perangkat penerima, Anda harus menerapkan AppDelegate's WillContinueUserActivity dan memberi tahu pengguna bahwa kelanjutan akan dimulai.

Contoh Aplikasi Handoff

Contoh penggunaan Handoff di aplikasi Xamarin.iOS adalah aplikasi sampel MonkeyBrowser . Aplikasi ini memiliki empat tab yang dapat digunakan pengguna untuk menelusuri web, masing-masing dengan jenis aktivitas tertentu: Cuaca, Favorit, Coffee Break, dan Work.

Pada tab apa pun, saat pengguna memasukkan URL baru dan mengetuk tombol Buka , yang baru NSUserActivity dibuat untuk tab tersebut yang berisi URL yang saat ini dijelajahi pengguna:

Contoh Aplikasi Handoff

Jika perangkat pengguna lain menginstal aplikasi MonkeyBrowser , masuk ke iCloud menggunakan akun pengguna yang sama, berada di jaringan yang sama dan berdekatan dengan perangkat di atas, Aktivitas Handoff akan ditampilkan di layar beranda (di sudut kiri bawah):

Aktivitas Handoff ditampilkan di layar beranda di sudut kiri bawah

Jika pengguna menyeret ke atas pada ikon Handoff, aplikasi akan diluncurkan dan Aktivitas Pengguna yang ditentukan di akan dilanjutkan NSUserActivity pada perangkat baru:

Aktivitas Pengguna berlanjut pada perangkat baru

Ketika Aktivitas Pengguna berhasil dikirim ke perangkat Apple lain, perangkat NSUserActivity yang mengirim akan menerima panggilan ke UserActivityWasContinued metode untuk NSUserActivityDelegate memberi tahunya bahwa Aktivitas Pengguna telah berhasil ditransfer ke perangkat lain.

Ringkasan

Artikel ini telah memberikan pengenalan kerangka kerja Handoff yang digunakan untuk melanjutkan Aktivitas Pengguna di antara beberapa perangkat Apple pengguna. Selanjutnya, ini menunjukkan cara mengaktifkan dan mengimplementasikan Handoff di aplikasi Xamarin.iOS. Akhirnya, ini membahas berbagai jenis kelanjutan Handoff yang tersedia dan praktik terbaik Handoff.