Xamarin.iOS'ta SiriKit Uygulama
Bu makale, Xamarin.iOS uygulamalarında SiriKit desteği uygulamak için gereken adımları kapsar.
iOS 10'da yeni olan SiriKit, Xamarin.iOS uygulamasının iOS cihazında Siri ve Haritalar uygulamasını kullanarak kullanıcıya erişilebilen hizmetler sağlamasına olanak tanır. Bu makale, gerekli Intents Extensions, Intents UI Extensions ve Vocabulary değerlerini ekleyerek Xamarin.iOS uygulamalarında SiriKit desteği uygulamak için gereken adımları kapsar.
Siri, etki alanları kavramıyla, ilgili görevler için bilgi eylemleri gruplarıyla çalışır. Uygulamanın Siri ile yaptığı her etkileşim, bilinen hizmet Etki Alanlarından birine aşağıdaki gibi girmelidir:
- Sesli veya görüntülü arama.
- Bir gezi için rezervasyon.
- Antrenmanları yönetme.
- Mesajlaşma.
- Fotoğraflar aranıyor.
- Ödemeleri gönderme veya alma.
Kullanıcı Uygulama Uzantısı'nın hizmetlerinden birini içeren bir Siri isteğinde bulunduğunda SiriKit uzantıya kullanıcının isteğini ve destekleyici verileri açıklayan bir Intent nesnesi gönderir. Uygulama Uzantısı daha sonra verilen Amaç için uygun Yanıt nesnesini oluşturur ve uzantının isteği nasıl işleyebileceğini açıklar.
Bu kılavuz, sirikit desteğini mevcut bir uygulamaya eklemeye yönelik hızlı bir örnek sunar. Bu örnekte sahte MonkeyChat uygulamasını kullanacağız:
MonkeyChat, her biri bir ekran adıyla (örneğin Bobo gibi) ilişkili kullanıcının arkadaşlarının kendi iletişim kitabını tutar ve kullanıcının her bir arkadaşınıza ekran adıyla kısa mesaj göndermesine izin verir.
SiriKit ile Uygulamayı Genişletme
SiriKit Kavramlarını Anlama kılavuzunda gösterildiği gibi, SiriKit ile bir uygulamanın genişletilmesiyle ilgili üç ana bölüm vardır:
Bu modüller şunlardır:
- Amaç Uzantısı - Kullanıcıların yanıtlarını doğrular, uygulamanın isteği işleyebileceğini onaylar ve kullanıcının isteğini yerine getirmek için görevi gerçekleştirir.
- Intents UI Uzantısı - İsteğe bağlı olarak, Siri Ortamı'ndaki yanıtlara özel bir kullanıcı arabirimi sağlar ve kullanıcının deneyimini zenginleştirmek için uygulamaların kullanıcı arabirimini ve markasını Siri'ye getirebilir.
- Uygulama - Siri'nin bu sözlükle çalışmasına yardımcı olmak için Uygulamaya Kullanıcıya özgü sözlükler sağlar.
Bu öğelerin tümü ve bunları uygulamaya ekleme adımları aşağıdaki bölümlerde ayrıntılı olarak ele alınacaktır.
Uygulamayı Hazırlama
SiriKit Uzantılar üzerine kurulmuştur ancak uygulamaya uzantı eklemeden önce, geliştiricinin SiriKit'in benimsenmesi konusunda yardımcı olması için yapması gereken birkaç şey vardır.
Ortak Paylaşılan Kodu Taşıma
İlk olarak, geliştirici uygulama ve uzantılar arasında paylaşılacak ortak kodlardan bazılarını Paylaşılan Projeler, Taşınabilir Sınıf Kitaplıkları (PCL' ler) veya Yerel Kitaplıklar'a taşıyabilir.
Uzantıların uygulamanın yaptığı her şeyi yapabilmesi gerekir. Örnek MonkeyChat uygulaması açısından kişileri bulma, yeni kişiler ekleme, ileti gönderme ve ileti geçmişini alma gibi şeyler.
Bu ortak kodu Paylaşılan Proje, PCL veya Yerel Kitaplık'a taşıyarak, bu kodun ortak bir yerde tutulmasını kolaylaştırır ve Uzantı ile üst uygulamanın kullanıcı için tekdüzen deneyimler ve işlevler sağlamasını sağlar.
MonkeyChat örnek uygulaması söz konusu olduğunda, ağ ve veritabanı erişimi gibi veri modelleri ve işleme kodu Yerel Kitaplığa taşınacaktır.
Aşağıdakileri yapın:
Mac için Visual Studio başlatın ve MonkeyChat uygulamasını açın.
Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle...'yi>seçin:
iOS>Kitaplığı Sınıf Kitaplığı'nı> seçin ve İleri düğmesine tıklayın:
Ad alanına girin
MonkeyChatCommon
ve Oluştur düğmesine tıklayın:Çözüm Gezgini ana uygulamanın Başvurular klasörüne sağ tıklayın ve Başvuruları Düzenle... öğesini seçin. MonkeyChatCommon projesini kontrol edin ve Tamam düğmesine tıklayın:
Çözüm Gezgini, ortak paylaşılan kodu ana uygulamadan Yerel Kitaplık'a sürükleyin.
MonkeyChat söz konusu olduğunda, DataModels ve İşlemciler klasörlerini ana uygulamadan Yerel Kitaplık'a sürükleyin:
Yerel Kitaplığa taşınan dosyalardan herhangi birini düzenleyin ve ad alanını kitaplığınkiyle eşleşecek şekilde değiştirin. Örneğin, olarak değiştiriliyor MonkeyChat
MonkeyChatCommon
:
using System;
namespace MonkeyChatCommon
{
/// <summary>
/// A message sent from one user to another within a conversation.
/// </summary>
public class MonkeyMessage
{
public MonkeyMessage ()
{
}
...
}
}
Ardından ana uygulamaya dönün ve uygulamanın taşınan sınıflardan birini kullandığı her yere Yerel Kitaplığın ad alanı için bir using
deyim ekleyin:
using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
using MonkeyChatCommon;
namespace MonkeyChat
{
public partial class MasterViewController : UITableViewController
{
public DetailViewController DetailViewController { get; set; }
DataSource dataSource;
...
}
}
Uzantılar için Uygulama Mimarisi Oluşturma
Genellikle bir uygulama birden çok Amaç için kaydolacaktır ve geliştiricinin uygulamanın uygun sayıda Amaç Uzantısı için tasarlandığından emin olması gerekir.
Bir uygulamanın birden fazla Amaç gerektirdiği durumlarda geliştirici, Amaç işlemesinin tümünü tek bir Amaç Uzantısına yerleştirme veya her Amaç için ayrı bir Amaç Uzantısı oluşturma seçeneğine sahiptir.
Her Amaç için ayrı bir Amaç Uzantısı oluşturmayı seçerseniz, geliştirici her uzantıda büyük miktarda ortak kod çoğaltabilir ve büyük miktarda işlemci ve bellek yükü oluşturabilir.
İki seçenek arasında seçim yapmaya yardımcı olmak için Amaçlardan herhangi birinin doğal olarak birbirine ait olup olmadığını görün. Örneğin, sesli ve görüntülü aramalar yapan bir uygulama, benzer görevleri işlerken bu Amaçların her ikisini de tek bir Amaç Uzantısına dahil etmek isteyebilir ve kodun en çok yeniden kullanılmasını sağlayabilir.
Var olan bir gruba sığmayan herhangi bir Amaç veya Amaç grubu için, uygulamanın çözümünde bunları içerecek yeni bir Amaç Uzantısı oluşturun.
Gerekli Yetkilendirmeleri Ayarlama
SiriKit tümleştirmesi içeren tüm Xamarin.iOS uygulamaları doğru yetkilendirmelere sahip olmalıdır. Geliştirici bu gerekli yetkilendirmeleri doğru ayarlamazsa, uygulamayı gerçek iOS 10 (veya üzeri) donanıma yükleyemez veya test edemeyecektir. Bu, iOS 10 Simülatörü SiriKit'i desteklemediğinden de gereklidir.
Aşağıdakileri yapın:
Çözüm Gezgini dosyaya çift tıklayarak
Entitlements.plist
düzenlemek üzere açın.Kaynak sekmesine geçin.
com.apple.developer.siri
Özelliğini ekleyin, TürBoolean
değerini ve Değeri olarakYes
ayarlayın:Dosyadaki değişiklikleri kaydedin.
Düzenlemek üzere açmak için Çözüm Gezgini proje dosyasına çift tıklayın.
iOS Paket İmzalama'ya tıklayın ve Özel Yetkilendirmeler alanında dosyanın seçili olduğundan emin olun
Entitlements.plist
:Değişiklikleri kaydetmek için Tamam düğmesine tıklayın.
tamamlandığında, uygulamanın Entitlements.plist
dosyası aşağıdaki gibi görünmelidir (bir dış düzenleyicide açılır):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.siri</key>
<true/>
</dict>
</plist>
Uygulamayı Doğru Sağlama
Apple'ın SiriKit çerçevesinin çevresine yerleştirdiği katı güvenlik nedeniyle, SiriKit'i uygulayan tüm Xamarin.iOS uygulamaları doğru Uygulama Kimliğine ve Yetkilendirmelere sahip olmalıdır (yukarıdaki bölüme bakın) ve uygun bir Sağlama Profili ile imzalanmalıdır.
Mac bilgisayarınızda aşağıdakileri yapın:
Bir web tarayıcısında adresine gidin https://developer.apple.com ve hesabınızda oturum açın.
Sertifikalar, Tanımlayıcılar ve Profiller'e tıklayın.
Sağlama Profilleri'ni seçin ve Uygulama Kimlikleri'ni seçin ve ardından düğmeye + tıklayın.
Yeni Profil için bir Ad girin.
Apple'ın adlandırma önerisini izleyerek bir Paket Kimliği girin.
Aşağı kaydırarak App Services bölümüne gelin, SiriKit'i seçin ve Devam düğmesine tıklayın:
Tüm ayarları doğrulayın ve uygulama kimliğini gönderin .
Sağlama Profilleri>Geliştirme'yi seçin, düğmeye + tıklayın, Apple Kimliğini seçin ve ardından Devam'a tıklayın.
Tümünü Seç'e ve ardından Devam'a tıklayın.
Tümünü Seç'e yeniden tıklayın ve ardından Devam'a tıklayın.
Apple'ın adlandırma önerilerini kullanarak bir Profil Adı girin ve Devam'a tıklayın.
Xcode'ı başlatın.
Xcode menüsünde Tercihler... öğesini seçin .
Hesaplar'ı seçin, ardından Ayrıntıları Görüntüle... düğmesine tıklayın:
Sol alt köşedeki Tüm Profilleri İndir Düğmesine tıklayın:
Yukarıda oluşturulan Sağlama Profilinin Xcode'a yüklendiğinden emin olun.
Mac için Visual Studio'da SiriKit desteği eklemek için projeyi açın.
Çözüm Gezgini dosyasına çift tıklayın
Info.plist
.Paket Tanımlayıcısının yukarıdaki Apple Geliştirici Portalı'nda oluşturulanla eşleştiğinden emin olun:
Çözüm Gezgini Proje'yi seçin.
Projeye sağ tıklayın ve Seçenekler'i seçin.
iOS Paket İmzalama'yı seçin, yukarıda oluşturulan İmzalama Kimliği ve Sağlama Profili'ni seçin:
Değişiklikleri kaydetmek için Tamam düğmesine tıklayın.
Önemli
SiriKit'i test etme, iOS 10 Simülatörü'nde değil yalnızca gerçek bir iOS 10 Donanım Cihazı'nda çalışır. SiriKit özellikli bir Xamarin.iOS uygulamasını gerçek donanıma yüklerken sorun yaşıyorsanız gerekli Yetkilendirmeler, Uygulama Kimliği, İmzalama Tanımlayıcısı ve Sağlama Profili'nin hem Apple Geliştirici Portalı'nda hem de Mac için Visual Studio doğru yapılandırıldığından emin olun.
Siri Yetkilendirmesi İsteme
Uygulama Herhangi bir Kullanıcıya Özgü Sözcük Dağarcığı eklemeden veya Amaçlar Uzantıları Siri'ye bağlanmadan önce, kullanıcıdan Siri'ye erişmek için yetkilendirme istemesi gerekir.
Uygulamanın Info.plist
dosyasını düzenleyin, Kaynak görünümüne geçin ve anahtarı uygulamanın Siri'yi nasıl kullanacağını ve hangi veri türlerinin gönderileceğini açıklayan bir dize değeriyle ekleyinNSSiriUsageDescription
. Örneğin, MonkeyChat uygulaması "MonkeyChat kişileri Siri'ye gönderilecek" diyebilir:
RequestSiriAuthorization
Uygulama ilk kez başlatıldığında sınıfının yöntemini INPreferences
çağırın. sınıfını AppDelegate.cs
düzenleyin ve yönteminin FinishedLaunching
aşağıdaki gibi görünmesini sağlayın:
using Intents;
...
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Request access to Siri
INPreferences.RequestSiriAuthorization ((INSiriAuthorizationStatus status) => {
// Respond to returned status
switch (status) {
case INSiriAuthorizationStatus.Authorized:
break;
case INSiriAuthorizationStatus.Denied:
break;
case INSiriAuthorizationStatus.NotDetermined:
break;
case INSiriAuthorizationStatus.Restricted:
break;
}
});
return true;
}
Bu yöntem ilk kez çağrıldığında, kullanıcıdan uygulamanın Siri'ye erişmesine izin vermesini isteyen bir uyarı görüntülenir. Geliştiricinin yukarıdakine NSSiriUsageDescription
eklediği ileti bu uyarıda görüntülenir. Kullanıcı başlangıçta erişimi reddederse, uygulamaya erişim vermek için Ayarlar uygulamasını kullanabilir.
Uygulama istediğiniz zaman sınıfının yöntemini çağırarak uygulamanın Siri'ye erişme becerisini SiriAuthorizationStatus
INPreferences
denetleyebiliyor.
Yerelleştirme ve Siri
Bir iOS cihazında kullanıcı Siri için sistem varsayılanı olandan farklı bir dil seçebilir. Yerelleştirilmiş verilerle çalışırken uygulamanın Siri'den dil kodunu almak için sınıfının yöntemini INPreferences
kullanması SiriLanguageCode
gerekir. Örneğin:
var language = INPreferences.SiriLanguageCode();
// Take action based on language
if (language == "en-US") {
// Do something...
}
Kullanıcıya Özgü Sözcük Dağarcığı Ekleme
Kullanıcıya Özgü Sözlük, uygulamanın bireysel kullanıcılarına özel sözcükler veya tümcecikler sağlayacaktır. Bunlar çalışma zamanında ana uygulamadan (Uygulama Uzantıları'ndan değil), kullanıcılar için en önemli kullanım önceliğine göre sıralanmış, listenin başındaki en önemli terimlerle sıralanmış bir terim kümesi olarak sağlanacaktır.
Kullanıcıya Özgü Sözlük aşağıdaki kategorilerden birine ait olmalıdır:
- Kişi Adları (Kişiler çerçevesi tarafından yönetilmeyen adlar).
- Fotoğraf Etiketleri.
- Fotoğraf Albümü Adları.
- Antrenman Adları.
Özel kelime dağarcığı olarak kaydolmak için terminolojiyi seçerken, yalnızca uygulamaya aşina olmayan biri tarafından yanlış anlaşılacak terimleri seçin. "Antrenmanım" veya "Albümüm" gibi yaygın terimleri hiçbir zaman kaydetmeyin. Örneğin, MonkeyChat uygulaması her bir kişiyle ilişkili takma adları kullanıcının adres defterine kaydeder.
Uygulama, sınıfının yöntemini INVocabulary
çağırarak SetVocabularyStrings
ve ana uygulamadan bir NSOrderedSet
koleksiyon geçirerek Kullanıcıya Özgü Sözcük Dağarcığını sağlar. Yeni terimler eklemeden önce mevcut terimleri kaldırmak için uygulamanın her zaman önce yöntemini çağırması RemoveAllVocabularyStrings
gerekir. Örneğin:
using System;
using System.Linq;
using System.Collections.Generic;
using Foundation;
using Intents;
namespace MonkeyChatCommon
{
public class MonkeyAddressBook : NSObject
{
#region Computed Properties
public List<MonkeyContact> Contacts { get; set; } = new List<MonkeyContact> ();
#endregion
#region Constructors
public MonkeyAddressBook ()
{
}
#endregion
#region Public Methods
public NSOrderedSet<NSString> ContactNicknames ()
{
var nicknames = new NSMutableOrderedSet<NSString> ();
// Sort contacts by the last time used
var query = Contacts.OrderBy (contact => contact.LastCalledOn);
// Assemble ordered list of nicknames by most used to least
foreach (MonkeyContact contact in query) {
nicknames.Add (new NSString (contact.ScreenName));
}
// Return names
return new NSOrderedSet<NSString> (nicknames.AsSet ());
}
// This method MUST only be called on a background thread!
public void UpdateUserSpecificVocabulary ()
{
// Clear any existing vocabulary
INVocabulary.SharedVocabulary.RemoveAllVocabularyStrings ();
// Register new vocabulary
INVocabulary.SharedVocabulary.SetVocabularyStrings (ContactNicknames (), INVocabularyStringType.ContactName);
}
#endregion
}
}
Bu kod uygun olduğunda, aşağıdaki gibi çağrılabilir:
using System;
using System.Threading;
using UIKit;
using MonkeyChatCommon;
using Intents;
namespace MonkeyChat
{
public partial class ViewController : UIViewController
{
#region AppDelegate Access
public AppDelegate ThisApp {
get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
#endregion
#region Constructors
protected ViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Do we have access to Siri?
if (INPreferences.SiriAuthorizationStatus == INSiriAuthorizationStatus.Authorized) {
// Yes, update Siri's vocabulary
new Thread (() => {
Thread.CurrentThread.IsBackground = true;
ThisApp.AddressBook.UpdateUserSpecificVocabulary ();
}).Start ();
}
}
public override void DidReceiveMemoryWarning ()
{
base.DidReceiveMemoryWarning ();
// Release any cached data, images, etc that aren't in use.
}
#endregion
}
}
Önemli
Siri özel kelime dağarcığını ipuçları olarak ele alır ve terminolojinin mümkün olduğunca çoğunu içerir. Ancak, özel sözlük alanı sınırlı olduğundan yalnızca kafa karıştırıcı olabilecek terminolojiyi kaydetmeyi önemli hale getirir ve bu nedenle kayıtlı terimlerin toplam sayısını en az düzeyde tutar.
Daha fazla bilgi için lütfen Kullanıcıya Özgü Sözlük Başvurusu ve Apple'ın Özel Sözlük Başvurusu Belirtme bölümüne bakın.
Uygulamaya Özgü Sözcük Dağarcığı Ekleme
Uygulamaya Özgü Sözlük, araç türleri veya antrenman adları gibi uygulamanın tüm kullanıcıları tarafından bilinecek belirli sözcükleri ve tümcecikleri tanımlar. Bunlar uygulamanın bir parçası olduğundan, ana uygulama paketinin bir parçası olarak bir AppIntentVocabulary.plist
dosyada tanımlanırlar. Ayrıca, bu sözcükler ve tümcecikler yerelleştirilmelidir.
Uygulamaya Özgü Sözlük terimleri aşağıdaki kategorilerden birine ait olmalıdır:
- Sürüş Seçenekleri.
- Antrenman Adları.
Uygulamaya Özgü Sözlük dosyası iki kök düzeyi anahtarı içerir:
ParameterVocabularies
Gerekli - Uygulamanın özel terimlerini ve uygulandıkları Amaç Parametrelerini tanımlar.IntentPhrases
İsteğe bağlı - içindeParameterVocabularies
tanımlanan özel terimleri kullanarak örnek tümcecikler içerir.
içindeki ParameterVocabularies
her girdi bir kimlik dizesi, terim ve terimin uygulandığı Amaç belirtmelidir. Ayrıca, tek bir terim birden çok Amaç için geçerli olabilir.
Kabul edilebilir değerlerin ve gerekli dosya yapısının tam listesi için bkz. Apple'ın Uygulama Sözlüğü Dosya Biçimi Başvurusu.
Uygulama projesine dosya AppIntentVocabulary.plist
eklemek için aşağıdakileri yapın:
Çözüm Gezgini Proje Adı'na sağ tıklayın ve Yeni Dosya Ekle>... öğesini seçin.>iOS:
Çözüm Gezgini dosyaya çift tıklayarak
AppIntentVocabulary.plist
düzenlemek üzere açın.+ Bir anahtar eklemek için öğesine tıklayın, Ad
ParameterVocabularies
ve TürArray
olarak ayarlayın:Genişletip
ParameterVocabularies
düğmeye + tıklayın ve Tür değerini olarakDictionary
ayarlayın:+ Yeni bir anahtar eklemek için öğesine tıklayın, Ad
ParameterNames
ve TürArray
olarak ayarlayın:+ Türü
String
ve değeri kullanılabilir Parametre Adlarından biri olarak yeni bir anahtar eklemek için öğesine tıklayın. Örneğin,INStartWorkoutIntent.workoutName
:anahtarı türüne
ParameterVocabulary
ParameterVocabularies
sahip anahtaraArray
ekleyin:Türüne
Dictionary
sahip yeni bir anahtar ekleyin:Türüne
VocabularyItemIdentifier
String
sahip anahtarı ekleyin ve terim için benzersiz bir kimlik belirtin:VocabularyItemSynonyms
anahtarını türüyleArray
ekleyin:Türüne
Dictionary
sahip yeni bir anahtar ekleyin:VocabularyItemPhrase
Anahtarı TürüString
ve uygulamanın tanımlanmakta olduğu terimle ekleyin:VocabularyItemPronunciation
TürüString
ve teriminin fonetik söylenişi ile anahtarı ekleyin:VocabularyItemExamples
anahtarını türüyleArray
ekleyin:Terimin örnek kullanımlarıyla birkaç
String
anahtar ekleyin:Uygulamanın tanımlaması gereken diğer özel terimler için yukarıdaki adımları yineleyin.
Anahtarı daraltın
ParameterVocabularies
.IntentPhrases
anahtarını türüyleArray
ekleyin:Türüne
Dictionary
sahip yeni bir anahtar ekleyin:IntentName
Örneğin TürüString
ve Amacı ile anahtarı ekleyin:IntentExamples
anahtarını türüyleArray
ekleyin:Terimin örnek kullanımlarıyla birkaç
String
anahtar ekleyin:Uygulamanın örnek kullanımı sağlaması gereken amaçlar için yukarıdaki adımları yineleyin.
Önemli
geliştirme AppIntentVocabulary.plist
sırasında test cihazlarında Siri'ye kaydedilir ve Siri'nin özel kelime dağarcığını eklemesi biraz zaman alabilir. Sonuç olarak, test edenin güncelleştirildiğinde Uygulamaya Özgü Sözcük Dağarcığını test etmeye çalışmadan önce birkaç dakika beklemesi gerekir.
Daha fazla bilgi için lütfen Uygulamaya Özgü Sözlük Başvurusu ve Apple'ın Özel Sözlük Başvurusu Belirtme bölümüne bakın.
Intents Uzantısı Ekleme
Uygulama Artık SiriKit'i benimsemeye hazır olduğuna göre, geliştiricinin Siri tümleştirmesi için gereken Amaçları işlemek için çözüme bir (veya daha fazla) Amaç Uzantısı eklemesi gerekir.
Gereken her Intents Uzantısı için aşağıdakileri yapın:
- Xamarin.iOS uygulama çözümüne bir Intents Extension projesi ekleyin.
- Intents Uzantısı
Info.plist
dosyasını yapılandırın. - Intents Uzantısı ana sınıfını değiştirin.
Daha fazla bilgi için lütfen Amaçlar Uzantısı Başvurusu ve Apple'ın Intents Uzantısını Oluşturma başvurumuza bakın.
Uzantı Oluşturma
Çözüme bir Intents Uzantısı eklemek için aşağıdakileri yapın:
Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle>... öğesini seçin.
İletişim kutusundan iOS>Uzantıları>Amaç Uzantısı'nıseçin ve İleri düğmesine tıklayın:
Ardından Amaç Uzantısı için bir Ad girin ve İleri düğmesine tıklayın:
Son olarak, Uygulama çözümüne Amaç Uzantısını eklemek için Oluştur düğmesine tıklayın:
Çözüm Gezgini, yeni oluşturulan Amaç Uzantısının Başvurular klasörüne sağ tıklayın. Ortak paylaşılan kod kitaplığı projesinin adını (yukarıda oluşturulan uygulama) denetleyin ve Tamam düğmesine tıklayın:
Uygulamanın gerektireceği Amaç Uzantıları sayısı (yukarıdaki Uzantılar için Uygulama Mimarisi Oluşturma bölümüne göre) için bu adımları yineleyin.
Info.plist'i yapılandırma
Uygulamanın çözümüne eklenen Intents Extensions'ın her biri için, dosyalarda Info.plist
uygulamayla çalışacak şekilde yapılandırılması gerekir.
Her tipik Uygulama Uzantısında olduğu gibi, uygulamada da ve NSExtensionAttributes
anahtarları NSExtension
bulunur. Intents Uzantısı için yapılandırılması gereken iki yeni öznitelik vardır:
- IntentsSupported - Gereklidir ve uygulamanın Amaç Uzantısı'ndan desteklemek istediği bir Amaç Sınıfı adları dizisinden oluşur.
- IntentsRestrictedWhileLocked - Uygulamanın uzantının kilit ekranı davranışını belirtmesi için isteğe bağlı bir anahtardır. Uygulamanın, kullanıcının Intent Extension'dan kullanmak üzere oturum açmasını gerektirdiği Bir Amaç Sınıfı adları dizisinden oluşur.
Intent Extension'ın Info.plist
dosyasını yapılandırmak için Çözüm Gezgini çift tıklayarak düzenlemek üzere açın. Ardından Kaynak görünümüne geçin ve düzenleyicide ve NSExtensionAttributes
tuşlarını genişletinNSExtension
:
IntentsSupported
Anahtarı genişletin ve bu uzantının destekleyeceğini herhangi bir Intent Sınıfının adını ekleyin. Örnek MonkeyChat uygulaması için şunu destekler INSendMessageIntent
:
Uygulama isteğe bağlı olarak kullanıcının belirli bir amacı kullanmak için cihazda oturum açmasını gerektiriyorsa, anahtarı genişletin IntentRestrictedWhileLocked
ve erişimi kısıtlanmış Amaçların Sınıf adlarını ekleyin. Örnek MonkeyChat uygulaması için kullanıcının sohbet iletisi göndermek için oturum açmış olması gerekir, bu nedenle ekledik INSendMessageIntent
:
Kullanılabilir Amaç Etki Alanlarının tam listesi için lütfen Apple'ın Amaç Etki Alanları Başvurusu'ne bakın.
Ana Sınıfı Yapılandırma
Ardından geliştiricinin, Siri'ye Amaç Uzantısı için ana giriş noktası işlevi gören ana sınıfı yapılandırması gerekir. Temsilciye INExtension
IINIntentHandler
uygun bir alt sınıfı olmalıdır. Örneğin:
using System;
using System.Collections.Generic;
using Foundation;
using Intents;
namespace MonkeyChatIntents
{
[Register ("IntentHandler")]
public class IntentHandler : INExtension, IINSendMessageIntentHandling, IINSearchForMessagesIntentHandling, IINSetMessageAttributeIntentHandling
{
#region Constructors
protected IntentHandler (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override NSObject GetHandler (INIntent intent)
{
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return this;
}
#endregion
...
}
}
Uygulamanın Intent Extension ana sınıfı GetHandler
olan yöntemi üzerinde uygulaması gereken tek bir tekli yöntem vardır. Bu yöntem SiriKit tarafından bir Intent geçirilir ve uygulamanın verilen Amaç türüyle eşleşen bir Amaç İşleyicisi döndürmesi gerekir.
Örnek MonkeyChat uygulaması yalnızca bir amacı işlediğinden, yönteminde GetHandler
kendini döndürmektedir. Uzantı birden fazla amacı işlediyse, geliştirici her amaç türü için bir sınıf ekler ve yöntemine geçirilene göre Intent
burada bir örnek döndürür.
Çözümleme Aşamasını İşleme
Çözüm aşaması, Amaç Uzantısının Siri'den geçirilen ve kullanıcının konuşması aracılığıyla ayarlanmış parametreleri netleştireceği ve doğruladığı yerdir.
Siri'den gönderilen her parametre için bir Resolve
yöntem vardır. Uygulamanın, kullanıcıdan doğru yanıtı almak için Siri'nin yardımına ihtiyaç duyabileceği her parametre için bu yöntemi uygulaması gerekir.
Örnek MonkeyChat uygulaması söz konusu olduğunda, Amaç Uzantısı iletiyi göndermek için bir veya daha fazla alıcı gerektirir. Listedeki her alıcı için uzantının aşağıdaki sonuca sahip olabilecek bir kişi araması yapması gerekir:
- Tam olarak eşleşen bir kişi bulunur.
- İki veya daha fazla eşleşen kişi bulunur.
- Eşleşen kişi bulunamadı.
Buna ek olarak, MonkeyChat iletinin gövdesi için içerik gerektirir. Kullanıcı bunu sağlamadıysa Siri'nin kullanıcıdan içeriği istemesi gerekir.
Amaç Uzantısının bu durumların her birini düzgün bir şekilde işlemesi gerekir.
[Export ("resolveRecipientsForSearchForMessages:withCompletion:")]
public void ResolveRecipients (INSendMessageIntent intent, Action<INPersonResolutionResult []> completion)
{
var recipients = intent.Recipients;
// If no recipients were provided we'll need to prompt for a value.
if (recipients.Length == 0) {
completion (new INPersonResolutionResult [] { (INPersonResolutionResult)INPersonResolutionResult.NeedsValue });
return;
}
var resolutionResults = new List<INPersonResolutionResult> ();
foreach (var recipient in recipients) {
var matchingContacts = new INPerson [] { recipient }; // Implement your contact matching logic here to create an array of matching contacts
if (matchingContacts.Length > 1) {
// We need Siri's help to ask user to pick one from the matches.
resolutionResults.Add (INPersonResolutionResult.GetDisambiguation (matchingContacts));
} else if (matchingContacts.Length == 1) {
// We have exactly one matching contact
resolutionResults.Add (INPersonResolutionResult.GetSuccess (recipient));
} else {
// We have no contacts matching the description provided
resolutionResults.Add ((INPersonResolutionResult)INPersonResolutionResult.Unsupported);
}
}
completion (resolutionResults.ToArray ());
}
[Export ("resolveContentForSendMessage:withCompletion:")]
public void ResolveContent (INSendMessageIntent intent, Action<INStringResolutionResult> completion)
{
var text = intent.Content;
if (!string.IsNullOrEmpty (text))
completion (INStringResolutionResult.GetSuccess (text));
else
completion ((INStringResolutionResult)INStringResolutionResult.NeedsValue);
}
Daha fazla bilgi için lütfen Çözümlenme Aşaması Başvurusu ve Apple'ın Çözümleme ve İşleme Amaçları Başvurusu'na bakın.
Onaylama Aşamasını İşleme
Onay Aşaması, Amaç Uzantısının kullanıcının isteğini yerine getirmek için tüm bilgilere sahip olup olmadığını denetlediği yerdir. Uygulama, Siri'ye ne olacağıyla ilgili tüm destekleyici ayrıntıları birlikte göndermek istiyor, böylece kullanıcıdan istenen eylemin bu olduğu doğrulanabilir.
[Export ("confirmSendMessage:completion:")]
public void ConfirmSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
// Verify user is authenticated and the app is ready to send a message.
...
var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Ready, userActivity);
completion (response);
}
Daha fazla bilgi için lütfen Aşama Başvurumuzu Onayla bölümüne bakın.
Amacı İşleme
Amaç Uzantısı'nın kullanıcının isteğini yerine getirmek ve sonuçları Siri'ye geri ileterek kullanıcının bilgilenebilmesini sağlamak için görevi gerçekleştirdiği nokta budur.
public void HandleSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
// Implement the application logic to send a message here.
...
var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, userActivity);
completion (response);
}
public void HandleSearchForMessages (INSearchForMessagesIntent intent, Action<INSearchForMessagesIntentResponse> completion)
{
// Implement the application logic to find a message that matches the information in the intent.
...
var userActivity = new NSUserActivity (nameof (INSearchForMessagesIntent));
var response = new INSearchForMessagesIntentResponse (INSearchForMessagesIntentResponseCode.Success, userActivity);
// Initialize with found message's attributes
var sender = new INPerson (new INPersonHandle ("sarah@example.com", INPersonHandleType.EmailAddress), null, "Sarah", null, null, null);
var recipient = new INPerson (new INPersonHandle ("+1-415-555-5555", INPersonHandleType.PhoneNumber), null, "John", null, null, null);
var message = new INMessage ("identifier", "I am so excited about SiriKit!", NSDate.Now, sender, new INPerson [] { recipient });
response.Messages = new INMessage [] { message };
completion (response);
}
public void HandleSetMessageAttribute (INSetMessageAttributeIntent intent, Action<INSetMessageAttributeIntentResponse> completion)
{
// Implement the application logic to set the message attribute here.
...
var userActivity = new NSUserActivity (nameof (INSetMessageAttributeIntent));
var response = new INSetMessageAttributeIntentResponse (INSetMessageAttributeIntentResponseCode.Success, userActivity);
completion (response);
}
Daha fazla bilgi için bkz . The Handle Stage Reference.
Intents KULLANıCı Arabirimi Uzantısı Ekleme
İsteğe bağlı Amaçlar Kullanıcı Arabirimi Uzantısı, uygulamanın kullanıcı arabirimini ve markasını Siri deneyimine getirme ve kullanıcıların uygulamaya bağlı hissetmesini sağlama fırsatı sunar. Bu uzantı ile uygulama, markanın yanı sıra görsel ve diğer bilgileri transkripte getirebilir.
Amaç Uzantısında olduğu gibi geliştirici de Intents UI Uzantısı için aşağıdaki adımı gerçekleştirir:
- Xamarin.iOS uygulama çözümüne bir Intents UI Uzantısı projesi ekleyin.
- Intents UI Uzantısı
Info.plist
dosyasını yapılandırın. - Intents UI Uzantısı ana sınıfını değiştirin.
Daha fazla bilgi için lütfen Amaçlar Kullanıcı Arabirimi Uzantısı Başvurusu ve Apple'ın Özel Arabirim Başvurusu Sağlama bölümüne bakın.
Uzantı Oluşturma
Çözüme Intents UI Uzantısı eklemek için aşağıdakileri yapın:
Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle>... öğesini seçin.
İletişim kutusundan iOS>Uzantıları>Amaç Kullanıcı Arabirimi Uzantısı'nıseçin ve İleri düğmesine tıklayın:
Ardından Amaç Uzantısı için bir Ad girin ve İleri düğmesine tıklayın:
Son olarak, Uygulama çözümüne Amaç Uzantısını eklemek için Oluştur düğmesine tıklayın:
Çözüm Gezgini, yeni oluşturulan Amaç Uzantısının Başvurular klasörüne sağ tıklayın. Ortak paylaşılan kod kitaplığı projesinin adını (yukarıda oluşturulan uygulama) denetleyin ve Tamam düğmesine tıklayın:
Info.plist'i yapılandırma
Intents UI Uzantısının Info.plist
dosyasını uygulamayla çalışacak şekilde yapılandırın.
Her tipik Uygulama Uzantısında olduğu gibi, uygulamada da ve NSExtensionAttributes
anahtarları NSExtension
bulunur. Intents Uzantısı için yapılandırılması gereken yeni bir öznitelik vardır:
IntentsSupported gereklidir ve uygulamanın Intent Extension'dan desteklemek istediği bir Amaç Sınıfı adları dizisinden oluşur.
Intent UI Uzantısı'nın Info.plist
dosyasını yapılandırmak için Çözüm Gezgini çift tıklayarak düzenlemek üzere açın. Ardından Kaynak görünümüne geçin ve düzenleyicide ve NSExtensionAttributes
tuşlarını genişletinNSExtension
:
IntentsSupported
Anahtarı genişletin ve bu uzantının destekleyeceğini herhangi bir Intent Sınıfının adını ekleyin. Örnek MonkeyChat uygulaması için şunu destekler INSendMessageIntent
:
Kullanılabilir Amaç Etki Alanlarının tam listesi için lütfen Apple'ın Amaç Etki Alanları Başvurusu'ne bakın.
Ana Sınıfı Yapılandırma
Siri'ye Intent UI Uzantısı için ana giriş noktası işlevi gören ana sınıfı yapılandırın. Arabirime IINUIHostedViewController
uyan bir alt sınıfı UIViewController
olmalıdır. Örneğin:
using System;
using Foundation;
using CoreGraphics;
using Intents;
using IntentsUI;
using UIKit;
namespace MonkeyChatIntentsUI
{
public partial class IntentViewController : UIViewController, IINUIHostedViewControlling
{
#region Constructors
protected IntentViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Do any required interface initialization here.
}
public override void DidReceiveMemoryWarning ()
{
// Releases the view if it doesn't have a superview.
base.DidReceiveMemoryWarning ();
// Release any cached data, images, etc that aren't in use.
}
#endregion
#region Public Methods
[Export ("configureWithInteraction:context:completion:")]
public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
{
// Do configuration here, including preparing views and calculating a desired size for presentation.
if (completion != null)
completion (DesiredSize ());
}
[Export ("desiredSize:")]
public CGSize DesiredSize ()
{
return ExtensionContext.GetHostedViewMaximumAllowedSize ();
}
#endregion
}
}
Siri, Intent UI Uzantısı içindeki Configure
örneğin yöntemine UIViewController
bir INInteraction
sınıf örneği geçirir.
INInteraction
nesnesi, uzantıya üç önemli bilgi parçası sağlar:
- İşlenen Intent nesnesi.
- Intent Extension'ın
Confirm
veHandle
yöntemlerinden Intent Response nesnesi. - Uygulama ile Siri arasındaki etkileşimin durumunu tanımlayan Etkileşim Durumu.
Örnek UIViewController
, Siri ile etkileşim için ilke sınıfıdır ve öğesinden UIViewController
devraldığı için UIKit'in tüm özelliklerine erişebilir.
Siri yöntemini çağırdığındaConfigure
, Görünüm Denetleyicisinin UIViewController
bir Siri Kod Parçacığında veya Haritalar Kartında barındırılacağını belirten bir Görünüm Bağlamı'na geçer.
Siri ayrıca uygulamanın yapılandırmayı tamamladıktan sonra görünümün istenen boyutunu döndürmesi gereken bir tamamlama işleyicisi de geçirir.
iOS Tasarım Aracı'de kullanıcı arabirimini tasarlama
iOS Tasarım Aracı Intents UI Uzantısı'nın kullanıcı arabirimini düzenleyebilirsiniz. Düzenlemek üzere açmak için Çözüm Gezgini uzantının MainInterface.storyboard
dosyasına çift tıklayın. Kullanıcı Arabirimini oluşturmak ve değişiklikleri kaydetmek için gerekli tüm kullanıcı arabirimi öğelerini sürükleyin.
Önemli
Intent UI Uzantısı'nın UIViewController
öğesine veya UITextFields
gibi UIButtons
etkileşimli öğeler eklemek mümkün olsa da, bunlar etkileşimli olmayan amaçlarla kullanıcı arabirimi olarak kesinlikle yasaktır ve kullanıcı bunlarla etkileşim kuramaz.
Kullanıcı Arabirimini Bağla
Intents UI Uzantısının iOS Tasarım Aracı oluşturulan Kullanıcı Arabirimi ile alt sınıfı düzenleyin UIViewController
ve yöntemini aşağıdaki gibi geçersiz kılınConfigure
:
[Export ("configureWithInteraction:context:completion:")]
public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
{
// Do configuration here, including preparing views and calculating a desired size for presentation.
...
// Return desired size
if (completion != null)
completion (DesiredSize ());
}
[Export ("desiredSize:")]
public CGSize DesiredSize ()
{
return ExtensionContext.GetHostedViewMaximumAllowedSize ();
}
Varsayılan Siri kullanıcı arabirimini geçersiz kılma
Amaçlar Kullanıcı Arabirimi Uzantısı her zaman kullanıcı arabiriminin üst kısmındaki uygulama simgesi ve ad gibi diğer Siri içeriğiyle birlikte görüntülenir veya Amaç temelinde, düğmeler (Gönder veya İptal gibi) altta görüntülenebilir.
Uygulamanın, Siri'nin kullanıcıya varsayılan olarak görüntülediği bilgileri değiştirebileceği birkaç örnek vardır. Örneğin, mesajlaşma veya uygulamanın varsayılan deneyimi uygulamaya uyarlanmış bir deneyimle değiştirebileceği haritalar.
Intents UI Uzantısının varsayılan Siri kullanıcı arabiriminin öğelerini geçersiz kılması gerekiyorsa, alt sınıfın UIViewController
arabirimi uygulaması IINUIHostedViewSiriProviding
ve belirli bir arabirim öğesini görüntülemeyi kabul etmesi gerekir.
Siri'ye Intent UI Uzantısı'nın UIViewController
ileti içeriğini zaten görüntülediğini bildirmek için alt sınıfa aşağıdaki kodu ekleyin:
public bool DisplaysMessage {
get {return true;}
}
Dikkat edilmesi gereken noktalar
Apple, geliştiricinin Intent UI Uzantılarını tasarlarken ve uygularken aşağıdaki noktaları dikkate almasını önerir:
- Bellek Kullanımının Bilincinde Olun - Amaç Kullanıcı Arabirimi Uzantıları geçici olduğundan ve yalnızca kısa bir süre gösterildiğinden, sistem tam bir uygulamayla kullanılandan daha sıkı bellek kısıtlamaları uygular.
- En Düşük ve En Yüksek Görünüm Boyutlarını göz önünde bulundurun - Intent UI Extensions'ın her iOS cihaz türünde, boyutunda ve yönlendirmesinde iyi göründüğünden emin olun. Ayrıca, uygulamanın Siri'ye geri gönderdiği istenen boyut verilemiyor olabilir.
- Esnek ve Uyarlamalı Düzen Desenlerini kullanma - Yine kullanıcı arabiriminin her cihazda harika göründüğünden emin olmak için.
Özet
Bu makalede SiriKit ele alınmıştır ve iOS cihazında Siri ve Haritalar uygulamasını kullanarak kullanıcıya erişilebilen hizmetler sağlamak için Xamarin.iOS uygulamalarına nasıl eklenebilecekleri gösterilmiştir.