【每周一个省钱知识点】Siri Shortcuts+涂鸦SDK,实现Siri控制智能设备

App开发相关产品技术讨论,包括OEM App、App SDK等话题


Post Reply
taojing@tuya.com
Posts: 19

我们希望我们所说的"智能",不仅仅只停留在单一的智能设备控制,而是在一个更具体的用户场景,更定制化的用户需求,更人性化的使用流程,比如和Siri说一句"我回家了",就会打开一系列灯,窗帘,空调等一系列用户设置好的智能设备。

那么问题来了
如何利用Siri Shortcuts和涂鸦SDK完成用Siri来控制设备,执行一键执行,开启关闭自动化?

适用场景
适用场景

其实苹果提供了Siri Shortcuts,他是模拟我们日常创建快捷指令,然后用Siri来执行这个快捷指令。
再用涂鸦SDK把想要执行的动作写入在快捷指令中,就可以完成开发Siri来控制设备,执行场景,开关自动化。

我们以Siri语音执行场景为例
第一步、集成涂鸦智能生活App SDK来创建场景,以供Siri语音执行
按照官方文档集成SDK,完成创建场景
https://developer.tuya.com/cn/docs/app- ... A%E6%99%AF

第二步、搭建Siri Shortcuts来实现创建快捷方式,这样Siri就可以执行该快捷方式
一.如何构建 Siri Shortcut
Siri Shortcuts 是 IOS12 引入的新特性来实现 siri 快捷控制。而实现这个功能需要一定的场景需求,比如功能需要满足:
1.App 的关键功能
2.用户有重复性的行为
3.随时都可以执行的行为
这些需求建议接入 Siri Shortcut。并不建议使用不频繁或非关键型的所有功能都进行接入。本次以场景(一键执行)的功能来实现。

二.使用 Intent 实现功能
Shortcut 可以通过 NSUserActivity 和 Intents 两种模式来实现。NSUserActivity 来实现 Shortcut 相对来说比较简单,对于那种需要通过打开客户端来完成后续动作和任务的捷径来说很合适。Intents苹果推荐的更多的是不需要打开客户端的 Action。本次使用 Intent来实现该功能。
1.创建并配置 Sirikit Intent Definition File 文件

1)点击 File->new->File

新建
新建

2)创建文件完成之后,创建自定义的 Intent

创建自定义的 Intent
创建自定义的 Intent

3)创建完成之后开始配置文件配置 Custom Intent 信息

配置 Custom Intent 信息
配置 Custom Intent 信息

Category:这里选择 run 运行,选择不同的类,在执行的时候会显示不同交互。
Title:显示快捷控制标题,这里标题可以配置成动态的信息。

Title
Title
Description
Description

Description: 详情描述信息
Category、Title、Description 会助于 Siri 进行语义分析和实时的推荐

4)配置 Parameters 参数

配置 Parameters 参数
配置 Parameters 参数

Intent 传递的数据,目前使用的功能是一键执行的场景,所以设置了 sceneid 和 sceneName的参数。Siri 在解析用户语音的时候,会将可能对应的参数提取出来。同时这些参数都是Handler 回调代理方法中 Intent 对象的属性。

5)配置Response

配置Response
配置Response

根据功能情况设置property信息和responseCode信息。如根据不同错误情况定义不同的response errorcode[用户未登录/场景已删除/家庭已删除等]

6)填写custom class,生成相应的intent类
基本配置信息完成之后,填写 custom class 信息点击运行,会生成 Intent 类。

填写 custom class 信息
填写 custom class 信息
生成 Intent 类
生成 Intent 类
taojing@tuya.com
Posts: 19

Re: 【每周一个省钱知识点】Siri Shortcuts+涂鸦SDK,实现Siri控制智能设备

2.添加 Intents Extension 文件

1)File->New->Target->Intents Extension,include UI Extension 要勾选上.

添加 Intents Extension 文件
添加 Intents Extension 文件
勾选include UI Extension
勾选include UI Extension

CustomIntentUI:负责自定义的 Siri 反馈 UI 显示的
CustomIntent:负责自定义的 Intent Handle

创建之后会生成相应的文件目录

生成相应的文件目录
生成相应的文件目录

2)配置 info 信息

配置 info 信息
配置 info 信息
配置 info 信息
配置 info 信息

如果不配置 info 信息,则不会走到相应的 handler 文件里面

3)创建自定义的 Handler 文件

创建自定义的 Handler 文件
创建自定义的 Handler 文件
SceneIntentHandling 协议
SceneIntentHandling 协议

Handler 里面需要实现的是 SceneIntentHandling 协议

SceneIntentHandling 协议
SceneIntentHandling 协议

andleSceneIntents:执行相关场景代码,并且将执行结果反馈
confirmSceneIntents:确认用户的操作

4)根据不同的 Intent 设置不同的接受类

根据不同的 Intent 设置不同的接受类
根据不同的 Intent 设置不同的接受类

5)配置 IntentHandleUI

配置 IntentHandleUI
配置 IntentHandleUI

自定义相关的 ControllerUI,用于执行完成时显示

taojing@tuya.com
Posts: 19

Re: 【每周一个省钱知识点】Siri Shortcuts+涂鸦SDK,实现Siri控制智能设备

接受显示的 Controller
接受显示的 Controller

设置接受显示的 Controller

三.设置Siri按钮

Code: Select all

@property (strong, nonatomic) INUIAddVoiceShortcutButton API_AVAILABLE(ios(12.0)) *shortcutButton;
self.shortcutButton.frame = CGRectMake(100, 100, 60, 20);
[self.view addSubview:self.shortcutButton];
 
 - (INUIAddVoiceShortcutButton *)shortcutButton API_AVAILABLE(ios(12.0)){
    if (!_shortcutButton) {
        _shortcutButton = [[INUIAddVoiceShortcutButton alloc] initWithStyle:INUIAddVoiceShortcutButtonStyleWhiteOutline];
        SceneIntent *newIntent = [[SceneIntent alloc] init];
        newIntent.suggestedInvocationPhrase=@"默认显示";
        newIntent.sceneId=@"测试demo";
        newIntent.sceneName=@"测试demo";
        _shortcutButton.shortcut = [[INShortcut alloc] initWithIntent:newIntent];
        _shortcutButton.delegate = self;
    }
    return _shortcutButton;
}
//相关监听方法
#pragma mark - INUIAddVoiceShortcutButtonDelegate
-(void)presentAddVoiceShortcutViewController:(INUIAddVoiceShortcutViewController *)addVoiceShortcutViewController forAddVoiceShortcutButton:(INUIAddVoiceShortcutButton *)addVoiceShortcutButton API_AVAILABLE(ios(12.0)){
    addVoiceShortcutViewController.delegate = self;
    
    [self presentViewController:addVoiceShortcutViewController animated:YES completion:nil];
}
 
-(void)presentEditVoiceShortcutViewController:(INUIEditVoiceShortcutViewController *)editVoiceShortcutViewController forAddVoiceShortcutButton:(INUIAddVoiceShortcutButton *)addVoiceShortcutButton API_AVAILABLE(ios(12.0)){
    editVoiceShortcutViewController.delegate = self;
    [self presentViewController:editVoiceShortcutViewController animated:YES completion:nil];
}
 
#pragma mark - INUIAddVoiceShortcutViewControllerDelegate
 
- (void)addVoiceShortcutViewController:(INUIAddVoiceShortcutViewController *)controller didFinishWithVoiceShortcut:(INVoiceShortcut *)voiceShortcut error:(NSError *)error
API_AVAILABLE(ios(12.0)) API_AVAILABLE(ios(12.0)){
    NSLog(@"addVoiceShortcutViewController------%@",error);
    [controller dismissViewControllerAnimated:YES completion:nil];
}
 
-(void)addVoiceShortcutViewControllerDidCancel:(INUIAddVoiceShortcutViewController *)controller API_AVAILABLE(ios(12.0)){
    [controller dismissViewControllerAnimated:YES completion:nil];
}
 
#pragma mark - INUIEditVoiceShortcutViewControllerDelegate
-(void)editVoiceShortcutViewControllerDidCancel:(INUIEditVoiceShortcutViewController *)controller API_AVAILABLE(ios(12.0)){
    [controller dismissViewControllerAnimated:YES completion:nil];
}
 
- (void)editVoiceShortcutViewController:(INUIEditVoiceShortcutViewController *)controller didUpdateVoiceShortcut:(INVoiceShortcut *)voiceShortcut error:(NSError *)error API_AVAILABLE(ios(12.0)){
    [controller dismissViewControllerAnimated:YES completion:nil];
}
 
- (void)editVoiceShortcutViewController:(INUIEditVoiceShortcutViewController *)controller didDeleteVoiceShortcutWithIdentifier:(NSUUID *)deletedVoiceShortcutIdentifier API_AVAILABLE(ios(12.0)){
    [controller dismissViewControllerAnimated:YES completion:nil];
}

四.其他的配置点

1.设置自定义按钮
点击的时候创建 sceneintent 设置相关的监听信息

sceneintent 设置
sceneintent 设置

2.设置默认的语句

suggestedInvocationPhrase
suggestedInvocationPhrase

这里是设置 suggestedInvocationPhrase 属性的。
newIntent.suggestedInvocationPhrase=@"1111";

3.设置输入的语音提示信息

15.png

这里默认是显示 intent 标题的。当标题设置成动态的时候,这里就会跟随标题变化了。

第三步、快捷指令里利用涂鸦SDK执行场景代码
一.数据共享
由于执行场景的时候是需要校验 app 的登录信息的,所以这个就会涉及到 app 的登录数据共享的问题。建议使用 APPGroup 来实现 app/extension 之间的数据共享。
参考资料:
https://blog.csdn.net/qq_19484963/artic ... d5c33a0614

二.场景执行流程
1.初始化 app SDK:
[TuyaSmartSDK sharedInstance].appGroupId = @"appGroupName";

2.设置 appkey secretKey
[[TuyaSmartSDK sharedInstance] startWithAppKey:@"APPKEY" secretKey:@"SECRET"];

3.判断 app 是否登录,如果没有登录提示用户登录
if (![TuyaSmartUser sharedInstance].isLogin)

4.获取当前账号下的家庭列表,校验场景 itent 传入的 homeid。
根据 sceneid 获取 TuyaSmartScene 对象,调用 executeSceneWithSuccess 执行场景。

taoyuanxiaoqi
Posts: 69

Re: 【每周一个省钱知识点】Siri Shortcuts+涂鸦SDK,实现Siri控制智能设备

干货满满!把各种软件能力连接起来,把IoT体验做起来~

:idea: 文章信口雌黄易,思想锥心坦白难。
Post Reply