您现在的位置是:首页 > 正文

Siri自定义Intent以及处理

2024-04-01 00:05:29阅读 0

一、新建自定义Intent

1.Xcode->New->File->搜索Intent

2.左下角'+'号新建Intent
3.完善Intent资料
注意:1.Intent的命名,如果命名为A,编译之后,系统自动生成AIntent.h文件,import AIntent.h即可使用。

2.Paramters:你想要Intent传递的数据,自定义即可。

3.ShortCut Types:根据传入Intent的不同参数组合,生成不同的标题和副标题,主要用于在SpotLight中的显示或锁屏时的显示。

4.Response:你需要response中传递的数据。

4.编译

编译之后,会自动生成Intent Class和Intent Response以及IntentHandling协议。例如Intent命名为A,编译之后会自动生成AIntentAIntentResponseAIntentHandling协议(下文会用到),之后在App Extension中新建的处理AIntent的IntentHandler必须遵循AIntentHandling

二、使用自定义Intent

下述代码的作用是生成ShortCut,该ShortCut的类型是你自定义的Intent,执行下述代码之后,生成的ShortCut会在SpotLight或锁屏时展示,前提是在iPhone 设置->Siri与搜索中打开搜索建议,查询建议,锁屏建议,之后可以将ShortCut与用户语音对应。

f (@available(iOS 12.0, *)) {
        TestIntent *testIntent = [[TestIntent alloc] init];
        testIntent.content = @"新生成的App内处理的ShortCutIntent";
        INInteraction *interaction = [[INInteraction alloc] initWithIntent:testIntent response:nil];
        [interaction donateInteractionWithCompletion:^(NSError * _Nullable error) {
            
        }];
    } else {
        // Fallback on earlier versions
    }
复制代码

注意代码中的content参数,和Intent中的Parameters对应

三、处理自定义Intent

用户喊出语音之后,需要对其作出处理,分为App被处理和App Extension处理,区别是是否需要启动App

1.App内处理
if([userActivity.interaction.intent isKindOfClass:[TestIntent class]]){
        ViewControllerA *viewControllerA = [[ViewControllerA alloc] init];
        //根据userActivity.interaction.intent.content不同做不同的处理。
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewControllerA];
        [self.window.rootViewController presentViewController:nav animated:YES completion:nil];
    }
复制代码
2.App Extension处理

(1)Xcode->New->Target->搜索Intents Extension

(2)新建一个AIntentHandler来处理你自定义的AIntent,需要遵循上述的AIntentHandling协议。

TestIntentHandler.h

#import <Intents/Intents.h>
#import "TestIntent.h"

NS_ASSUME_NONNULL_BEGIN

@interface TestIntentHandler : INExtension<TestIntentHandling>

@end

NS_ASSUME_NONNULL_END
复制代码

TestIntentHandler.m

#import "TestIntentHandler.h"

@implementation TestIntentHandler

- (void)handleTest:(TestIntent *)intent completion:(void (^)(TestIntentResponse *response))completion NS_SWIFT_NAME(handle(intent:completion:)){
    NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([TestIntent class])];
    TestIntentResponse *response = [[TestIntentResponse alloc] initWithCode:TestIntentResponseCodeSuccess userActivity:userActivity];
    completion(response);
}

@end
复制代码

(3)在IntentHandler文件中的handlerForIntent方法中添加自定义Intent的指定IntentHandler。

- (id)handlerForIntent:(INIntent *)intent {
    // 这是默认的实现,如果你想要不同的对象来处理不同的意图,你可以覆盖重写
  if([intent isKindOfClass:[TestIntent class]]){
        TestIntentHandler *testIntentHandler = [[TestIntentHandler alloc] init];
        return testIntentHandler;
    }else{
        return self;
    }
}
复制代码

处理逻辑应该在AIntentHandler中编写。

Demo地址

转载于:https://juejin.im/post/5b960f58f265da0ae800f7a0

网站文章

  • JSON解析的理解

    JSON解析的理解

    2019独角兽企业重金招聘Python工程师标准>>> ...

    2024-04-01 00:05:05
  • MongoDB的水平扩展,你做对了吗?

    MongoDB的水平扩展,你做对了吗?

    分布式数据库的前世今生当人们一开始使用数据库系统的时候,所有数据都是跑在一台服务器上,即所谓的单机数据库服务器。在企业级应用中,我们会搭建一台应用程序服务器,一般它会被运行在一台服务器或者工作站上,大多数情况下采用 Linux/Unix/Windows 操作系统,也有人把这样的服务器称之为应用程序服务器。顾名思义,他的作用是处理复杂的业务逻辑。但是一点需要注意的是,在这样的构架中,这台应用程...

    2024-04-01 00:04:58
  • 指针之交换两个变量的值 热门推荐

    指针之交换两个变量的值 热门推荐

    方案1:不使用指针  如果不使用指针交换两个变量的值,坦白来说是个不可能完成的任务,你可能会写成这样的:   #include &quot;stdio.h&quot;void swap(int a,int b) { int temp; temp = a; a = b; b = a; }int main() { int m = 1,n = 2; swap(m,n);

    2024-04-01 00:04:53
  • js键盘控制方块运动(自动运动,仅控制方向,到达屏幕边缘会自动反弹)

    <style> * { padding: 0; margin: 0; } .box { width: 100px; height: 100px...

    2024-04-01 00:04:47
  • 产品经理面试必问5大问题 (六)

    产品经理面试必问5大问题 (六)

    ​1在五年的时间内,你的职业规划?回答参考:从产品助理到产品经理的五年, 我想我会这样安排:第一年,把大量时间花在交互上,花在体验上,花在扣产品细节上面,认为完美的细节才能造就完美的产品;第二年,时间...

    2024-04-01 00:04:12
  • Redis使用学习汇总(十)之流

    Redis使用学习汇总(十)之流

    Redis数据结构:流

    2024-04-01 00:04:05
  • C++判断一个点和一个圆的关系(点在圆内、点在圆上、点在圆外)

    【代码】C++判断一个点和一个圆的关系(点在圆内、点在圆上、点在圆外)

    2024-04-01 00:03:39
  • 输入手机号码自动填充空格 变成3-4-4格式

    电话号码3-4-4格式实现方式在最近的开发中遇到将电话号码展示成3-4-4格式的需求(如:132 2222 3333这样子),乍一看这个要求挺简单的,因为只需要在满足长度的字符串固定位置加上相应的空格...

    2024-04-01 00:03:34
  • springboot生鲜交易系统springboot46

    springboot生鲜交易系统springboot46

    剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设...

    2024-04-01 00:03:26
  • 字节初期,张一鸣是如何思考的?

    转载:字节初期,张一鸣是如何思考的?这几天抽空把张一鸣的所有微博看了一遍,发现 2010 年的微博最好,就是他 30 岁左右的时候,那时候刚创业没多久,在微博上认真分享自己的思考和观点。到了 2012...

    2024-04-01 00:03:00