Siri ShortCut 調研(含Demo)

tingdongli發表於2018-09-01

Demo地址

一、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];
複製程式碼

有問題及時留言討論

相關文章