Creați extensii SiriKit în iOS 10

Ce veți crea

Introducere

Întrucât Siri a fost introdus în 2011, dezvoltatorii de iOS au cerut posibilitatea integrării aplicațiilor terță parte cu acesta. Odată cu lansarea iOS 10 în timpul WWDC 2016, Apple a făcut în sfârșit SiriKit disponibil pentru dezvoltatori. Există încă anumite restricții cu privire la tipurile de aplicații care pot beneficia de Siri, dar este un pas în direcția cea bună. Să aruncăm o privire la ce putem face cu Siri.

Pentru mai multe informații despre SiriKit și despre celelalte caracteristici noi pentru dezvoltatorii din iOS 10, vizitați cursul lui Markus Mühlberger, chiar aici pe Envato Tuts+.

Domenii acceptate

Pentru a utiliza SiriKit, aplicația trebuie să se afle în unul sau mai multe dintre următoarele domenii:

  • Apelarea VoIP (de exemplu, Skype)
  • Mesagerie (WhatsApp)
  • Plăți (Square, PayPal)
  • Fotografie (Fotografii)
  • Antrenamente (Runtastic)
  • Ride rezervare (Uber, Lyft)
  • CarPlay (numai furnizori de autovehicule)
  • Rezervări pentru restaurante (necesită sprijin suplimentar de la Apple)

Dacă aplicația dvs. nu aparține niciuneia dintre aceste categorii, din păcate, nu puteți utiliza aplicația Siri în aplicația dvs. în acest moment. Nu lăsa totuși, totuși, deoarece SiriKit este foarte puternic și poate obține noi capabilități în viitor!

Arhitectura extensiei

O extensie SiriKit este în realitate compusă din două tipuri de extensii. Un intenţii este necesară o extensie și se ocupă de manipularea solicitărilor de către utilizator și de executarea unei anumite sarcini în aplicația dvs. (cum ar fi inițierea unui apel, trimiterea unui mesaj etc.).

Pe de altă parte, o IntentsUI extinderea nu este obligatorie. Ar trebui să creați unul numai dacă doriți să personalizați interfața cu utilizatorul pe care o arată Siri la prezentarea datelor dvs. Dacă nu faceți acest lucru, va fi afișată interfața standard Siri. Vom analiza ambele tipuri de extensii în acest tutorial.

Pentru informația dvs., în timpul WWDC 2016, Apple a lansat două videoclipuri foarte interesante despre SiriKit. Poate doriți să le verificați:

  • Introducerea SiriKit - Sesiunea 217
  • Extinderea aplicațiilor dvs. cu SiriKit - Sesiunea 225

Exemplu de proiect

Vom construi o aplicație simplă care procesează plăți prin Siri. Scopul este de a procesa cu succes propoziția "Trimiteți $ 20 către Patrick via TutsplusPayments". Formatul propoziției constă într-o sumă de bani cu o anumită monedă, numele beneficiarului și aplicația care trebuie utilizată pentru a finaliza tranzacția. Vom analiza mai târziu intenția de plată în detaliu.

Configurare inițială

Să începem prin crearea unui proiect standard Xcode în Swift și oferindu-i un nume. Există câțiva pași obligatorii pe care trebuie să le faceți înainte de a scrie orice cod pentru a permite aplicației dvs. să utilizeze API-urile lui Siri.

1. Selectați Tortul tăuobțineți> Capabilități și să permită capacitatea Siri. Asigurați-vă că drepturile au fost create cu succes în structura proiectului.

2. Deschideți aplicația Info.plist și adăugați cheia NSSiriUsageDescription. Valoarea trebuie să fie un șir care explică utilizarea dvs. de Siri care va fi afișată utilizatorului atunci când vi se cere permisiunea inițială.

3. Selectați Fișier> Nou> Țintă. În noua fereastră prezentată de Xcode, sub Extensii de aplicație, alege Intenția de prelungire. De asemenea, selectați opțiunea de a include o extensie UI. Acest lucru vă va salva de la ulterior necesitatea de a crea o altă extensie separată.

În Info.plist fișierul nou creat intenţii țintă, extindeți complet NSExtension dicționar pentru a studia conținutul său. Dicționarul descrie în detaliu care intenții acceptă extensia dvs. și dacă doriți să permiteți utilizatorului să invocieze intenția în timp ce dispozitivul este blocat. 

Introduceți cele mai relevante intenții din partea de sus, dacă doriți să acceptați mai multe. Siri utilizează această comandă pentru a afla care dintre utilizatori dorește să folosească în caz de ambiguitate.

Acum trebuie să definim ce intenții vrem să susținem. În acest exemplu, vom construi o extensie care să susțină intenția de plată. Modificați Info.plist fișier pentru a se potrivi cu următoarea imagine.

Aici specificăm că vrem să ne descurcăm INSendPaymentIntent și că solicităm ca dispozitivul să fie deblocat. Nu vrem ca străinii să trimită plăți atunci când dispozitivul este pierdut sau furat!

iOS Target

Următorul pas implică scrierea unor coduri în aplicația iOS. Trebuie să cerem utilizatorului permisiunea de a trimite vocea la Apple pentru analiză. Pur și simplu trebuie să importăm intenţii cadru și numiți metoda potrivită după cum urmează:

import Import UIKit Clasa Intents ViewController: UIViewController override func viewDidLoad () super.viewDidLoad () // Solicita permisiunea de a accesa Siri INPreferences.requestSiriAuthorization authorizationStatus in switch authorizationStatus case .authorized: print ("Autorizat") implicit: "Neautorizat")     

Dialogul rezultat prezentat utilizatorului în timpul primei lansări a aplicației va arăta astfel.

Acesta este tot ce trebuie să facem în aplicația noastră simplă iOS. Să intrăm acum în lumea extinderilor!

Intenția de prelungire

Treceți la intenţii extensie pe care am creat-o mai devreme. Extindeți conținutul acestuia în navigatorul de proiecte Xcode. Veți vedea doar un fișier numit IntentHandler.swift.

Acest fișier este punctul de intrare al extensiei dvs. și este folosit pentru a face față oricăror intenții pe care vi le-a trimis Siri. Siri va transmite la handler (pentru :) metoda toate intențiile în cazul în care extensia acceptă mai multe tipuri. Este de datoria ta să verificați tipul INIntent obiect și să o manipuleze în mod corespunzător.

IntentHandler.swift șablonul conține deja o implementare de exemplu a intenției de mesagerie. Înlocuiți tot codul cu următoarea metodă goală, astfel încât să putem merge împreună prin fiecare pas.

clasa IntentHandler: INExtension override func handler (pentru intenție: INIntent) -> Any? // Aceasta este implementarea implicită. Dacă doriți ca diferite obiecte să se ocupe de intenții diferite, // puteți să o înlocuiți și să returnați manualul pe care îl doriți pentru intenția respectivă. returnează-te

Fiecare intenție are un protocol asociat pentru a vă asigura că o clasă implementează toate metodele necesare. Majoritatea protocoalelor din cadrul Intents au aceeași structură.

Se numește protocolul pe care îl vom implementa INSendPaymentIntentHandling. Acest protocol conține următoarele metode necesare și opționale:

  • Necesar:
    mâner (sendPayment: finalizarea :) 
  • Opțional:
    confirmă (sendPayment: finalizarea :) 
    resolvePayee (forSendPayment: cu :)
    resolveCurrencyAmount (forSendPayment: cu :)
    resolveNote (forSendPayment: cu :)

Să creăm o extensie a IntentHandler clasa în același fișier Swift pentru a implementa singura metodă cerută.

extensie IntentHandler: INSendPaymentIntentHandling func handle (sendPayment intent: INSendPaymentIntent, completare: @escaping (INSendPaymentIntentResponse) -> Void) // Verificați dacă avem valori valide pentru beneficiar și valutăPartiguitorul lasă beneficiarul = intent.payee, currencyAmount else finalizare return (INSendPaymentIntentResponse (cod: .unspecified, userActivity: nil)) / / Asigurați-vă plata! print ("Trimiterea plății \ (suma) către \ (beneficiarul)!") (INSendPaymentIntentResponse (cod: .success, userActivity: nil))

Aceasta este o implementare foarte de bază. Ne asigurăm că este valabil beneficiar și currencyAmount pentru a seta tranzacția ca reușită. S-ar putea să nu credeți, dar funcționează deja! Selectați schema Intents din Xcode și rulați-o. Când Xcode prezintă meniul obișnuit pentru a alege o aplicație pentru a rula, selectați Siri.

Când începe Siri, încercați să spuneți "Trimiteți-i lui Patrick $ 20 prin TutsplusPayments". Bucurați-vă acum de prima plată reușită realizată cu vocea dvs.!

De asemenea, puteți încerca să testați cazul de eșec. Încercați să spuneți aceeași propoziție ca înainte, dar fără a specifica beneficiarul (adică "Trimiteți 20 $ prin TutsplusPayments"). Veți vedea că Siri va eșua și va prezenta utilizatorului un buton pentru a continua plata în aplicația dvs..

În cazul în care Siri nu înțelege sau nu este prevăzut cu unul dintre parametrii opționali, dar aveți nevoie de o valoare validă, puteți implementa una dintre metodele de rezolvare. Aceste metode oferă utilizatorului posibilitatea de a oferi mai multe detalii despre plată, cum ar fi numele beneficiarului, suma exactă a valutei și chiar o notă. Cu această arhitectură inteligentă a API, în calitate de dezvoltator sunteți prezentați cu posibilitatea de a înțelege cu ușurință și în mod clar cererea utilizatorului în diferite moduri.

Într-o aplicație din lumea reală, veți crea un cadru dinamic care este distribuit între aplicația dvs. io extensii. Folosind această arhitectură, puteți împărtăși aceeași logică de afaceri în mai multe ținte. Nu va trebui să o implementați de mai multe ori, ci doar o singură dată pentru toate țintele!

Intensi UI Extension

În ultima parte a acestui tutorial, vă voi arăta cum puteți personaliza interfața cu utilizatorul afișată de Siri.

Mai întâi de toate, nu uitați să setați clasa de intenție corectă pe care doriți să o gestionați în Info.plist din ExtensionUI, așa cum am făcut în secțiunea anterioară.

Săriți în extensia Interfața de utilizare Intents și veți vedea șablonul pe care Xcode l-a creat pentru dvs. Conține o IntentViewController, care este o subclasă simplă de UIViewController care implementează INUIHostedViewControlling protocol. De asemenea, a fost creat un fișier Storyboard pentru dvs.; deschideți-l astfel încât să putem începe personalizarea interfeței cu utilizatorul.

Adauga o UIImageView ca fundal și o etichetă în centru. Descărcați imaginea de fundal, importați-o în destinația Intervalul de utilizare a intenției și setați-o ca imaginea nou creată UIImageView. Creeaza o UILabel obiect și poziționează-l în centrul vederii. Puteți utiliza cu ușurință AutoLayout pentru a configura constrângerile din Storyboard.

Deschideți editorul asistent și creați un editor @IBOutlet pentru eticheta dvs. și apelați-o EtichetăConținut. Rezultatul ar trebui să arate astfel:

Deschide IntentViewController fișier și veți vedea o grămadă de exemplu de cod. Puteți elimina orice, cu excepția celor configura (cu: context: finalizarea :) pe care o vom implementa acum. Această metodă este apelată atunci când interfața cu utilizatorul este gata să fie configurată. Ceea ce trebuie să facem aici este setarea conținutului UILabel.

clasa IntentViewController: UIViewController, INUIHostedViewControlling @IBOutlet slab var contentLabel: UILabel! // MARK: - INUIHostedViewControlling func configure (cu interacțiune: INInteraction !, context: INUIHostedViewContext, completare: ((CGSize) -> Void)!) Dacă interogare paymentIntent = interaction.intent as? INSendPaymentIntent // Dacă una dintre aceste proprietăți nu este setată, utilizați interfața implicită. pază lăsați suma = payIntent.currencyAmount? .cumpărați, let currency = plataIntent.currencyAmount? .currencyCode, let name = payIntent.payee? .displayName alt return complete (CGSize.zero) let paymentDescription = "\ (sum) valută) la \ (nume) "contentLabel.text = paymentDescription dacă permiteți finalizarea = finalizarea completare (auto.desiredSize) var wantedSize: CGSize return self.extensionContext! .hostedViewMaximumAllowedSize

În primul rând, verificăm dacă scop obiect este de tip INSendPaymentIntent. Dacă este, asigurați-vă că toate proprietățile pe care dorim să le afișăm nu sunt zero, altfel pur și simplu sunăm blocul de completare cu o dimensiune de zero pentru a ascunde vizualizarea personalizată. Dacă totul merge așa cum ne așteptăm, vom crea un șir personalizat cu datele pe care dorim să le afișăm utilizatorilor și le vom seta ca textul EtichetăConținut.

Rulați extensia din nou și veți vedea noua vizualizare din interiorul lui Siri!

Siri încă arată afișarea implicită. Îl putem ascunde făcând controlerul nostru de vizualizare să fie în conformitate cu INUIHostedViewSiriProviding protocol.

clasa IntentViewController: UIViewController, INUIHostedViewControlling, INUIHostedViewSiriProviding // Codul anterior merge aici ... var displaysPaymentTransaction: Bool return true

Prin întoarcere Adevărat în displaysPaymentTransaction variabilă, îi spunem lui Siri că controlerul nostru de vizualizare se ocupă de afișarea tuturor informațiilor necesare utilizatorului și că vizualizarea implicită poate fi ascunsă. Rezultatul este mult mai curat acum!

Notă: După cum puteți vedea în această imagine, atunci când specificați o altă monedă decât SUA, Siri înțelege corect și returnează codul valutei la extensie. Din păcate, textul afișează întotdeauna dolari americani. Am raportat acest bug Apple!

Concluzie

Sper că v-ați bucurat de acest tutorial. Siri este foarte puternic chiar dacă este limitat la anumite tipuri de aplicații în acest moment. Dacă aveți de gând să îl implementați în propriile aplicații, asigurați-vă că îl comercializați bine utilizatorilor, deoarece este posibil să nu știe cât de cool și avansate a devenit aplicația dvs.!

Dacă doriți să aflați mai multe despre integrarea aplicației Siri în aplicația dvs. sau dacă doriți să aflați despre unele dintre celelalte funcții de dezvoltare cool ale iOS 10, consultați cursul lui Markus Mühlberger.

De asemenea, verificați câteva din celelalte tutoriale gratuite despre caracteristicile iOS 10.

Cod