版本記錄
版本號 | 時間 |
---|---|
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 Center
和Spotlight
搜索中彈出的建議的形式預測用戶可能想要做的事情。 - 其次蓖康,您的用戶可以將這些活動轉變?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簡單示例峻黍,感興趣的給個贊或者關注~~~