Siri ShortCut 调研(含Demo)

3,398 阅读2分钟

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];

有问题及时留言讨论