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
中任意一项的应用才会支持权限控制选项
。
- 如果支持权限控制
这里建议找寻和App项目中功能相近的domain
也可以成为SYSTEM INTENT
,不要滥用。
基本步骤如下:
a. 创建Intents.intentdefinition
文件,添加Customize System Intent
。
b. 创建IntentsExtension
扩展,如有UI需求可创建Intents UI Extension
。
c. 开启Capabilities-Siri
,修改info.plist添加权限描述等
d. 为扩展创建证书等
e. Coding...
关于调试
由于之前调试过通知扩展,很轻车熟路的就选中了IntentsExtension
scheme 运行项目,然而打在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(捷径)功能