SiriKit ile Uygulama Geliştirme

Kaan Yıldırım
Codable
Published in
6 min readNov 19, 2017

Bu yazıda Apple’ın iOS 10 ile geliştiricilerine kısıtlı da olsa açtığı, iOS 11 ile de yeni özellikler eklediği SiriKit’i inceleyip devamında ufak bir uygulama nasıl oluşturulur onu göstermeye çalışacağım.

Çalışma Mantığı

SiriKit sadece Apple’ın sunduğu kategoriler üzerinde çalışmaktadır. Biz bunlara Domain diyeceğiz. Şuan itibari ile sunulan Domain listesi aşağıdaki gibidir;

  • VoIP aramalar (VoIP Calling) : Arama başlatma ve kullanıcının arama geçmişini gözlemleme işlemleri domaini.
  • Mesajlaşma (Messaging) : Mesaj gönderme ve kullanıcıya gönderilen mesajları arama işlemleri domaini.
  • Ödemeler (Payments) : Kullanıcılar arası para gönderme ve fatura ödeme işlemleri domaini.
  • Listeleme ve Notlar (Lists and Notes) : Not alma ve yapılacaklar listesi hazırlama ve yönetme işlemleri domaini.
  • Barkod Okuma (Visual Codes) : Barkodları okuma ve yönlendirme işlemleri domaini.
  • Fotoğraflar (Photos) : Fotoğraf arama ve gösterme işlemleri domaini.
  • Antrenman Çalışmaları (Workouts) : Fitness gibi spor aktivitelerini başlatma, bitirme ve yönetme işlemleri domaini.
  • Sürüş Rezervasyonu (Ride Booking) : Uber gibi uygulamalardan sürüş rezervasyonu yaptırma ve raporlama işlemleri domaini.
  • Araba Komutları (Car Commands) : Araç kilidini yönetme ve aracın genel durumunu öğrenme işlemler domaini.
  • CarPlay : Araçta bulunan CarPlay sistemi(Apple ürünü) ile etkileşime geçme işlemleri domaini.
  • Restoran Rezervasyonu (Restaurant Reservations) : Haritalar uygulamasının yardımı ile restoran rezervasyonu oluşturma ve yönetme işlemlri domaini.

Domainleri öğrendikten sonra sıra geldi Intent yapısını öğrenmeye. Intentler uygulamamızda kullandığımız domainin alt kırılımıdır. Uygulamamızda SiriKit kullanırken hangi intentleri kullanacağımızı belirtmemiz gerekmektedir. Örneğin birazdan uygulamamızda da kullanacağımız Listeleme ve Notlar (Lists and Notes) domaininde şu intentler bulunmaktadır;

  • INCreateNoteIntent : Yeni bir not oluşturmak için bir istek.
  • INAppendToNoteIntent : Bir nota içerik ekleme isteği.
  • INSearchForNotebookItemsIntent : Not, görev ve hatırlatıcı arama isteği.
  • INCreateTaskListIntent : Yeni bir görev listesi oluşturma isteği.
  • INAddTasksIntent : Görev listesine görev ekleme isteği.
  • INSetTaskAttributeIntent : Görevin niteliklerini değiştirme isteği.

Genel yapıyı anlamak için öğrenmemiz gereken son konu ise SiriKit ile uygulama geliştirirken bir intenti nasıl uygulayacağımız. Bu konu da Apple tarafından gayet kolaylaştırılmış. Her bir intenti uygulamak için üç aşamadan geçirmemiz gerekiyor;

  1. Resolve: Kullanıcının isteğini yerine getirmek için ihtiyaç duyduğumuz bilgileri doğrulamak için bir parametrelerini çözmemiz gerekir. Kullanıcı Siri ile konuştuğunda, Siri kullanıcının sözlü komutlarını eyleme geçirilebilir veriye dönüştürür ve bu verileri bir nesneye yerleştirir. Her bir parametreyi tek tek doğrulamamız gerekir. Her yöntemde, sağlanan verileri doğrularız ve parametrenin çözümündeki başarınızı veya başarısızlığınızı gösteren bir çözünürlük sonucu nesnesi oluştururuz. Siri ‘den gelen isteği çözümleme, parametrelerin doğruluğunu kontrol etme, Hata var ise kullanıcıya bilgi verme, Devam etmek için gereken bilgiye sahip olduğunuzdan emin olma bu adımda yapılan işlemlerdir.
  2. Confirm: Parametreleri çözdükten sonra, fakat işleme almadan önce, SiriKit onaylamamızı isteyebilir. Onay aşaması, parametrelerin nihai doğrulamasını gerçekleştirme ve gerekli tüm servislerin mevcut olduğunu doğrulama aşamasıdır. Örneğin, şirketinizin sunucusu ile iletişim kurabildiğinizi onaylayabilirsiniz. Son doğrulamayı yaptıktan sonra, SiriKit’e, isteği nasıl yöneteceğinizi gösteren bir yanıt nesnesi sağlamak gerekir. Parametrelerinin son geçerliliğini doğrulama ve hizmetlerin görevini yerine getirmeye hazır olduğundan emin olma bu adımda yapılan işlemlerdir.
  3. Handle: İsteği çözüp ve onayladıktan sonra, SiriKit, kullanıcının isteğini yerine getirerek isteği ele almamızı ister. İstekle uğraşırken şunlar yapılır;
    ilişkili görevi yerine getirme ve ne yapıldığını gösteren bir yanıt nesnesi döndürme. Çoğu amacınızı doğrudan uygulama eklentinizden alırız, ancak bazı durumlarda SiriKit’den uygulamamızın isteği işleme almasına izin vermesini isteyebiliriz. Siri’den gelen onaylanmış isteği uygulama bu adımda yapılan işlemdir.

SiriKit ile uygulama geliştirirken anlamamız gereken şeyleri ve genel işleyişi görmüş olduk. Şimdi ufak bir liste uygulaması ile öğrendiklerimizi nasıl kullanacağımızı ve nelere dikkat edeceğimizi göreceğiz şimdi.

Örnek Proje: SiriListesi

Uygulamamızın basit bir şekilde Siri üzerinden listeye eleman ekleyecek..Haydi başlayalım :)

İlk olarak projemizi oluşturuyoruz. İsmi önemli değil istediğiniz ismi verebilirsiniz. Ben SiriListesi adını vereceğim.

Şimdi ise uygulamamıza SiriKit’i entegre etme vaktimiz geldi. Bunun için önce uygulamamıza Intents Extension targetı eklememiz gerekiyor. File -> New -> Target. İsmine SiriExtension diyebiliriz.

Ekledikten sonra bize “Scheme aktifleştirmek ister misiniz?” tarzında bir soru soracak. Buna Activate dememiz gerekiyor. Bu bize SiriExtension’ımızı test etmemizi sağlayacak.

Extension’ı oluşturduğumuzda Apple bize iki adet dosya oluşturuyor. ilki IntentHandler.swift ikincisi ise Info.plist.Projemizin bu aşamadaki hali şu şekilde olmalı.

Bu dosyaları Apple template olarak Mesajlaşma (Messaging) domaine göre ayarlamış olarak getiriyor. Bizim bu dosyaları kendi domainimize göre düzenlememiz gerekiyor. İlk olarak Info.plist ten başlayalım. Mevcut durumda dosya şu şekilde iken;

aşağıdaki gibi olacak şekilde düzenleyelim. Bu şekilde girişte bahsettiğim gibi kullanacağımız intentleri burada belirtmiş oluyoruz. Uygulamada sadece aktif olarak INAddTasksIntent kullanacak olsak da INSetTaskAttributeIntent ve INCreateTaskListIntent’i de eklemek durumundayız.

Şimdi sıra geldi IntentHandler.swift dosyamızı düzenlemeye. İçerideki tüm kodları şu kod ile değiştirelim.

IntentHandler.swift dosyamız Siri ile olan tek iletişim kaynağımız. Temel olarak üç ana fonksiyon mevcut; resolve, confirm, handle.

Resolve fonksiyonumuzda şuan için sadece success gönderiyoruz. Çünkü filtrelemek veya kontrol etmek gibi bir özellik istemiyoruz uygulamamızda. Peki ya uygulamamıza eklemek istediğimiz elemanlarda hiç “a” harfinin olmamasını isteseydik(saçma ama basit :)) ne olacaktı? İşte bu gibi durumlarda resolve içerisinde Siri’den gelen parametreleri saf data olarak aldığımızdan(String), gelen parametrelerin içerisinde “a” var mı diye bakıp varsa completion(false) gönderecektik.

Confirm fonksiyonumuzda eklenmesini istediğimiz eleman listemizin olup olmadığına ve en az 1 eleman olması gerektiği kontrolünü yaptık.

Handle fonksiyonumuzda da listemizi aldık ve liste elemanlarından ilkini uygulama listemize ekledik. Burada iki noktaya dikkat çekmek istiyorum. İlki elaman listesinden sadece ilk elemanı almamızın hiç bir sebebi yok ben sadece orada response.addedTasks = [onlyFirstTask] kodu kullanılabilinsin diye o şekil ilerledim. İkinci ise uygulamamız şuanda Siri’den gelen komutu işliyor ve elemanı listeye ekliyor gibi gözükse de aslında uygulamada herhangi birşey eklemiyor olması. Bunun sebebi de buradaki amacımın sadece SiriKit implementasyonunu göstermek olduğu için yapıyı eklememiş olmam. Yapı için kodda commentte belirtttiğim adımda (addToApp(response.addedTasks)) uygulama ile iletişime geçip listeyi uygulamaya bildirmemiz gerekiyor. Bunun için de bu adımda listeyi DB ye yazabilir ve uygulama açılınca bu DB den okuyabilirsiniz. Veya daha basit olarak listeyi UserDefaults’a yazıp sonrasında uygulamanızdan UserDefaults’tan okuyabilirsiniz. Bu tamamen size kalmış :)

SiriKit implementasyonumuz tamamlandı. Ana uygulamamızda da gerekli düzenlemeleri yaptıktan sonra test edebiliriz. Uygulamaya Siri iznimizi eklememiz gerekiyor. Bunun için ilk olarak AppDelegate.swift dosyamızın başına `import Intents` ekleyip, didFinishLaunchingWithOptions metodumuza şu kodu ekliyoruz.

INPreferences.requestSiriAuthorization { status in
if status == .authorized {
print("Hey, Siri!")
} else {
print("Nay, Siri!")
}
}

Ardından ana uygulamamızdaki Info.plist dosyasına Privacy — Siri Usage Description değerimizi ekliyoruz.

Son olarak Capabilities kısmından Siri’yi enable ediyoruz. İşlem tamam, şimdi deneyelim. İlk önce uygulamamızı açıyoruz ki Siri’ye izin verebilelim.

Allow dedikten sonra SiriExtension’ını çalıştırabiliriz. Bunun için Xcode’dan SiriExtension scheme seçmemiz gerekiyor. Run dedikten sonra Siri otomatik olacak açılacak. Not olarak şunu belirtmek istiyorum. Benim gibi simulatör kullanıyorsanız, Siri’nin Türkçe anlayabilmesi için simulatörün ayarlarından hem telefon dili hem de Siri dili Türkçe seçilmeli.

Siri’ye bu komutu verdikten sonra Siri uygulamamızdaki intentler ile isteği karşılaştırıp isteğimiz gerçekleştirecek.

Voala! Uygulamamızda Siri komutu ile listeye eleman ekledik. Bundan sonrasi sizin hayal gücünüze kalmış :)

Sonuç

Siri her iOS sürümü ile yeni özelliklere kavuşuyor ve duracak gibi de gözükmüyor. Günümüzde insanlar gitgide yoğunlaşıyorlar ve bazı şeylere ayırabildikleri zaman azalıyor. Artık aynı anda iki, üç iş yapmaya çalışıyoruz. Sesli asistanlar ile bu işleri ne kadar kısaltır ve düzenli tutarsak geliştirdiğimiz uygulamalar, teknolojiler de o kadar çok sevilir ve kullanılırlar.

Referanslar

--

--