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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器&#xff0c;可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件&#xff0c;则跳过这一步。如果手上有ppk文件&#xff0c;那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式&#xff0c;你需要将 PPK 文…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

Golang | Leetcode Golang题解之第524题通过删除字母匹配到字典里最长单词

题目&#xff1a; 题解&#xff1a; func findLongestWord(s string, dictionary []string) (ans string) {m : len(s)f : make([][26]int, m1)for i : range f[m] {f[m][i] m}for i : m - 1; i > 0; i-- {f[i] f[i1]f[i][s[i]-a] i}outer:for _, t : range dictionary …

019集——获取CAD图中多个实体的包围盒(CAD—C#二次开发入门)

如下图所示&#xff0c;获取多个实体的最大包围盒&#xff0c;用红色线表示&#xff1a; 也可单独选圆的包围盒 部分代码如下&#xff1a; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using A…

【快速上手】pyspark 集群环境下的搭建(Yarn模式)

目录 前言&#xff1a; 一、安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 二、启动 三、可打开yarn界面查看任务 前言&#xff1a; 上一篇介绍的是…

sublime python出现中文乱码怎么办

一、乱码现象 利用sublime自带编译快捷方式ctrlB会出现中文乱码的情况。 print("没有循环数据!") print("完成循环!") 二、寻找原因 1、由于之前我已经安装了插件ConvertToUTF8&#xff0c;排除文本编码错误问题。 2、相同的代码在插件sublimerepl搭建的…

第三届北京国际水利科技博览会将于25年3月在国家会议中心召开

由中国农业节水和农村供水技术协会、北京水利学会、振威国际会展集团等单位联合主办的第三届北京国际水利科技博览会暨供水技术与设备展&#xff08;北京水利展&#xff09;将于2025年3月31日至4月2日在北京•国家会议中心举办&#xff01; 博览会以“新制造、新服务、新业态”…

RHCE DNS

DNS DNS1.1 DNS介绍1.2 安装bind&#xff0c;配置文件1.3 正向解析文件模板1.4 反向解析文件模板1.5 转发服务器实验1.6 解析web服务器实验1.7 区域传送克隆虚拟机 DNS 1.1 DNS介绍 DNS系统 域名系统&#xff08;DNS&#xff09;是一个分层的分布式数据库。它存储用于将Inter…

JSON交互处理

目录 一、什么是JSON 二、JSON和JavaScript对象互转 ​三、Controller返回JSON数据 3.1 使用Jackson 编写Controller 1. 一个对象 2. 多个对象 3. 输出时间对象 4. 优化&#xff1a;抽取为工具类 一、什么是JSON Json是JavaScript对象的字符串表示法&#xff0c;它用…

GeoSever发布图层(保姆姬)

发布服务的具体步骤。 1. 安装 GeoServer 下载 GeoServer 安装包&#xff1a;GeoServer 官网按照安装说明进行安装&#xff0c;可以选择 Windows、Linux 或其他平台。 2. 启动 GeoServer 启动 GeoServer 通常通过访问 http://localhost:8080/geoserver 进行。默认用户名和密…

Linux中断、软中断、MMU内存映射-深入理解

中断&#xff1a; Linux中&#xff0c;中断上半部不能嵌套&#xff0c;如果一直保存上下文&#xff0c;栈可能会溢出。中断上半部处理紧急事情&#xff0c;下半部处理非紧急事情。下半部通常通过软中断来实现。在上半部执行完后会执行下半部的软中断&#xff0c;如果囤积了A和…

讲讲 kafka 维护消费状态跟踪的方法?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲讲 kafka 维护消费状态跟踪的方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…

CodeS:构建用于文本到 SQL 的开源语言模型

发布于&#xff1a;2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询&#xff08;文本到 SQL &#xff09;的任务中显示出良好的性能。然而&#xff0c;大多数最先进的 &#xff08;SOTA&#xff09; 方法都依赖于强大但闭源的大型语言…

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…

「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础

在应用开发中&#xff0c;动画效果可以增强用户体验。鸿蒙框架提供了 translate、scale 和 rotate 等动画功能&#xff0c;允许对组件进行平移、缩放和旋转等操作。本篇将介绍 Animation 组件的基础知识和示例代码。 关键词 Animation 组件动画效果位置动画自动动画缩放动画 一…

详解:模板设计模式

模板设计模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;在软件设计中有着广泛的应用&#xff0c;旨在提高代码的可维护性和可复用性。 一、定义与特点 定义&#xff1a; 模板设计模式定义了一个算法的骨架&#xff0c;将某些步骤推迟到子类中实…

Java中的时区和带时区的时间对象:ZoneId类、ZonedDateTime类

在 Java 中&#xff0c;ZoneId 和 ZonedDateTime 是处理时区和带时区日期时间的重要类&#xff0c;它们属于 java.time 包&#xff0c;这个包是在 Java 8 中引入的&#xff0c;用于替代旧的日期和时间 API&#xff08;java.util.Date、java.util.Calendar 等&#xff09;。 1、…

微积分复习笔记 Calculus Volume 1 - 4.5 Derivatives and the Shape of a Graph

4.5 Derivatives and the Shape of a Graph - Calculus Volume 1 | OpenStax

Windows配置Nodejs及nmp简明教程(2024可用)

一、下载及安装Nodejs 下载 Node.js 中文网 (nodejs.com.cn)在此下载windows长期维护版本的.msi安装包&#xff0c;64位 安装&#xff1a; 双节安装包一直点击Next下一步&#xff0c;注意安装路径选择C盘默认路径&#xff08;C:\Program Files\nodejs\&#xff09;即可&#x…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法&#xff08;简称BA&#xff09;是一种受微型蝙蝠回声定位机制启发的群体智能算法&#xff0c;由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…