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.
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.
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 NSUserActivity
UserInfo
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 NeedsSave
true
jika Anda ingin malas memuat informasi status melalui NSUserActivity
delegasi . 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 NSUserActivity
kamus 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
, , Title
dll.) 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 NeedsSave
true
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 NSDocument
kelas , Responder (NSResponder
UIResponder
/), 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 NSUserActivity
kamus 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 AppDelegate
metode 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:
Masuk ke Portal Pengembang Apple.
Klik Sertifikat, Pengidentifikasi & Profil.
Jika Anda belum melakukannya, klik Pengidentifikasi dan buat ID untuk aplikasi Anda (misalnya
com.company.appname
), atau edit ID yang sudah ada.Pastikan bahwa layanan iCloud telah diperiksa untuk ID yang diberikan:
Simpan perubahan.
Klik Pengembangan Profil Provisi>dan buat profil provisi pengembangan baru untuk aplikasi Anda:
Unduh dan instal profil provisi baru atau gunakan Xcode untuk mengunduh dan menginstal profil.
Edit opsi proyek Xamarin.iOS Anda dan pastikan Anda menggunakan profil provisi yang baru saja Anda buat:
Selanjutnya, edit file Info.plist Anda dan pastikan Anda menggunakan ID Aplikasi yang digunakan untuk membuat profil provisi:
Gulir ke bagian Mode Latar Belakang dan periksa item berikut:
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 UIKit
AppKit
), 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:
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
, , , NSDate
NSData
, NSNull
NSDictionary
, , 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 ContinueUserActivity
AppDelegate
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-Type
application/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 (misalnyacom.myCompany.editing
). - Jika aplikasi Anda perlu memperbarui status Aktivitas Pengguna (
NSUserActivity
) aturNeedsSave
properti ketrue
. Pada waktu yang tepat, Handoff akan memanggil metode delegasiUserActivityWillSave
sehingga Anda dapat memperbaruiUserInfo
kamus sesuai kebutuhan. - Karena proses Handoff mungkin tidak langsung diinisialisasi pada perangkat penerima, Anda harus menerapkan
AppDelegate
'sWillContinueUserActivity
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:
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):
Jika pengguna menyeret ke atas pada ikon Handoff, aplikasi akan diluncurkan dan Aktivitas Pengguna yang ditentukan di akan dilanjutkan NSUserActivity
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.