一、iOS11
1.INIntent
Apple只對11個固定的領域支援Siri識別,每個領域對應不同的INIntent和INIntentHandler,以傳送資訊和支付為例,通過使用者的語音大體判斷服務領域以及INIntent。
服務領域 | 對應的INIntent | 預測語音 |
---|---|---|
發資訊 | INSendMessageIntent | 包含“訊息”的語句 |
支付 | INSendPaymentIntent、INRequestPaymentIntent | 包含“支付”的語句 |
通過“用<AppName>傳送資訊等”可呼叫第三方App執行相應功能,但前提是Siri可以識別出使用者的意圖(表格中的INIntent)
工作流程如下: 1)、 Siri完成語音識別和語義分析; 2)、會根據你詞彙中的關鍵詞識別出屬於上述11種領域中的哪一種; 3)、然後將結構化語音分析結果打包成一個某個領域的意圖(INIntent); 4)、接著交給支援這個意圖(INIntent)的第三方App處理(啟動App處理或通過Intent Extentsion後臺處理);
2.IntentHandler
根據上述識別出的不同的使用者意圖去編寫不同的IntentHandler,處理使用者的語音,做使用者意圖去做的事,IntentHandler需要遵循IntentHandling協議,IntentHandling協議分為三步:
1.Resolve階段:
處理使用者語音輸入,提取各個屬性,引數。
2.Confirm階段:
確定使用者輸入的語音資訊和意圖是否完整,不完整的話發起第二次詢問。
3.Handle階段:
執行使用者的意圖,並將處理結果展示給使用者。
3.IntentsUI
遵循INUIHostedViewControlling
協議,通過實現configureViewForParameters
方法,根據不同的使用者意圖(INIntent)展示自定義的UI。
二、iOS12 ShortCut
1.NSUserActivity
記錄使用者的操作,生成ShortCut,使用者可以在設定->Siri->All ShortCuts
中找到,可以匹配上語音,以後通過該語音呼叫使用者的操作。
- (NSUserActivity *)createUserActivityWithTitle:(NSString *)title userInfo:(NSDictionary *)userInfo{
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:kKBSiriUserActivityTypeIdentifier];
userActivity.eligibleForSearch = YES;
if (@available(iOS 12.0, *)) {
//很重要,暴露ShortCut到設定中
userActivity.eligibleForPrediction = YES;
} else {
// Fallback on earlier versions
}
userActivity.title = title;
userActivity.userInfo = userInfo;
return userActivity;
}
//在使用者操作的ViewController中繫結該NSActivity即可
viewcontroller.userActivity = userActivity;
複製程式碼
2.Intent
通過Intent也可以實現上述效果,生成ShortCut,該方法可以自定義UI
,參照IntentsUI。
//引數中的Intent就是開發者自定義的Intent,在使用者的某個操作後初始化,並暴露到設定中的ShortCut中。
INInteraction *interaction = [[INInteraction alloc] initWithIntent:intent response:response];
//很重要,暴露ShortCut到設定中
[interaction donateInteractionWithCompletion:^(NSError * _Nullable error) {
}]
複製程式碼
3.回撥處理
部分操作可以在Siri Extension中完成,不需要啟動App,如果某些業務需要啟動App處理,需要在AppDelegate中處理回撥,如下:
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
//根據不同的INIntent型別做不同的處理
if ([userActivity.activityType isEqualToString:@"INIntent類名"]) {
}
}
複製程式碼
4.新增到Siri按鈕
iOS12提供了在App內直接將ShortCut和使用者語音關聯的功能。
TestIntent *testIntent = [[TestIntent alloc] init];
testIntent.content = @"App內Siri按鈕生成的ShortCut";
INUIAddVoiceShortcutButton *button = [[INUIAddVoiceShortcutButton alloc] initWithStyle:INUIAddVoiceShortcutButtonStyleWhiteOutline];
INShortcut *shortCut = [[INShortcut alloc] initWithIntent:testIntent];
button.delegate = self;
button.shortcut = shortCut;
button.translatesAutoresizingMaskIntoConstraints = NO;
[self.addSiriView addSubview:button];
複製程式碼
有問題及時留言討論