Siri捷径相关

2019-09-25  本文已影响0人  Saylor_Lone

关于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;

区别
关于权限 !!!

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

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

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

siri domains
关于调试

由于之前调试过通知扩展,很轻车熟路的就选中了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(捷径)功能

上一篇下一篇

猜你喜欢

热点阅读