当前位置: 首页 > article >正文

ios 快捷指令扩展(Intents Extension)简单使用 swift语言

本文介绍使用Xcode15 建立快捷指令的Extension,并描述如何修改快捷指令的IntentHandler,带参数跳转主应用;以及展示多个选项的快捷指令弹框(配置intentdefinition文件),点击选项带参数跳到主应用的方法

创建快捷指令

快捷指令是一个项目的extension,所以先要有一个ios项目:
在这里插入图片描述
新建扩展
搜索Intent字段,点击下图选中的
在这里插入图片描述
左边箭头勾中就会额外自动给快捷指令UI扩展
右边箭头选None 另一个选项是Messaging,选中会使得 自动创建message发送功能的相关代码

在这里插入图片描述
选中根目录,新建文件
在这里插入图片描述
新建文件类型中搜索Intent,新建唯一搜索结果类型文件
在这里插入图片描述
新建文件的target membership需要全部都勾选
在这里插入图片描述

在这个新建文件里面定义快捷指令支持的动作(Action),点击加号,点击new intent
在这里插入图片描述

新建的Intent按照需要重命名(双击名字重命名) 还有标题描述修改
在这里插入图片描述
配置Intent展示的属性
在这里插入图片描述

确认主应用和扩展的info.plist文件有配置Intent,没有的话加上build一下
在这里插入图片描述
build你的项目,xcode会根据添加的Intent生成对应的如下后缀的代码:Handle类、 intent类、 Handling协议、Response类。

快捷指令逻辑

修改默认生成的IntentHandler,如下划线和框住的都是添加代码,其中response的属性show_name为上面配的属性。
这里的continueInApp枚举,表示快捷指令是打开主应用
在这里插入图片描述

主应用获取快捷指令传参

下面是主应用被快捷指令打开,在SceneDelegate获取传过来的参数:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        if userActivity.activityType == NSStringFromClass(MyIntentIntent.self) {
            var msg: String?
            if let response = userActivity.interaction?.intentResponse as? MyIntentIntentResponse {
                msg = response.show_name
            }
            let alert = UIAlertController(title: "提示", message: "从快捷指令传递的消息:\(msg ?? "")", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default, handler: nil))

            // 显示弹框
            self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
    }

展示多项的快捷指令弹窗
这个弹窗在快捷指令中心 点击快捷指令后弹出,点击里面的项,可以带着参数跳到主应用
在这里插入图片描述

在 Intents.intentdefinition文件中 新建一个类型Topping(名字随便)
在这里插入图片描述
response里面加上这个刚才定义类型的一个参数toping
在这里插入图片描述
intent里面也加一个参数 myParamter
在这里插入图片描述
需要注意的是快捷指令弹窗标题是这里配置:
在这里插入图片描述

build你的项目。会生成对应类还有属性:
出现ToppingResolutionResult类 MyIntentIntentResponse类中会多出属性toping MyIntentIntent类会多出属性myParamter

下面是IntentHandler适配修改:


class IntentHandler: INExtension, MyIntentIntentHandling {
    
   
    func resolveMyParamter(for intent: MyIntentIntent, with completion: @escaping (ToppingResolutionResult) -> Void) {
        guard let myParamter = intent.myParamter else {
            completion(ToppingResolutionResult.disambiguation(with: DataManager.allTops()))
            return
        }
        completion(ToppingResolutionResult.success(with: myParamter))
       
    }
    
    
    func provideMyParamterOptionsCollection(for intent: MyIntentIntent, searchTerm: String?, with completion: @escaping (INObjectCollection<Topping>?, Error?) -> Void) {
        
        completion(INObjectCollection(items: DataManager.allTops()), nil)
    }
    
    func handle(intent: MyIntentIntent, completion: @escaping (MyIntentIntentResponse) -> Void) {
        let userActivity  = NSUserActivity(activityType: NSStringFromClass(MyIntentIntent.self))
        let response  = MyIntentIntentResponse(code:.continueInApp,userActivity: userActivity)
        response.toping = intent.myParamter
        completion(response)
    }
    
    func confirm(intent: MyIntentIntent, completion: @escaping (MyIntentIntentResponse) -> Void) {
        
        let response  = MyIntentIntentResponse(code:.ready,userActivity: nil)
        completion(response)
    }
    
    
    override func handler(for intent: INIntent) -> Any {
        // This is the default implementation.  If you want different objects to handle different intents,
        // you can override this and return the handler you want for that particular intent.
        
        return self
    }
    
    
}

数据获取类DataManager:

class DataManager : NSObject {
    static func allTops()-> [Topping] {
        var tops:[Topping] = []
        for i in 0..<3{
            let top = Topping(identifier: "\(i)", display: "啦啦啦\(i)")
            tops.append(top)
        }
        return tops
    }
}

同样在主应用中可以获取传过来的response里的Toping对象,依次来获得传参

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        if userActivity.activityType == NSStringFromClass(MyIntentIntent.self) {
            var msg: String?
            if let response = userActivity.interaction?.intentResponse as? MyIntentIntentResponse {
//                msg = response.show_name
                msg = response.toping?.displayString ?? ""
            }
            let alert = UIAlertController(title: "提示", message: "从快捷指令传递的消息:\(msg ?? "")", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default, handler: nil))

            // 显示弹框
            self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
    }

参考文档

官方文档,官方demo也可从此下载:
https://developer.apple.com/documentation/sirikit/soup_chef_accelerating_app_interactions_with_shortcuts


http://www.kler.cn/a/372077.html

相关文章:

  • OpenSSL:生成 DER 格式的 RSA 密钥对
  • 【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!
  • 云计算平台上的DevOps实践
  • NSSCTF刷题篇web部分
  • vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?
  • Vue脚手架
  • 北航软件工程考研难度分析!
  • 依托微信小程序,畅享校园二手交易
  • 面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123
  • 推荐一款优秀的pdf编辑器:Ashampoo PDF Pro
  • Mac OS 搭建MySQL开发环境
  • [蓝桥杯 2015 省 A] 饮料换购
  • java装饰器设计模式
  • 【测试平台】打包 jenkins配置和jenkinsfile文件
  • 2023IKCEST第五届“一带一路”国际大数据竞赛--社交网络中多模态虚假 媒体内容核查top11
  • 在绑定 Google 邮箱的手机设备上,未收到二步验证码通知是什么原因?
  • Scala练习50题(基础入门)
  • 前端八股文第一篇
  • 法律智能助手:开源NLP系统助力法律文件高效审查与检索
  • MATLAB语音信号处理系统
  • 在 CentOS 7 上安装 Node.js 18.20.4
  • 谓语和谓语动词
  • 网站攻击,XSS攻击的类型
  • 代码随想录 | Day36 | 动态规划 :整数拆分不同的二叉搜索树
  • 你了解自动化测试中的SOLID原则吗?
  • Mount Image Pro,在取证安全的环境中挂载和访问镜像文件内容