Siri Kısayolları — nasıl uygulanır?

Yayınlanan: 2020-01-16

Geçen yılki WWDC'de sunulan yeni bir özellik olan Siri kısayolları, uygulamanın belirli işlevlerini arka planda gerçekleştirme yeteneği sunar. Uygulamada bu işlevleri kullanabilmek için uygulamayı açmamıza gerek yok, Siri'ye kısaca “Burger Time” diyebiliriz ve sistem bu kısayolun hangi uygulamaya atandığını biliyor ve bizim için bir burger sipariş ediyor.

Siri Kısayolları nedir?

  • Kilit ekranından veya arama alanından görevleri tamamlamanın uygun bir yolu.
  • iOS, HomePod ve watchOS'ta sesli bir ifadeyle çalıştırmak için Siri'ye kısayollar da eklenebilir.
  • Geliştiriciler, uygulamalarına Siri'nin bu kısayollara bağlanmasını sağlayan kısayol kancaları ekler.
  • Gerçekleştirdiğiniz ortak işlevleri analiz etmek ve otomatik olarak kısayol önermek için davranışınızın makine öğrenimi modellerini kullanma.
  • iOS 12+

Bu yazımızda, Siri Kısayollarının en popüler uygulamalarından biri olan sipariş kısayolunun uygulanmasına odaklanacağız. Hamburger sipariş etmenizi sağlayacak basit bir uygulama oluşturacağız.

Siri kısayollarını nasıl oluşturabiliriz?

Siri Kısayolları oluşturma süreci
  1. En başta, kullanıcının uygulamamızda gerçekten kolaylaştırmak istediği işlevselliği düşünmeliyiz. Bu, kullanıcının sıklıkla gerçekleştirdiği ve kullanıcının uygulamaya girmesini ve içinde uzun bir yol geçmesini gerektiren bir işlevsellik olmalıdır. Kısayollar, işlevi gerçekleştirmek için bu yolun kısaltılmasını sağlar.
  2. Bir sonraki adımda, bir kısayol bağışlamanız gerekir. Ne anlama geliyor? Örneğin pastırmalı burger gibi sipariş verdiğimizle ilgili bilgileri sisteme iletmeliyiz. Bu bilgiyi sisteme sağlarız ve daha sonra Siri, bu özel siparişi vermemiz için belirli bir zamanda bize önerebilir.
  3. Yapılması gereken en son şey , kullanıcı Siri'ye daha önce tanımlanan komutu , örneğin “Burger time” söylediğinde veya kullanıcının kilit ekranında Siri tarafından önerilen kısayola basması durumunda gerçekleşen bu kısayolu ele almaktır.

Tamam, belki biraz kod yazarız? Geliştiriciler olarak olanaklarımız nelerdir?

NSUserActivity & Intents - Siri kısayol örnekleri

NSUserActivity — Yeni bir sipariş vermek için ekranı başlatmamıza izin verecek bir kısayol oluşturacağız

  1. Anahtarı Info.plist'e ekleyin
 <key>NSUserActivityTypes</key>
<dizi>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</dizi>

2. Kullanıcı ekrana girdiğinde kısayolu bağışlayın

 let orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order")
orderActivity.isEligibleForSearch = doğru
orderActivity.isEligibleForPrediction = doğru
orderActivity.title = "Sipariş verin"
orderActivity.suggestedInvocationPhrase = "Burger zamanı"

let nitelikleri = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
öznitelikler.contentDescription = "Lezzetli hamburgerler !"
öznitelikler.thumbnailData = UIImage(adlandırılmış: "logo")?.pngData()
orderActivity.contentAttributeSet = nitelikler
userActivity = orderActivity

3. AppDelegate 'de, bu belirli türü aldıktan sonra verilen ekrana yönlendirilecek olan continueUserActivity temsilcisini uygulamanız gerekir.

 func uygulaması(_ uygulama: UIA uygulaması,
                 userActivity'ye devam et: NSUserActivity,
                 restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // açık uygulamayı sipariş ekranında işle
        doğru dön
    } 
    yanlış döndür
} 
Burger sipariş etmek için Siri kısayollarını uygulama süreci

Amaçlar - Sipariş vermek için bir kısayol uygulayacağız

Uygulamadan önce profesyonel ipucu:
Kullanıcı sistematik olarak bir şey yaptığında niyetler ortaya çıkar. Ancak, Siri'den her zaman bir öneri alabilmek için bu işlevi test etmek istediğinizde, Ayarlar -> Geliştirici'de " Son Kısayolları Görüntüle " ve " Bağışları Kilit Ekranında Görüntüle " olmak üzere iki seçeneği etkinleştirmelisiniz.

Seçenekler: Son Kısayolları Görüntüle ve Bağışları Kilit Ekranında Görüntüle
  1. Bir amaç tanım dosyası oluşturun. En iyi yol, onu projemde ayrı bir çerçeveye eklemek, OrderKit içinde olacak.
SiriKit Niyet Tanımlama Dosyası simgesi

2. Bir kategori seçin, bu durumda “Sipariş”. Bu dosyada sisteme ileteceğimiz parametreleri seçip bu parametrelerin kombinasyonlarını oluşturmalıyız.

Özel Amaç, parametreler ve kısayol türleri
Sipariş tanımı – Özel amaç oluşturun
Sipariş tanımı — Yanıtları tanımlayın
Sipariş tanımı — Yanıtları tanımlayın

3. Niyetler için bir uzantı ile yeni bir hedef oluşturun, oluştururken “UI Uzantısını Dahil Et”i seçin.

Amaç Uzantısı simgesi
Dosya -> Yeni -> Hedef… -> Amaç Uzantısı
Order.intentdefinition için Hedef Üyelik böyle görünmelidir

4. MainInterface.storyboard dosyasında amaç için bir UI oluşturun.

Amaç için kullanıcı arayüzü oluşturma
Niyetimiz için Kullanıcı Arayüzü Oluşturma

5. IntentViewController ready ve success durumunu yapılandırın.

 func configureView(parametreler için: Set<INParameter>,
                       etkileşim: INInteraction,
                       etkileşimliBehavior: INUIInteractiveBehavior,
                       bağlam: INUIHostedViewContext,
                       tamamlama: @escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    bekçi izin niyeti = etkileşim.intent olarak? OrderIntent başka {
        tamamlama(yanlış, Set(), .sıfır)
        dönüş
    }
    if interact.intentHandlingStatus == .ready {
        kurulum (ile: niyet)
        waitTime.isHidden = doğru
        tamamlama(doğru, parametreler, istenenBoyut)
    } else if interact.intentHandlingStatus == .success,
        izin ver yanıt = etkileşim.intentResponse olarak? OrderIntentResponse {
        kurulum (ile: niyet)
        waitTime.isHidden = yanlış
        izin verirseniz waitTimeText = answer.waitTime {
            waitTime.text = "Sipariş \(waitTimeText) dakika içinde hazır olacak"
        }
        EverythingIsOkLabel.text = "Siparişleri göstermek için dokunun"
        tamamlama(doğru, parametreler, istenenBoyut)
    }

    tamamlama(yanlış, parametreler, .sıfır)
}

özel işlev kurulumu (niyetle: OrderIntent) {
    burgerNameLabel.text = niyet.burgerName
    nicelik = niyet.quantity?.stringValue {
        miktarLabel.text = "\(miktar) adet."
    }
    eklemeler izin verirse = amaç. eklemeler {
        addsLabel.text = adds.elements.toString
    }
}

6. UI'yi oluşturduktan sonra niyetimizin bağışına gidebiliriz. Bu durumda, sipariş verirken niyetleri bağışlamak en iyisidir. Order.intentdefinition dosyasında daha önce tanımladığımız tüm bilgileri yani hamburger adı, miktarı ve eklemeleri ile sipariş verirken bu kısayolu hemen Siri'ye eklemek istediğimizde görüntülenen önerilen ifadeyi sağlıyoruz. .

 private func donateInteraction(sipariş için: Sipariş) {
    let etkileşim = INInteraction(intent: order.intent, yanıt: nil)
    
    etkileşim.donate { (hata) içinde
        if hata != nil {
            // işleme hatası
        } başka {
            print("Başarıyla Bağışlanan Etkileşim")
        }
    }
} 
 genel uzatma Siparişi {
    
    var aim: OrderIntent {
        orderIntent = OrderIntent() olsun
        orderIntent.burgerName = ad
        if let intValue = Int(miktar) {
            orderIntent.quantity = NSNumber(değer: intValue)
        }
        orderIntent.suggestedInvocationPhrase = "Burger zamanı"
        
        orderIntent.additions = adds.map { seçenek -> INObject in
            iade INObject(tanımlayıcı: seçenek.rawValue,
                            ekran: seçenek.rawValue)
        }
        iade emriNiyet
    }
    
}

7. Artık kullanıcının kısayol önerisi alıp üzerine tıklaması durumunda ve kullanıcının kısayolu Siri ile araması durumunda ne olacağını durumu ele alabiliriz.

 public class OrderIntentHandler: NSObject, OrderIntentHandling {
    
    public func onay(niyet: OrderIntent,
                        tamamlama: @escaping (OrderIntentResponse) -> Void) {
        tamamlama(OrderIntentResponse(kod: OrderIntentResponseCode.ready, userActivity: nil))
    }
    
    public func tanıtıcısı(niyet: OrderIntent, 
                       tamamlama: @escaping (OrderIntentResponse) -> Void) {
        bekçi izin burgerName = aim.burgerName başka {
            tamamlama(OrderIntentResponse(kod: .failure, userActivity: nil))
            dönüş
        }
        
        Defaults.save(sipariş: Sipariş(den: niyet))
        tamamlama(OrderIntentResponse.success(burgerName: burgerName, waitTime: "5"))
    }
    
} 
Siri Kısayol Demosu

Hepsi bu, her şey çalışıyor

Tüm projeyi GitHub'ımda buradan kontrol edebilirsiniz.

Kaynaklar:

  • https://developer.apple.com/videos/play/wwdc2018/211/
  • https://developer.apple.com/videos/play/wwdc2018/214/
  • https://developer.apple.com/documentation/sirikit/donating_shortcuts
  • https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
  • https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12