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中处理回调,如下:
代码语言:javascript复制-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
//根据不同的INIntent类型做不同的处理
if ([userActivity.activityType isEqualToString:@"INIntent类名"]) {
}
}
4.添加到Siri按钮
iOS12提供了在App内直接将ShortCut和用户语音关联的功能。
代码语言:javascript复制 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];