1. 程式人生 > >Siri shortcuts 指北

Siri shortcuts 指北

系統支援iOS 12

工程搭建

開啟工程許可權

image.png

新增新的target

選擇File → New → Target,勾選Include UI Extension,可以使用自定義UI擴充套件。

image.png

建立Intent Definition File

方法:File → New → File

image.png

新建Intent

image.png

建立完後如下介面:

image.png

可以看到Intent是一個Category,我們可以設定型別(標示Intent的作用),新增引數(根據Siri解析命令傳入),新增標題,描述(這些會顯示在Siri喚醒我們app的時候)。

編譯的時候系統會自動生成一個子類XXXIntent : INIntent,我們需要找到這個類,使用這個類來進行我們的其他操作。

點選如下圖位置:

image.png

開發過程

許可權獲取

獲取當前許可權

INSiriAuthorizationStatus siriStatus = [INPreferences siriAuthorizationStatus];
複製程式碼

請求獲取許可權

            [INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
                switch (status) {
                    case
INSiriAuthorizationStatusAuthorized: // 成功獲取許可權 NSLog(@"許可權獲取成功"); break; case INSiriAuthorizationStatusDenied: // 成功獲取許可權 NSLog(@"許可權獲取使用者拒絕"); break; default: break
; } }]; 複製程式碼

注意新增info.plist(或者多語言)設定提示語,否則許可權請求不會彈出。

image.png

新增Siri快捷指令頁面

呼叫系統API,呼叫如下頁面。

image.png

程式碼如下:

    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地址:

developer.apple.com/documentati…

文件: developer.apple.com/documentati…