SiriKit框架詳細解析(七) —— 構建Siri Shortcuts簡單示例(一)

版本記錄

版本號 時間
V1.0 2018.12.06 星期四

前言

大家都知道隨著人工智能的發(fā)展坐求,會掀起來另外一個工業(yè)革命,而語音識別就是人工智能的初始階段,但是每個公司做的都不一樣碴开,涉及到一系列的語音的采集和算法實現(xiàn),蘋果的Siri就是業(yè)界語音識別的代表性的產(chǎn)品。接下來的幾篇我們就詳細解析一下SiriKit這個框架潦牛。感興趣的可以看下面幾篇文章眶掌。
1. SiriKit框架詳細解析(一)—— 基本概覽(一)
2. SiriKit框架詳細解析(二)—— 請求授權使用SiriKit和INPreferences類(一)
3. SiriKit框架詳細解析(三)—— 創(chuàng)建Intents App擴展(一)
4. SiriKit框架詳細解析(四)—— 構建代碼以支持App擴展和將意圖調(diào)度到處理對象(一)
5. SiriKit框架詳細解析(五) —— 編程指南之Intents和Intents UI擴展(一)
6. SiriKit框架詳細解析(六) —— 編程指南之確認和處理請求良价、指定自定義詞匯表和界面(一)

開始

首先看一下寫作環(huán)境

Swift 4.2, iOS 12, Xcode 10

在這個iOS 12教程中寝殴,您將學習如何為應用程序構建Siri快捷方式(Siri Shortcuts)并出現(xiàn)在Spotlight中,以及用您的聲音命令Siri明垢。

如果你有iPhone蚣常,你可能會與Siri互動。 當Siri于2011年first announced時痊银,無論使用何種語句的具體組合抵蚊,其理解內(nèi)容和意義的能力都是開創(chuàng)性的。

不幸的是溯革,在2016年SiriKit發(fā)布之前致稀,Siri集成僅限于Apple自己的應用程序冈闭。即便如此,您可以使用Siri進行的事情類型僅限于一組特定的域抖单。

隨著iOS 12中Siri Shortcuts的發(fā)布耍休,情況已不再如此。 現(xiàn)在货矮,您可以創(chuàng)建自定義意圖(intents)來表示任何域(domain)羊精,并且您可以將應用程序的服務直接公開給Siri。

在本教程中囚玫,您將學習如何使用這些新的快捷方式API將Siri集成到編寫應用程序中喧锦。

要開始使用,請使用已打開的入門項目抓督。雙擊TheBurgeoningWriter.xcodeproj以在Xcode中打開項目裸违。

注意:如果可能,您應該使用物理設備來學習本教程本昏。 雖然模擬器可以工作供汛,但它在某些方面表現(xiàn)不同。

bundle ID設置為您獨有的(Apple建議使用反向DNS名稱,例如com.xxx.TheBurgeoningWriter)怔昨。 然后雀久,運行應用程序,您將看到顯示所有已寫好文章的主屏幕趁舀。 從這里赖捌,您可以添加新文章并發(fā)布您之前保存的草稿。

這里的一個重要想法是寫一篇文章矮烹,稍微坐一會兒越庇,然后稍后發(fā)布 - 只要你對它感到滿意。

準備開始了嗎奉狈? 很好卤唉!


Adding Shortcuts to an App

首先要考慮的是您的應用程序的哪些功能適合轉換為快捷方式。

理想情況下仁期,您應該為用戶可以執(zhí)行的操作創(chuàng)建快捷方式桑驱;最好是他們可能反復做的事情。 一旦您決定設置快捷方式跛蛋,有兩種方法可以創(chuàng)建它:

  • NSUserActivity:用戶活動是現(xiàn)有API的一部分熬的,允許您公開用戶可以為應用程序切換和Spotlight搜索執(zhí)行的某些操作。 這里要記住的是赊级,只有當您希望用戶從Siri進入您的應用程序去完成任務時押框,此選項才有用。
  • Custom Intents:創(chuàng)建自定義意圖是快捷方式的真正威力理逊。 有意圖(intent)橡伞,您可以通過Siri與您的用戶進行通信,而無需打開您的應用程序挡鞍。

Making a Shortcut for Writing New Articles

您的第一個快捷方式是允許用戶直接進入新文章頁面的快捷方式。 這是基于NSUserActivity對象創(chuàng)建快捷方式的最佳選擇预烙,因為它會將Siri的用戶帶入您的應用程序墨微。

您的目標是每次用戶執(zhí)行該操作時將其中一個活動發(fā)送給系統(tǒng)。 您可以通過添加一個允許生成這些活動對象的新方法來實現(xiàn)扁掸。

打開Article.swift翘县,并在import下的文件頂部添加以下常量字符串定義:

public let kNewArticleActivityType = "com.razeware.NewArticle"

這是您將用于確定您是否正在處理new article快捷方式的標識符。 一個好的經(jīng)驗法則是在為快捷方式選擇標識符時使用反向DNS約定谴分。

接下來锈麸,在屬性下面添加以下方法定義:

public static func newArticleShortcut(thumbnail: UIImage?) -> NSUserActivity {
  let activity = NSUserActivity(activityType: kNewArticleActivityType)
  activity.persistentIdentifier = 
    NSUserActivityPersistentIdentifier(kNewArticleActivityType)

  return activity
}

在這里,您將使用正確的標識符創(chuàng)建一個活動對象并將其返回牺蹄。persistentIdentifier將所有這些快捷方式連接為一個活動忘伞。

為了使您的活動有用,您必須進行一些配置。

return之前添加以下兩行:

activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true

首先氓奈,將isEligibleForSearch設置為true翘魄。 這允許用戶在Spotlight中搜索此功能。 然后舀奶,將isEligibleForPrediction設置為true暑竟,以便進行預測。 將此設置為true允許Siri查看活動并在將來向您的用戶建議育勺。 它也是允許活動稍后變?yōu)榭旖莘绞降脑颉?/p>

接下來但荤,您將設置影響快捷方式對用戶的顯示方式的屬性。

定義本地屬性屬性涧至。 將其添加到以前粘貼的行下方:

let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)

通過添加以下行來設置屬性:

activity.title = "Write a new article"
attributes.contentDescription = "Get those creative juices flowing!"
attributes.thumbnailData = thumbnail?.jpegData(compressionQuality: 1.0)

這將設置您在建議通知中看到的標題腹躁,副標題和縮略圖。

退一步化借,重要的是要記住Siri以兩種不同的方式暴露這個功能:

  • 首先潜慎,Siri學會以Notification CenterSpotlight搜索中彈出的建議的形式預測用戶可能想要做的事情。
  • 其次蓖康,您的用戶可以將這些活動轉變?yōu)榛谡Z音的快捷方式铐炫。

對于最后一點配置,添加用戶在為此活動創(chuàng)建快捷方式時應考慮的建議短語:

activity.suggestedInvocationPhrase = "Time to write!"

所選擇的短語應該是簡短易記的蒜焊。 它也應該不包括Hey, Siri這個短語倒信,因為用戶可能已經(jīng)用這種方式觸發(fā)了Siri的界面。

最后泳梆,將attributes對象分配給activity對象:

activity.contentAttributeSet = attributes

既然您可以從Article中獲取用戶活動對象鳖悠,那么就可以使用它們了。


Using the Activity Object

打開ArticleFeedViewController.swift并找到newArticleWasTapped()优妙。

在注釋下方添加以下行:

//1
let activity = Article.newArticleShortcut(thumbnail: UIImage(named: "notePad"))
vc.userActivity = activity

//2
activity.becomeCurrent()
  • 1) 首先乘综,創(chuàng)建一個activity對象。 然后套硼,將它附加到屏幕上的視圖控制器卡辰。
  • 2) 接下來,調(diào)用becomeCurrent()來正式成為“當前”活動邪意。 這是向系統(tǒng)注冊活動的方法九妈。

恭喜,您現(xiàn)在已成功將此活動移交給Siri雾鬼。

建立并運行萌朱。 然后,轉到新文章頁面并返回主屏幕幾次策菜。

您不會在應用程序中看到任何有趣的內(nèi)容晶疼,但每次執(zhí)行該操作時酒贬,您都會向系統(tǒng)移交活動。

要驗證冒晰,請在主屏幕上下拉以進行搜索同衣。 然后,鍵入“write”壶运,您應該會看到Write a new article操作好啰。


Continuing a User Activity

在搜索中點擊“Write a new article”結果尿孔。 您將被帶到應用程序的主屏幕漓帅。

您的功能可能會暴露給系統(tǒng)筷凤,但是當系統(tǒng)告訴用戶想要使用該功能時,您的應用程序沒有做任何事情棵癣。

要對此請求作出反應辕翰,請打開AppDelegate.swift,并在該類的底部添加以下方法定義:

func application(
  _ application: UIApplication,
  continue userActivity: NSUserActivity,
  restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
  return true
}

在方法內(nèi)部和return語句之前狈谊,創(chuàng)建New Article視圖控制器并將其推送到導航堆棧:

let vc = NewArticleViewController()
nav?.pushViewController(vc, animated: false)

構建并再次運行喜命。 當您搜索此功能并點按它時,您的應用會直接轉到New Article屏幕河劝。


Developer Settings for Working With Siri

到目前為止你所做的一切都是從Spotlight訪問你的功能壁榕。 這不是什么新鮮事,即使Siri沒有參與赎瞎,它也會起作用牌里,因為您的活動有資格進行搜索。

要證明Siri可以開始建議此操作务甥,您需要轉到Settings應用并啟用一些選項牡辽。

打開Settings并找到Developer選項 滾動到底部,您將看到名為SHORTCUTS TESTING的部分敞临。

啟用“Display Recent Shortcuts”選項意味著最近移交的快捷方式將顯示在Spotlight搜索中态辛,而不是Siri的當前預測中。

同樣奏黑,Display Donations on Lock Screen始終會將您最近的移交內(nèi)容顯示為鎖定屏幕上的通知铣耘。

啟用這兩個選項,這樣您就可以隨時查看應用最近移交的快捷方式怒详。

現(xiàn)在你已經(jīng)知道如何看看Siri的建議是什么樣的静尼,現(xiàn)在是時候?qū)⑦@些活動變成全面的快捷方式了!


Turning User Activities Into Shortcuts

當用戶想要將其中一個活動轉換為快捷方式時,他們可以通過Settings應用進行此操作。 作為開發(fā)人員沼侣,您無需做任何其他事情雅潭。

測試一下:在您的設備上,打開Settings > Siri & Search

第一部分顯示了手機上不同應用提交給系統(tǒng)的快捷方式列表。 您將在此列表中看到“Write a new article”快捷方式;如果不這樣做赛惩,請點按More Shortcuts以查看更多內(nèi)容后雷。

要為此操作添加快捷方式琳状,請點按該操作翎承,您將進入快捷方式創(chuàng)建屏幕啊胶。

在這里,您可以看到之前添加的建議調(diào)用短語。

點按底部的紅色圓圈。 當提示時劳较,請告訴Siri驹止,“Time to write”臊恋。 在Siri確定您所說的內(nèi)容后,點按Done以完成您的快捷方式梧兼。

現(xiàn)在颜骤,您的快捷方式與您創(chuàng)建的任何其他快捷方式一起列出唧喉。


Adding Shortcuts To Siri From Your App

這一切都很順利,但您是否希望用戶在Settings應用中搗亂為您的應用添加快捷方式鸠项? 不唆阿! 一點也不。

幸運的是锈锤,您可以通過您的應用提示您的用戶直接執(zhí)行此操作驯鳖!

打開NewArticleViewController.swift,你會看到addNewArticleShortcutWasTapped()的空定義久免。

這是在點擊藍色“Add Shortcut to Siri”按鈕時調(diào)用的方法浅辙。

IntentsUI框架提供了一個特殊的視圖控制器,您可以使用快捷方式進行初始化阎姥。 然后记舆,您可以顯示此視圖控制器,以顯示您在Settings應用中看到的相同UI呼巴。

添加以下兩行以初始化快捷方式:

let newArticleActivity = Article
  .newArticleShortcut(thumbnail: UIImage(named: "notePad.jpg"))
let shortcut = INShortcut(userActivity: newArticleActivity)

接下來泽腮,創(chuàng)建視圖控制器御蒲,設置委托并顯示視圖:

let vc = INUIAddVoiceShortcutViewController(shortcut: shortcut)
vc.delegate = self

present(vc, animated: true, completion: nil)

此時,Xcode報出此類不適合作為該視圖控制器的代理诊赊。 你需要解決這個問題厚满。

在文件底部添加以下擴展名:

extension NewArticleViewController: INUIAddVoiceShortcutViewControllerDelegate {
}

然后,通過添加用戶成功創(chuàng)建快捷方式的方法來符合INUIAddVoiceShortcutViewControllerDelegate協(xié)議:

func addVoiceShortcutViewController(
  _ controller: INUIAddVoiceShortcutViewController,
  didFinishWith voiceShortcut: INVoiceShortcut?,
  error: Error?
) {
}

此外碧磅,添加用戶點擊Cancel按鈕時的方法:

func addVoiceShortcutViewControllerDidCancel(
  _ controller: INUIAddVoiceShortcutViewController) {
}

接下來碘箍,在調(diào)用這些方法時,您需要關閉Siri視圖控制器鲸郊。

將以下行添加到兩個方法:

dismiss(animated: true, completion: nil)

構建并運行以試用它丰榴! 轉到New Article view,然后點擊Add Shortcut to Siri秆撮。

你會看到一個視圖控制器看起來很像你在Settings應用程序中設置快捷方式時看到的視圖四濒。 有了這個,您的用戶將沒有理由不利用您的應用程序的全部潛力职辨!

后記

本篇主要介紹了構建Siri Shortcuts簡單示例峻黍,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拨匆,隨后出現(xiàn)的幾起案子姆涩,更是在濱河造成了極大的恐慌,老刑警劉巖惭每,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骨饿,死亡現(xiàn)場離奇詭異,居然都是意外死亡台腥,警方通過查閱死者的電腦和手機宏赘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黎侈,“玉大人察署,你說我怎么就攤上這事【海” “怎么了贴汪?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長休吠。 經(jīng)常有香客問我扳埂,道長,這世上最難降的妖魔是什么瘤礁? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任阳懂,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘岩调。我一直安慰自己巷燥,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布号枕。 她就那樣靜靜地躺著缰揪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堕澄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天霉咨,我揣著相機與錄音蛙紫,去河邊找鬼。 笑死途戒,一個胖子當著我的面吹牛坑傅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喷斋,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼唁毒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了星爪?” 一聲冷哼從身側響起浆西,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顽腾,沒想到半個月后近零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡抄肖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年久信,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓摩。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡裙士,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出管毙,到底是詐尸還是另有隱情腿椎,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布夭咬,位于F島的核電站酥诽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏皱埠。R本人自食惡果不足惜肮帐,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧训枢,春花似錦托修、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至十酣,卻和暖如春涩拙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耸采。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工兴泥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虾宇。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓搓彻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘱朽。 傳聞我的和親對象是個殘疾皇子旭贬,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容