Siri捷径相关

关于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(捷径)功能

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容