Xamarin.iOS'ta İlerler
Bu makale, kullanıcının diğer cihazlarında çalışan uygulamalar arasında kullanıcı etkinliklerini aktarmaya yönelik bir Xamarin.iOS uygulamasında İlerler ile çalışmayı kapsar.
Apple, iOS 8 ve OS X Yosemite'da (10.10) kullanıcıya cihazlarından biri üzerinde başlayan etkinlikleri, aynı uygulamayı çalıştıran başka bir cihaza veya aynı etkinliği destekleyen başka bir uygulamaya aktarmaya yönelik ortak bir mekanizma sağlamak için iletir.
Bu makale, Xamarin.iOS uygulamasında etkinlik paylaşımını etkinleştirmeye hızlı bir bakış sağlar ve Handoff çerçevesini ayrıntılı olarak ele alır:
Teslim Hakkında
İlerlet (Süreklilik olarak da bilinir) Apple tarafından iOS 8 ve OS X Yosemite'de (10.10) kullanıcıya cihazlarından (iOS veya Mac) bir etkinlik başlatmanın ve bu etkinliğin başka bir cihaz üzerinde (kullanıcının iCloud Hesabı tarafından tanımlandı) devam ettiği bir yol olarak tanıtıldı.
İlerlerken iOS 9'da yeni, gelişmiş Arama özelliklerini de destekleyecek şekilde genişletildi. Daha fazla bilgi için lütfen Arama Geliştirmeleri belgelerimize bakın.
Örneğin, kullanıcı e-postayı kendi iPhone mac'inde sorunsuz bir şekilde devam eder. Tüm ileti bilgileri ve imleç, iOS'ta bıraktığı konumda doldurulur.
Aynı Takım Kimliğini kullanan tüm uygulamalarınız, iTunes App Store aracılığıyla teslim edilen veya kayıtlı bir geliştirici tarafından (Mac, Enterprise veya Geçici uygulamalar için) imzalanmış olduğu sürece, uygulamalar arasında kullanıcı etkinliklerine devam etmek için İlerleyebilirsiniz.
Herhangi bir veya tabanlı uygulama otomatik olarak Yerleşik Teslim desteğine sahip olur ve Teslimi desteklemek NSDocument için en az değişiklik UIDocument gerektirir.
Devam Eden Kullanıcı Etkinlikleri
sınıfı (ve üzerinde yapılan bazı küçük değişikliklerle birlikte) kullanıcının başka bir kullanıcının cihazlarında devam etmek için potansiyel olarak devam eden NSUserActivityUIKit etkinliğini tanımlama desteği AppKit sağlar.
Bir etkinliğin başka bir kullanıcının cihazına geçirilemesi için, Geçerli Etkinlik olarak işaretlenmiş bir örnekte kapsüllenmeli, yük kümesine sahip olmalı (devamlılığı gerçekleştirmek için kullanılan veriler) ve etkinliğin o cihaza ilet olması NSUserActivity gerekir. NSUserActivity
İlerlerken, iCloud üzerinden eşitlenen daha büyük veri paketleriyle devam edecek etkinliği tanımlamak için en düşük düzeydeki bilgileri iletir.
Alıcı cihazda, kullanıcı bir etkinliğin devamlılık için kullanılabilir olduğunu bildirecek. Kullanıcı yeni cihazda etkin çalışmaya devam etmek seçerse, belirtilen uygulama başlatılır (zaten çalışmıyorsa) ve 'den gelen yük etkinliği yeniden NSUserActivity başlatmak için kullanılır.
Yalnızca aynı geliştirici Takım Kimliği'ne sahip olan ve verilen etkinlik türüne yanıt veren uygulamalar devamlılık için uygundur. Uygulama, desteklediği Etkinlik Türlerini NSUserActivityTypesNSUserActivityTypes dosyasının anahtarı altında tanımlar. Bu durumda, devam eden bir cihaz Takım Kimliğine, Etkinlik Türüne ve isteğe bağlı olarak Etkinlik Başlığı'ne göre devamlılığı gerçekleştirmek için uygulamayı seçer.
Alıcı uygulama, kullanıcı arabirimini yapılandırmak ve belirli bir etkinliğin durumunu geri yüklemek için 'nin sözlüğünden bilgileri kullanır, böylece geçiş son kullanıcıya sorunsuz NSUserActivityUserInfo görünür.
Devamlılık bir aracılığıyla verimli bir şekilde gönderilene kadar daha fazla bilgi gerektiriyorsa, devam eden uygulama kaynak uygulamaya bir çağrı gönderebilir ve gerekli verileri iletmek için bir veya daha fazla NSUserActivity akış kurabilirsiniz. Örneğin, etkinlik birden çok görüntü içeren büyük bir metin belgesini düzenliyorsa, alıcı cihazda etkinliği devam etmek için gereken bilgileri aktaran akış gerekir. Daha fazla bilgi için aşağıdaki Destek Devamlılığı Akışlar bölümüne bakın.
Yukarıda belirtildiği NSDocument gibi, veya UIDocument tabanlı uygulamalar otomatik olarak Yerleşik Teslim Desteğine sahip olur. Daha fazla bilgi için aşağıdaki Uygulamalarda destek Document-Based bölümüne bakın.
NSUserActivity Sınıfı
sınıfı, bir Teslim değişiminde birincil nesnedir ve devamlılık için kullanılabilen bir Kullanıcı Etkinliğinin durumunu NSUserActivity kapsüllemek için kullanılır. Bir uygulama, desteklediği ve başka bir cihazda devam etmek istediği herhangi bir NSUserActivity etkinlik için kopyasının örneğini verir. Örneğin, belge düzenleyicisi şu anda açık olan her belge için bir etkinlik oluşturabilir. Ancak, yalnızca en öndeki belge (en öndeki Pencerede veya Sekmede görüntülenir) Geçerli Etkinlik'tir ve devamlılık için kullanılabilir.
bir örneği NSUserActivity hem hem de özellikleri tarafından ActivityTypeTitle tanımlanır. UserInfoSözlük özelliği, etkinliğin durumu hakkında bilgi taşımak için kullanılır. Durum NeedsSavetrue bilgilerini'nin temsilcisi aracılığıyla yavaş yüklemek için özelliğini olarak NSUserActivity ayarlayın. Etkinliğin durumunu korumak için diğer istemcilerden gelen yeni verileri sözlükte birleştirmek AddUserInfoEntries için yöntemini UserInfo kullanın.
NSUserActivityDelegate Sınıfı
, bir 'nin sözlüğünde güncel ve etkinliğin geçerli durumuyla NSUserActivityDelegateNSUserActivityUserInfo eşitlenen bilgileri tutmak için kullanılır. Sistem, etkinlikte yer alan bilgilerin güncelleştirilmeden önce (örneğin başka bir cihazda devamlılık öncesinde) gerektirdiğinde UserActivityWillSave temsilcinin yöntemini çağıran bir yöntemdir.
yöntemini uygulamanız ve UserActivityWillSave üzerinde herhangi bir değişiklik NSUserActivity (örneğin, , UserInfoTitle vb.) hala Geçerli Etkinliğin durumunu yansıtıyor olduğundan emin olmak için. Sistem yöntemini UserActivityWillSave çağırsa NeedsSave bayrağı temiz olur. Etkinliğin veri özelliklerinin herhangi birini değiştirirsanız, olarak yeniden ayarlamanız NeedsSavetrue gerekir.
Yukarıda sunulan yöntemi UserActivityWillSave kullanmak yerine isteğe bağlı olarak kullanıcı etkinliğini otomatik UIKit olarak kullanabilir veya AppKit yönetebilirsiniz. Bunu yapmak için yanıtlayan nesnesinin özelliğini UserActivity ayarlayın ve yöntemini UpdateUserActivityState kullanın. Daha fazla bilgi için aşağıdaki Yanıtlayanlar'da Destek Ileticiler bölümüne bakın.
App Framework Desteği
Hem UIKit (iOS) AppKit hem de (OS X), , Yanıtlayan ( ) ve sınıflarında Teslim Için yerleşik destek NSDocumentUIResponder/NSResponderAppDelegate sağlar. Her işletim sistemi Teslimi biraz farklı bir şekilde uygulaysa da, temel mekanizma ve API'ler aynıdır.
Document-Based Apps'te Kullanıcı Etkinlikleri
Belge tabanlı iOS ve OS X uygulamaları otomatik olarak yerleşik Teslim desteğine sahip olur. Bu desteği etkinleştirmek için, uygulamanın NSUbiquitousDocumentUserActivityTypeCFBundleDocumentTypesNSUbiquitousDocumentUserActivityType dosyasındaki her giriş için bir anahtar ve değer eklemeniz gerekir.
Bu anahtar varsa, hem hem NSDocument de UIDocument belirtilen türde NSUserActivity iCloud tabanlı belgeler için örnekleri otomatik olarak oluşturun. Uygulamanın desteklediği her belge türü için bir etkinlik türü sağlamanız gerekir ve birden çok belge türü aynı etkinlik türünü kullanabilir. hem NSDocument hem de özelliğini kendi UIDocumentUserInfoNSUserActivity özelliğinin FileURL değeriyle otomatik olarak doldurmak.
OS X'de tarafından yönetilen ve yanıtlayanlarla ilişkilendirilmiş olan belge penceresi ana pencere haline geldiğinde otomatik NSUserActivity olarak Geçerli Etkinlik haline AppKit gelir. iOS'ta, tarafından yönetilen nesneler için yöntemini açıkça çağırmalı veya uygulama ön plana geldiğinde belgenin özelliğinin bir üzerinde ayarlanmış NSUserActivityUIKit olması BecomeCurrentUserActivityUIViewController gerekir.
AppKit , UserActivity OS X'te bu şekilde oluşturulan herhangi bir özelliği otomatik olarak geri yükleyecektir. Yöntem döndürse ContinueUserActivity veya false uygulanmamışsa bu durum oluşur. Bu durumda belge, yöntemiyle OpenDocument açılır NSDocumentController ve ardından bir yöntem çağrısı RestoreUserActivityState alır.
Daha fazla bilgi için aşağıdaki Document-Based Apps'te Destek İletişimi bölümüne bakın.
Kullanıcı Etkinlikleri ve Yanıtlayanlar
Hem UIKit hem AppKit de, yanıtlayan nesnesinin özelliği olarak ayarlayan bir kullanıcı etkinliğini otomatik olarak UserActivity yönetebilir. Durum değiştirildi ise yanıtlayanların özelliğini olarak NeedsSaveUserActivitytrue ayarlayabilirsiniz. Sistem, gerektiğinde yöntemini çağırarak yanıtlayana durumu güncelleştirmek için zaman UserActivity verdikten sonra otomatik olarak UpdateUserActivityState kaydedecek.
Birden çok yanıtlayan tek bir örneği paylaşıyorsa, sistem kullanıcı etkinliği nesnesini güncelleştirmesi NSUserActivity için bir geri çağırma UpdateUserActivityState alır. Yanıtlayan, 'nin sözlüğü bu noktada geçerli etkinlik durumunu yansıtacak AddUserInfoEntries şekilde güncelleştirmek için yöntemini NSUserActivityUserInfo çağıracak. Sözlüğü UserInfo her çağrıdan önce UpdateUserActivityState temizlir.
Bir yanıtlayan, kendisini bir etkinlikle olan ilişkilendirilmemiş olarak ayarlamak için özelliğini UserActivity olarak null ayarlayın. Uygulama çerçevesi yönetilen NSUserActivity örneğinde artık ilişkili yanıtlayan veya belge yoksa otomatik olarak geçersiz kılınmış olur.
Daha fazla bilgi için aşağıdaki Yanıtlayanlar'da Destek Ileticiler bölümüne bakın.
Kullanıcı Etkinlikleri ve AppDelegate
Bir Teslimi AppDelegate devamlılığı işlemede, uygulamanın birincil giriş noktasıdır. Kullanıcı bir Teslim bildirimine yanıt verdi mi, uygun uygulama (zaten çalışmıyorsa) başlatıldı ve yöntemi WillContinueUserActivityWithTypeAppDelegate çağrılır. Bu noktada, uygulamanın kullanıcıya devamlılık başlat gerektiğini bildirmesi gerekir.
NSUserActivityörneği, yöntemi AppDelegateContinueUserActivity çağrıldıkta teslim edilir. Bu noktada, uygulamanın kullanıcı arabirimini yapılandırmalı ve verilen etkinliği devam edin.
Daha fazla bilgi için aşağıdaki Teslimi Uygulama bölümüne bakın.
Xamarin Uygulamasında Teslimi Etkinleştirme
Handoff tarafından dayatılan güvenlik gereksinimleri nedeniyle, Handoff çerçevesini kullanan bir Xamarin.iOS uygulamasının hem Apple Geliştirici Portalı'de hem de Xamarin.iOS proje dosyasında düzgün yapılandırılması gerekir.
Şunları yapın:
AppleGeliştirici Portalı.
Sertifikalar, Tanımlayıcılar Profilleri'ne tıklayın.
Henüz bunu yapmadıysanız Tanımlayıcılar'a tıklayın ve uygulama için bir kimlik oluşturun (ör. ), yoksa mevcut kimliğinizi düzenleyin.
iCloud hizmetinin verilen kimlik için denetlen olduğundan emin olun:
Yaptığınız değişiklikleri kaydedin.
Sağlama Profilleri Geliştirme'yetıklayın ve uygulama için yeni bir geliştirme sağlama profili oluşturun:
Yeni sağlama profilini indirip yükleyin veya profili indirip yüklemek için Xcode kullanın.
Xamarin.iOS proje seçeneklerinizi düzenleyin ve yeni oluşturduğunuz sağlama profilini kullanmaya devam etmek için:
Ardından Info.plist dosyanızı düzenleyin ve sağlama profilini oluşturmak için kullanılan Uygulama Kimliğini kullanmaya devam edin:
Arka Plan Modları bölümüne kaydırın ve aşağıdaki öğeleri kontrol edin:
Değişiklikleri tüm dosyalara kaydedin.
Bu ayarlar hazır olduğunda, uygulama artık Handoff Framework API'lerine erişmeye hazırdır. Sağlama hakkında ayrıntılı bilgi için lütfen Uygulamalarınızı Sağlama ve Cihaz Sağlama kılavuzlarımıza bakın.
Teslimi Uygulama
Kullanıcı etkinlikleri, aynı geliştirici Takım Kimliği ile imzalanan ve aynı Etkinlik Türünü destekleyen uygulamalar arasında devam eder. Xamarin.iOS uygulamasında İlerlerken Bir Kullanıcı Etkinliği Nesnesi (veya içinde) oluşturmanızı, etkinliği izlemek için nesnenin durumunu güncelleştirmenizi ve alıcı cihazda etkinliği devam UIKitAppKit ettirin.
Kullanıcı Etkinliklerini Tanımlama
İlerlerken ilk adım, uygulamanın desteklediği kullanıcı etkinliklerinin türlerini belirlemek ve bu etkinliklerden hangisinin başka bir cihazda devamlılık için uygun adaylar olduğunu görmektir. Örneğin: Bir ToDo uygulaması, öğeleri bir Kullanıcı Etkinliği Türü olarak düzenlemeyi vekullanılabilir öğeler listesine başka bir öğe olarak göz atma desteğine sahip olabilir.
Bir uygulama, gereken sayıda Kullanıcı Etkinliği Türü (uygulamanın sağladığı herhangi bir işlev için) oluşturabilir. Her Kullanıcı Etkinliği Türü için uygulamanın, türünde bir etkinliğin ne zaman başladığını ve sona erdiğinde izlemesi ve bu görevi başka bir cihazda sürdürmek için güncel durum bilgilerini sürdürmesi gerekir.
Kullanıcı Etkinlikleri, gönderen ve alan uygulamalar arasında bire bir eşleme olmadan aynı Takım Kimliği ile imzalanmış herhangi bir uygulamada devam eder. Örneğin, bir uygulama başka bir cihaz üzerinde farklı, tek tek uygulamalar tarafından tüketilen dört farklı etkinlik türü oluşturabilir. Bu, uygulamanın Mac sürümü (birçok özellik ve işleve sahip olabilir) ile her uygulamanın daha küçük olduğu ve belirli bir göreve odaklanan iOS uygulamaları arasında sık karşılaşılan bir durumdur.
Etkinlik Türü Tanımlayıcıları Oluşturma
Etkinlik Türü Tanımlayıcısı, uygulamanın Info.plist dosyasının dizisine eklenen ve verilen Kullanıcı Etkinliği Türünü benzersiz olarak tanımlamak için kullanılan kısa bir dizedir. Uygulamanın desteklediği her etkinlik için dizide bir giriş olacak. Apple, çakışmaları önlemek için Etkinlik Türü Tanımlayıcısı için ters DNS stili bir nota kullanmayı önerir. Örneğin: com.company-name.appname.activity Belirli uygulama tabanlı etkinlikler veya com.company-name.activity birden çok uygulamada çalıştırabilirsiniz etkinlikler için.
Etkinlik Türü Tanımlayıcısı, etkinlik türünü tanımlamak NSUserActivity için bir örnek oluşturulurken kullanılır. Bir etkinlik başka bir cihazda devam ettiği zaman, etkinlik türü (uygulamanın Takım Kimliği ile birlikte) etkinliğin devam etmek için hangi uygulamanın başlat lansman edeceğini belirler.
Örnek olarak, MaymunBrowser adlı bir örnek uygulama oluşturacağız ( buradanindirin). Bu uygulama, her biri bir web tarayıcısı görünümünde açık olan farklı bir URL'ye sahip dört sekme gösterir. Kullanıcı, uygulamayı çalıştıran farklı bir iOS cihazında herhangi bir sekmeye devam eder.
Bu davranışı desteklemek için gerekli Etkinlik Türü Tanımlayıcılarını oluşturmak için Info.plist dosyasını düzenleyin ve Kaynak görünümüne geçiş oluşturun. Bir NSUserActivityTypes anahtar ekleyin ve aşağıdaki tanımlayıcıları oluşturun:
Örnek MaymunBrowser uygulamasındaki sekmelerin her biri için bir tane olmak kaydıyla dört yeni Etkinlik Türü Tanımlayıcısı oluşturduk. Kendi uygulamalarınızı oluştururken, dizinin içeriğini, uygulamanın desteklediği etkinliklere NSUserActivityTypes özgü Etkinlik Türü Tanımlayıcıları ile değiştirin.
Kullanıcı Etkinliği Değişikliklerini İzleme
sınıfının yeni bir örneğini NSUserActivity oluşturmamız, etkinliğin NSUserActivityDelegate durumuna yapılan değişiklikleri izlemek için bir örnek belirtiriz. Örneğin, durum değişikliklerini izlemek için aşağıdaki kod kullanılabilir:
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
}
}
Bir UserActivityReceivedData Devamlılık Akışı gönderen cihazdan veri aldığı zaman yöntemi çağrılır. Daha fazla bilgi için aşağıdaki Destek Devamlılığı Akışlar bölümüne bakın.
Yöntem, UserActivityWasContinued başka bir cihaz geçerli cihazdan bir etkinliği ele aldı olduğunda çağrılır. ToDo listesine yeni öğe ekleme gibi etkinlik türüne bağlı olarak, uygulamanın gönderen cihazda etkinliği durdurması gerekir.
Etkinlikte UserActivityWillSave yapılan herhangi bir değişiklik yerel olarak kullanılabilir cihazlar arasında kaydedilemeden ve eşitmeden önce yöntemi çağrılır. Gönderilmeden önce örneğin özelliğinde son dakika UserInfo değişiklikleri yapmak için bu yöntemi NSUserActivity kullanabilirsiniz.
NSUserActivity Örneği Oluşturma
Uygulamanıza başka bir cihazda devam etme olanağı sağlamak istediği her etkinlik bir örnekte NSUserActivity kapsüllemeli. Uygulama gereken sayıda etkinlik oluşturabilir ve bu etkinliklerin doğası söz konusu uygulamanın işlevselliğine ve özelliklerine bağlıdır. Örneğin, bir e-posta uygulaması yeni ileti oluşturmak için bir etkinlik ve bir iletiyi okumak için başka bir etkinlik oluşturabilir.
Örnek uygulamamızda, kullanıcı sekmeli web tarayıcısı görünümünden bir tanesinde yeni bir URL'ye her NSUserActivity girişte yeni bir oluşturulur. Aşağıdaki kod, verilen sekmenin durumunu depolar:
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 ();
Yukarıda oluşturulan Kullanıcı Etkinliği Türünden birini kullanarak yeni bir oluşturur ve Etkinlik için okunabilir NSUserActivity bir başlık sağlar. Durum değişikliklerini izlemek için yukarıda oluşturulan örneğine ek olarak iOS'a bu NSUserActivityDelegate Kullanıcı Etkinliğinin Geçerli Etkinlik olduğunu bildirmektedir.
UserInfo Sözlüğünü Doldurmak
Yukarıda da görülen gibi sınıfının UserInfo özelliği, belirli bir etkinliğin durumunu tanımlamak NSUserActivity için kullanılan NSDictionary anahtar-değer çiftleridir. içinde depolanan değerler UserInfo şu türlerden biri olmalı: NSArray , , , , , , , veya NSDataNSDateNSDictionaryNSNullNSNumberNSSetNSStringNSURL . NSURL iCloud belgelerini işaret alan veri değerleri, alıcı cihazda aynı belgeleri işaret etmek için otomatik olarak ayarlanır.
Yukarıdaki örnekte, bir nesnesi oluşturduk ve kullanıcının o anda belirtilen sekmede görüntülemekte olduğu URL'yi sağlayan tek NSMutableDictionary bir anahtarla doldurarak. Kullanıcı Etkinliğinin yöntemi, etkinliği alıcı cihaza geri yüklemek için kullanılacak verilerle AddUserInfoEntries güncelleştirmek için kullanıldı:
// 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, etkinliğin alıcı cihaza zamanında gönderildiğini sağlamak için en düşük en düşük değere gönderilen bilgileri tutmanızı önerir. Bir belgeye eklenmiş bir görüntünün gönderilmiş olması gibi daha büyük bilgiler gerekirse Devamlılık Ve Kullanım Akışlar. Daha fazla ayrıntı için Akışlar Destek Devamlılığı Bilgileri bölümüne bakın.
Etkinliği Devam Ettir
İlerler, yerel iOS ve OS X cihazlarını, kaynak cihaza fiziksel olarak yakın olan ve sürekli Kullanıcı Etkinliklerinin kullanılabilirliği konusunda otomatik olarak aynı iCloud hesabında oturum açın. Kullanıcı yeni bir cihazda bir etkinliğin devam etmesini seçerse, sistem uygun uygulamayı (Takım Kimliği ve Etkinlik Türüne göre) başlatacak ve devamlılığı olması gereken AppDelegate bilgileri verir.
İlk WillContinueUserActivityWithType olarak, uygulamanın devamının başlamak üzere olduğunu kullanıcıya bildirmesi için yöntemi çağrılır. Bir devamlılık başlatmayı işlemek için örnek uygulamamızın AppDelegate.cs dosyasında aşağıdaki kodu kullanıruz:
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;
}
Yukarıdaki örnekte, her Görünüm Denetleyicisi ile kaydolr ve bir Etkinlik Göstergesi ve kullanıcıya etkinliğin geçerli cihaza teslim etmek üzere olduğunu haber alan bir ileti görüntüleyen genel AppDelegatePreparingToHandoff bir yönteme sahiptir. Örnek:
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...");
}
, ContinueUserActivity verilen etkinliği gerçekten devam etmek için AppDelegate çağrılır. Yine örnek uygulamamızda:
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;
}
Her Görünüm PerformHandoff Denetleyicisinin genel yöntemi aslında teslimi önceden hazırlar ve etkinliği geçerli cihaza geri yüklemektedir. Örnekte, belirli bir sekmede kullanıcının farklı bir cihaza göz atarak aynı URL'yi görüntüler. Örnek:
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 ();
}
yöntemi, ContinueUserActivity belge UIApplicationRestorationHandler veya yanıtlayan tabanlı etkinlik devam ediyor için çağırabilirsiniz bir içerir. Çağrıldınız zaman Geri Yükleme NSArray İşleyicisi'ne veya geri yüklenebilir nesnelere geçmelisiniz. Örnek:
completionHandler (new NSObject[]{Tab4});
Geçirilen her nesne için RestoreUserActivityState yöntemi çağrılır. Her nesne daha sonra kendi durumunu geri UserInfo yüklemek için sözlükte verileri kullanabilir. Örnek:
public override void RestoreUserActivityState (NSUserActivity activity)
{
base.RestoreUserActivityState (activity);
// Log activity
Console.WriteLine ("Restoring Activity {0}", activity.Title);
}
Belge tabanlı uygulamalar için, yöntemini uygulamazsanız veya döndürürse ya ContinueUserActivity da etkinliği otomatik olarak falseUIKitAppKit sürdürebilirsiniz. Daha fazla bilgi için aşağıdaki Document-Based Apps'te Destek İletişimi bölümüne bakın.
Başarılı Bir Şekilde Teslimi Başarısız Oluyor
İletim, gevşek bağlı bir koleksiyon iOS ve OS X cihazları arasında bilgi iletimine bağlı olduğundan, aktarım işlemi bazen başarısız olabilir. Bu hataların üstesinden gelebilir ve kullanıcıya ortaya çıkabilecek durumlarla ilgili bilgi edinebilir.
Bir hata durumunda yöntemi DidFailToContinueUserActivitiyAppDelegate çağrılır. Örnek:
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);
}
Kullanıcıya hata hakkında NSError bilgi sağlamak için sağlanan 'i kullan gerekir.
Yerel Uygulamadan Web Tarayıcısına Teslim
Kullanıcı, istenen cihaza uygun bir yerel uygulama yüklemeden bir etkinliği devam etmek istiyor olabilir. Bazı durumlarda, web tabanlı bir arabirim gerekli işlevselliği sağlar ve etkinlik devam eder. Örneğin, kullanıcının e-posta hesabı ileti oluşturmak ve okumak için bir web tabanlı kullanıcı arabirimi sağlar.
Kaynak, yerel uygulama web arabiriminin URL'sini biliyorsa (ve devam eden öğeyi tanımlamak için gerekli söz dizimi) bu bilgileri örneğin WebpageURL özelliğinde NSUserActivity kodlayabilir. Alıcı cihazda devamlılığı işlemek için uygun bir yerel uygulama yüklüyse, sağlanan web arabirimi çağrılabilirsiniz.
Web Tarayıcıdan Yerel Uygulamaya Teslim
Kullanıcı kaynak cihazda web tabanlı bir arabirim kullanıyorsa ve alıcı cihazdaki yerel bir uygulama özelliğin etki alanı bölümünü talep ediyorsa, sistem devamını işlemek için bu WebpageURL uygulamayı kullanır. Yeni cihaz Etkinlik Türünü olarak işaret eden bir örnek alır ve kullanıcının ziyaret ettiğiniz NSUserActivityBrowsingWeb URL'yi WebpageURL içerir; sözlük boş UserInfo olur.
Bir uygulamanın bu tür Bir İlerleç'e katılmasını için, etki alanını biçiminde bir yetkilendirmede com.apple.developer.associated-domains<service>:<fully qualified domain name> (örneğin: ) talep etmek activity continuation:company.com gerekir.
Belirtilen etki alanı bir özelliğin değeriyle eşiliyorsa, Handoff ilgili etki alanındaki web sitesinden onaylı WebpageURL uygulama kimliklerinin listesini indirir. Web sitesinin apple-app-site-association (örneğin, ) adlı imzalı bir JSON dosyasında onaylı kimliklerin listesini sağlaması gerekir.
Bu JSON dosyası, şeklinde uygulama kimliklerinin listesini belirten bir sözlük <team identifier>.<bundle identifier> içerir. Örnek:
{
"activitycontinuation": {
"apps": [ "YWBN8XTPBJ.com.company.FirstApp",
"YWBN8XTPBJ.com.company.SecondApp" ]
}
}
JSON dosyasını imzalamak için (doğru olduğu için), Terminal uygulamasını ve iOS tarafından güvenilen bir sertifika yetkilisi tarafından verilen sertifika ve anahtarla bir komut kullanın Content-Typeapplication/pkcs7-mimeContent-Typeopenssl (listeye https://support.apple.com/kb/ht5012 bakın). Örnek:
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
Komutun openssl çıkışında web sitenize openssl URL'sini yer alan imzalı bir JSON dosyası yer almaktadır. Örnek:
https://example.com/apple-app-site-association.
Uygulama, etki alanı WebpageURL yetkilendirmesinde olan tüm com.apple.developer.associated-domains etkinlikleri alır. Yalnızca http ve https protokolleri destektedir, diğer protokoller bir özel durum oluşturur.
Document-Based Apps'te Teslimi Destekleme
Yukarıda belirtildiği gibi, iOS ve OS X'te, uygulamanın Info.plist dosyasında bir anahtarı varsa, belge tabanlı uygulamalar iCloud tabanlı belgelerin teslimini otomatik olarak NSUbiquitousDocumentUserActivityType destekleyecektir. Örnek:
<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>
Bu örnekte dize, eklenen etkinliğin adı ile birlikte ters DNS uygulama göstergesi olur. Bu şekilde girilmişse, etkinlik türü girdilerinin NSUserActivityTypesNSUserActivityTypes dosyasının dizisinde yinelenme gereksinimi yoktur.
Otomatik olarak oluşturulan kullanıcı etkinliği nesnesine (belgenin özelliği aracılığıyla kullanılabilir UserActivity ) uygulamadaki diğer nesneler tarafından başvurulabilir ve devamlılığın durumunu geri yüklemek için kullanılır. Örneğin, öğe seçimi ve belge konumunu izlemek için. Bu etkinlikler NeedsSave özelliğini true , durum her değiştiğinde ve UserInfo yöntemi içindeki sözlüğü güncelleştirdiğinizde olarak ayarlamanız gerekir UpdateUserActivityState .
UserActivityBu özellik herhangi bir iş parçacığından kullanılabilir ve anahtar-değer gözemi (KVO) protokolüne uygun olduğundan, iCloud 'a ve dışına taşındıkça belgeyi eşitlenmiş halde tutmak için kullanılabilir. UserActivityBelge kapatıldığında Özellik geçersiz kılınır.
Daha fazla bilgi için lütfen Document-Based Apps belgelerindeki Apple 'ın Kullanıcı etkinliği desteği ' ne bakın.
Yanıtlayıcıda Iletimi destekleme
Yanıtlayıcıları ( UIResponder iOS veya OS X üzerinde devralınmış), NSResponder özelliklerini ayarlayarak etkinliklerle ilişkilendirebilirsiniz UserActivity . Sistem, özelliği otomatik olarak UserActivity uygun zamanlarda kaydeder ve UpdateUserActivityState yöntemi kullanarak Kullanıcı etkinliği nesnesine geçerli verileri eklemek için yanıtlayanın yöntemini çağırır AddUserInfoEntriesFromDictionary .
devamlılık Akışlar destekleme
Bu durum, bir etkinliğe devam etmek için gereken bilgi tutarının ilk Iletim yükü tarafından etkin bir şekilde aktarılamayacağını gösterebilir. Bu durumlarda, alıcı uygulama, verileri aktarmak için kendisiyle kaynak uygulama arasında bir veya daha fazla akış oluşturabilir.
Kaynak uygulama SupportsContinuationStreamsNSUserActivity örneğinin özelliğini olarak ayarlar true . Örnek:
// 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 ();
Alıcı uygulama daha sonra GetContinuationStreams , NSUserActivityAppDelegate akışını oluşturmak için içindeki metodunu çağırabilir. Örnek:
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;
}
Kaynak cihazda, Kullanıcı etkinliği temsilcisi, kendi metodunu çağırarak, DidReceiveInputStream Kullanıcı etkinliğine devam etmek için istenen verileri sağlamak üzere kendi yöntemini çağırarak akışları alır.
NSInputStreamAkış verilerine salt okuma erişimi sağlamak için bir ve yalnızca bir salt NSOutputStream yazılır erişim sağlamak için kullanacaksınız. Akışlar, alıcı uygulamanın daha fazla veri istemesi ve kaynak uygulamanın bunu sağladığı bir istek ve yanıt olarak kullanılmalıdır. Böylece, kaynak cihazdaki çıkış akışına yazılan veriler, devam eden cihazdaki giriş akışından okunmalıdır ve tam tersi de geçerlidir.
Devamlılık akışının gerekli olduğu durumlarda bile, iki uygulama arasında en az bir geri ve ileri iletişim olmalıdır.
daha fazla bilgi için bkz. Apple 'ın devamlılık Akışlar belgeleri kullanma .
İletim En Iyi uygulamaları
Bir kullanıcı etkinliğinin Iletimi aracılığıyla sorunsuz devamlılığının başarılı bir şekilde uygulanması, dahil edilen çeşitli bileşenler nedeniyle dikkatli bir tasarım gerektirir. Apple, iletime özellikli uygulamalarınız için en iyi izleme uygulamalarını benimseme önerisinde bulunur:
- Etkinlik durumunun devam etmesini sağlamak için en düşük yükün gerekli olması için Kullanıcı etkinliklerinizi tasarlayın. Yükün ne kadar büyük olması, daha uzun sürme devam eden sürer.
- Başarılı devamlılık için büyük miktarlarda veri aktarmanız gerekiyorsa, yapılandırma ve ağ yüküyle ilgili maliyetleri hesaba katın.
- Büyük bir Mac uygulamasının iOS cihazlarında birkaç, daha küçük, göreve özel uygulamalar tarafından işlenen Kullanıcı etkinlikleri oluşturması yaygındır. Farklı uygulama ve işletim sistemi sürümleri, birlikte iyi çalışacak veya sorunsuz bir şekilde çalışacak şekilde tasarlanmalıdır.
- Etkinlik türlerinizi belirtirken, çakışmaları önlemek için ters DNS gösterimini kullanın. Bir etkinlik belirli bir uygulamaya özel ise, adının tür tanımına dahil olması gerekir (örneğin
com.myCompany.myEditor.editing). Etkinlik birden çok uygulama arasında çalışamıyorsanız, uygulamanın adını tanımdan bırakın (örneğincom.myCompany.editing). - Uygulamanızın bir kullanıcı etkinliğinin durumunu güncelleştirmesi gerekiyorsa (
NSUserActivity)NeedsSaveözelliğini olarak ayarlayıntrue. Uygun zamanlarda Iletim temsilcinin metodunu çağırıp, buUserActivityWillSavesayedeUserInfosözlüğü güncelleştirmeniz gerekir. - Iletim işlemi, alıcı cihazda anında başlayamayabilir, ' yi uygulamanız
AppDelegateWillContinueUserActivityve kullanıcıyı bir devamlılığın başlamak üzere bilgilendirmesini bildirmeniz gerekir.
Örnek Iletim uygulaması
Bir Xamarin. iOS uygulamasında Iletim kullanmanın bir örneği olarak, bu kılavuza Monkeybrowser örnek uygulamasını ekledik. Uygulamanın, her biri belirli bir etkinlik türü ile Web 'de gezinmek için kullanabileceği dört sekme vardır: Hava durumu, sık kullanılan, kahve ve çalışma.
Herhangi bir sekmede, Kullanıcı yeni bir URL girdiğinde ve Git düğmesine dokunduğunda, kullanıcının şu anda GÖZATMAKTA olduğu URL 'yi içeren bu sekme için yeni bir oluşturulur:
Kullanıcının cihazlarından birinde Monkeybrowser uygulaması yüklüyse, aynı kullanıcı hesabı kullanılarak iCloud 'da oturum açtıysanız, aynı ağ üzerinde ve yukarıdaki cihaza yakın yakındır, iletim etkinliği giriş ekranında (sol alt köşede) görüntülenir:
Kullanıcı Iletim simgesine yukarı doğru sürüklendiğinde uygulama başlatılır ve içinde belirtilen kullanıcı etkinliği NSUserActivity Yeni cihazda devam eder:
Kullanıcı etkinliği başka bir Apple cihazına başarıyla gönderildiğinde, Gönderen cihaz, NSUserActivityUserActivityWasContinuedNSUserActivityDelegate Kullanıcı etkinliğinin başka bir cihaza başarıyla aktarıldığını bilmesini sağlamak için yöntemine bir çağrı alır.
Özet
Bu makale, kullanıcının Apple cihazları arasında bir Kullanıcı etkinliğine devam etmek için kullanılan Iletim çerçevesine bir giriş vermiş. Ardından, bir Xamarin. iOS uygulamasında Iletimi etkinleştirme ve uygulama işlemlerinin nasıl yapılacağını gösterdi. Son olarak, sunulan farklı Iletim devamlılığını ve Iletim en iyi yöntemlerini ele alınmaktadır.









