美文网首页
Siri捷径相关

Siri捷径相关

作者: Saylor_Lone | 来源:发表于2019-09-25 11:08 被阅读0次

    关于App接入Siri功能的文章有很多,但实际在写项目的时候还是有一些疑惑。
    写这篇软文,主要是提炼一下要点。

    基础补充

    捷径接入方式 - INShortcut

    【INIntent】

    /*!
     @abstract Creates a shortcut with the given intent.
     @param intent Must have a title and have valid shortcut types.
     @return Will return @c nil (and log an error) if the intent isn't valid.
     */
    - (nullable instancetype)initWithIntent:(INIntent *)intent;
    

    【NSUserActivity】

    /*!
     @abstract Creates a shortcut with the given user activity.
     */
    - (instancetype)initWithUserActivity:(NSUserActivity *)userActivity;
    
    
    区别
    • INIntent:需要创建Intents.intentdefinition文件,创建自定义的Intent,编译器会自动生成相应的源文件xxxIntent.h
    • NSUserActivity: 不需要创建文件等等
    关于权限 !!!

    这是最初看一些文章和苹果开发文档,并且参考其他App时很疑惑的地方。

    • 单纯的接入捷径支持,不需要处理任何权限相关的事情,也不需要开启 Capabilities-Siri

    • 通过 Siri 使用


      设置页

    在一些应用的设置页中(如:微信、印象笔记),可以看到这一选项。其开关状态,可以赋予用户权限控制(印象笔记中 关闭该选项将无法创建或编辑捷径,并且伴随完善的提示)。可能当你满心欢喜的接入捷径后,却发现并没有这一选项。其实并不是你做错了,或者遗漏了。

    实际上通过 Siri 使用这一选项是为iOS系统预置的Siri domains准备的,只有支持domians中任意一项的应用才会支持权限控制选项

    siri domains
    • 如果支持权限控制
      这里建议找寻和App项目中功能相近的domain 也可以成为 SYSTEM INTENT,不要滥用。
      基本步骤如下:
      a. 创建Intents.intentdefinition文件,添加Customize System Intent
      b. 创建IntentsExtension扩展,如有UI需求可创建Intents UI Extension
      c. 开启 Capabilities-Siri,修改info.plist添加权限描述等
      d. 为扩展创建证书等
      e. Coding...
    关于调试

    由于之前调试过通知扩展,很轻车熟路的就选中了IntentsExtensionscheme 运行项目,然而打在IntentHandler的断点始终不触发。参考App Extension调试,操作了一次后随即正常。令人费解之处在于,之后运行项目并不需要这些均可以正常调试。

    崩溃探究

    在上面的调试生效后,喜闻乐见的看到了一处崩溃。

    - (void)handleCreateNote:(nonnull INCreateNoteIntent *)intent completion:(nonnull void (^)(INCreateNoteIntentResponse * _Nonnull))completion {
        NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INCreateNoteIntent class])];
        INCreateNoteIntentResponse *response = [[INCreateNoteIntentResponse alloc] initWithCode:INCreateNoteIntentResponseCodeSuccess userActivity:userActivity];
        INNote *note = [[INNote alloc]initWithTitle:nil contents:nil groupName:nil createdDateComponents:nil modifiedDateComponents:nil identifier:nil];
        response.createdNote = note;
        
        completion(response);
    }
    

    当然原因很简单,是因为INNote实例化参数不可传nil。有趣的地方在于,系统的表现。
    我的需求是开启权限控制,也就是通过 Siri 使用这个选项。所以选用了和项目贴近的
    CreateNote system intent。
    一开始在IntentsHandle.m文件中,实现了上面的协议方法并且由于没断点调试没生效,在使用“嘿 Siri” -- "用XXX写笔记" -- “Siri 将使用XXX处理请求” 。居然是能够正常运行的,然而实际上扩展是处于崩溃状态的。
    Over~

    参考文章

    Apple Siri接入开发 (一)
    SiriKit框架详细解析(二)
    iOS12新特性-捷径 Siri ShortCuts
    让App在iOS12中支持Siri Shortcuts(捷径)功能

    相关文章

      网友评论

          本文标题:Siri捷径相关

          本文链接:https://www.haomeiwen.com/subject/eooiyctx.html