Siri shortcuts 指北
阿新 • • 發佈:2018-12-19
系統支援iOS 12
工程搭建
開啟工程許可權
新增新的target
選擇File → New → Target,勾選Include UI Extension,可以使用自定義UI擴充套件。
建立Intent Definition File
方法:File → New → File
新建Intent
建立完後如下介面:
可以看到Intent是一個Category,我們可以設定型別(標示Intent的作用),新增引數(根據Siri解析命令傳入),新增標題,描述(這些會顯示在Siri喚醒我們app的時候)。
編譯的時候系統會自動生成一個子類XXXIntent : INIntent,我們需要找到這個類,使用這個類來進行我們的其他操作。
點選如下圖位置:
開發過程
許可權獲取
獲取當前許可權
INSiriAuthorizationStatus siriStatus = [INPreferences siriAuthorizationStatus];
複製程式碼
請求獲取許可權
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
switch (status) {
case INSiriAuthorizationStatusAuthorized: // 成功獲取許可權
NSLog(@"許可權獲取成功");
break;
case INSiriAuthorizationStatusDenied: // 成功獲取許可權
NSLog(@"許可權獲取使用者拒絕");
break;
default:
break ;
}
}];
複製程式碼
注意新增info.plist(或者多語言)設定提示語,否則許可權請求不會彈出。
新增Siri快捷指令頁面
呼叫系統API,呼叫如下頁面。
程式碼如下:
GotoPageIntent *intent = [[GotoPageIntent alloc] init]; // GotoPageIntent為我們自定義的Intent,找不到看上面
intent.suggestedInvocationPhrase = @"開啟app"; // 這是建議的提示語,會展示在頁面上
INShortcut *shortcurt = [[INShortcut alloc] initWithIntent:intent];
INUIAddVoiceShortcutViewController *addvc = [[INUIAddVoiceShortcutViewController alloc] initWithShortcut:shortcurt];
addvc.delegate = self;
[self presentViewController:addvc animated:YES completion:nil];
複製程式碼
處理回撥:
/*!
@abstract Called after the user finishes the setup flow for the voice shortcut, with either the successfully-added voice shortcut, or an error.
@discussion Your implementation of this method should dismiss the view controller.
*/
- (void)addVoiceShortcutViewController:(INUIAddVoiceShortcutViewController *)controller didFinishWithVoiceShortcut:(nullable INVoiceShortcut *)voiceShortcut error:(nullable NSError *)error; {
if (!error) {
[controller dismissViewControllerAnimated:YES completion:nil];
}
}
/*!
@abstract Called if the user cancels the setup flow; the voice shortcut was not added.
@discussion Your implementation of this method should dismiss the view controller.
*/
- (void)addVoiceShortcutViewControllerDidCancel:(INUIAddVoiceShortcutViewController *)controller; {
[controller dismissViewControllerAnimated:YES completion:nil];
}
複製程式碼
處理Siri Shortcuts觸發的回撥
- 自定義xxxIntentHandler,繼承自NSObject。遵循xxxIntentHandling(這個是我們Xcode自己生成的,找的方法見上面建立Intent Definition File中),在裡面實現我們需要的邏輯。
- (void)handleGotoPage:(GotoPageIntent *)intent completion:(void (^)(GotoPageIntentResponse *response))completion NS_SWIFT_NAME(handle(intent:completion:)) {
// GotoPageIntentResponseCodeContinueInApp 開啟app
// GotoPageIntentResponseCodeSuccess 回撥成功
GotoPageIntentResponse *response = [[GotoPageIntentResponse alloc] initWithCode:GotoPageIntentResponseCodeSuccess userActivity:nil];
completion(response);
}
複製程式碼
- 開啟我們的Extension,IntentHander方法。處理我們自己定義的Intent。
- (id)handlerForIntent:(INIntent *)intent {
if ([intent isKindOfClass:[GotoPageIntent class]]) {
return [[GotoAppIntentHandler alloc] init];
}
return self;
}
複製程式碼
自定義 ExtensionUI
可以自定義Siri撥出app的樣式,在IntentViewController中開發。
參考資料
WWDC視訊:
developer.apple.com/videos/play…
蘋果Demo地址: