iOS之快捷指令的集成

一、自己APP添加可由siri唤起的快捷指令

  • 首先导入三个系统库
#import <Intents/Intents.h>
#import <IntentsUI/IntentsUI.h>
#import <CoreSpotlight/CoreSpotlight.h>
  • 需要遵循两个协议并实现其对应的方法
    INUIAddVoiceShortcutViewControllerDelegate
    INUIEditVoiceShortcutViewControllerDelegate
    这两个协议分别代表了新增shortcut时弹出的页面对应操作以及编辑已添加shortcut时弹出的页面对应的操作
    其对应的协议方法为:
#pragma mark - INUIAddVoiceShortcutViewControllerDelegate
- (void)addVoiceShortcutViewController:(INUIAddVoiceShortcutViewController *)controller didFinishWithVoiceShortcut:(nullable INVoiceShortcut *)voiceShortcut error:(nullable NSError *)error API_AVAILABLE(ios(12.0))
{
}
- (void)addVoiceShortcutViewControllerDidCancel:(INUIAddVoiceShortcutViewController *)controller API_AVAILABLE(ios(12.0))
{
}
#pragma mark- INUIEditVoiceShortcutViewControllerDelegate
- (void)editVoiceShortcutViewController:(INUIEditVoiceShortcutViewController *)controller didUpdateVoiceShortcut:(nullable INVoiceShortcut *)voiceShortcut error:(nullable NSError *)error API_AVAILABLE(ios(12.0))
{
}
- (void)editVoiceShortcutViewController:(INUIEditVoiceShortcutViewController *)controller didDeleteVoiceShortcutWithIdentifier:(NSUUID *)deletedVoiceShortcutIdentifier API_AVAILABLE(ios(12.0))
{
}
- (void)editVoiceShortcutViewControllerDidCancel:(INUIEditVoiceShortcutViewController *)controller
{
}

由于shortcut功能为iOS12以上才可以用的,因此在集成该功能时需要做系统版本判断
if (@available(iOS 12.0, *))

1.新增

在添加快捷指令之前,需要先遍历已经存在的指令集合,确认想要添加的指令并没有被添加,用以下方法可以获取到所以已添加的shortcut

[[INVoiceShortcutCenter sharedCenter] getAllVoiceShortcutsWithCompletion:^(NSArray<INVoiceShortcut *> * _Nullable voiceShortcuts, NSError * _Nullable error) {}];

查看INVoiceShortcut类文件有三个属性invocationPhraseshortcutidentifier前两个分别表示指令的命令文案、捷径对象(INShortcut类),该对象中拥有两个重要的属性intentuserActivity前者后面第二部分内容再讲,后者中的activityTypetitle属性分别代表我们进行辨别快捷指令的id以及可由用户编辑的命令文案

将想要添加的userActivity在指令集合中遍历对应的voiceShortcut.shortcut.userActivity.activityType所有都不相同,则可以配置新指令内容进行添加

if (!isExist)
            {
                NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:activityType];
                userActivity.title = defaultCommand;
                userActivity.eligibleForSearch = YES;
                
                if (@available(iOS 12.0, *))
                {
                    userActivity.eligibleForPrediction = YES;
                    userActivity.suggestedInvocationPhrase = editableCommand;
                }
                
                CSSearchableItemAttributeSet *attributes = [[CSSearchableItemAttributeSet alloc] init];
                if (thumbnailData) attributes.thumbnailData = thumbnailData;
                attributes.contentDescription = editableCommand;
                userActivity.contentAttributeSet = attributes;
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    // UI更新代码
                    INShortcut *shortCuts = [[INShortcut alloc] initWithUserActivity:userActivity];
                    INUIAddVoiceShortcutViewController *addvc = [[INUIAddVoiceShortcutViewController alloc] initWithShortcut:shortCuts];
                    addvc.delegate = self;
                    self.addShortcutCompletion = completion;
                    self.defaultTitle = [self defaultTitleOfActivityType:activityType];
                    [[UIViewController sy_TopViewController] presentViewController:addvc animated:YES completion:^{
                        NSLog(@"跳往设置语音界面!");
                    }];
                });
            }

2.编辑

编辑已存在的快捷指令时,同样需要先遍历一遍已存在指令集合,找到与指定userActivity一致的那一项开始调起编辑页面

// 获取已注册的voiceShortcuts
[[INVoiceShortcutCenter sharedCenter] getAllVoiceShortcutsWithCompletion:^(NSArray<INVoiceShortcut *> * _Nullable voiceShortcuts, NSError * _Nullable error) {
            
    for (int i = 0; i < voiceShortcuts.count; i++)
    {
        INVoiceShortcut *voiceShortcut = voiceShortcuts[i];
        self.lastTitle = voiceShortcut.invocationPhrase;
        self.defaultTitle = [self defaultTitleOfActivityType:activityType];
         if ([voiceShortcut.shortcut.userActivity.activityType isEqualToString:activityType])
        {
                [self jumpToSiriEditViewControllerWithVoiceShortcut:voiceShortcut];break;
        }
        else if (voiceShortcut.shortcut.intent && [activityType isEqualToString:NSStringFromClass([voiceShortcut.shortcut.intent class])])
        {
              [self jumpToSiriEditViewControllerWithVoiceShortcut:voiceShortcut];break;
        }
    }
}];
/// 跳转到编辑页面
- (void)jumpToSiriEditViewControllerWithVoiceShortcut:(INVoiceShortcut *)voiceShortcut
API_AVAILABLE(ios(12.0)){
    dispatch_async(dispatch_get_main_queue(), ^{
        INUIEditVoiceShortcutViewController *editVC = [[INUIEditVoiceShortcutViewController alloc] initWithVoiceShortcut:voiceShortcut];
        editVC.delegate = self;
        [[UIViewController sy_TopViewController] presentViewController:editVC animated:YES completion:^{
            NSLog(@"跳往设置语音界面!");
        }];
    });
}

二、在快捷指令应用中添加绑定自己APP的快捷指令

该阶段的目的: 使自己在应用代码中添加的快捷指令可以与快捷指令app中添加的命令一一对应起来,并且可以在快捷指令app新增指令时可选择app列表中显示自己的app
如何将自己的app放到快捷指令app的列表中呢?需要新增一个extension
操作步骤为File->Target->iOS->Intents Extension

siriExtension.png

Next后添上extension的名称并把UI Extension选项取消勾选,如果是多target项目注意该extension关联的target别选错
image.png

新建extension完成后配置好Bundle identifier,并在关联的target中添加一个group项,该group项需要在开发者账号中进行配置,配置好后将对应的描述文件下载下来安装好就行了,注意:添加group时需要在xcode登录开发者账号

接下来需要新建一个意图文件,步骤为: File->File->搜索siri找到名为SiriKit Intent Definition File的文件点击创建,名称随便取一般项目中只有一个

image.png

在意图文件中添加一条新的意图,选择New Intent
image.png

起意图的名字修改意图的描述文案取消Intent is eligible for Siri Suggestions打钩

image.png

注意: 该意图的名字会在唤起的时候被喜欢加上Intent后缀作为activityType传入应用,例:意图名为SYSiriShortcutSearch, 则activityType为SYSiriShortcutSearchIntent

当做完这些之后,就可以在系统的快捷指令应用中找到自己的app了,并且添加的意图也可以在下一步功能列表中找到。

最后需要注意一点: 快捷指令应用中同一条指令可以添加多个功能项,在唤起该指令的时候会先后一个个的调起application:continueUserActivity:restorationHandler:方法(配置了UniversalLink的情况)并传入userActivity.activityType用以区分指令

图示如下:

IMG_5425.PNG
IMG_5426.PNG
IMG_5427.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • iOS12 最新系统,可以使用Siri捷径了,现将创建步骤记录如下 先看一下效果吧。GitHub地址 1 创建Cu...
    雾霭天涯阅读 2,224评论 0 0
  • Siri介绍 Siri是一款苹果 iOS 系统提供的智能语音助手软件,它的全名是Speech Interpreta...
    林神_iOS阅读 2,163评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,178评论 4 8
  • 步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和...
    dibadalu阅读 3,125评论 1 3