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

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.myParamtercompletion(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_namemsg = 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

相关文章:

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

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

虚拟化环境中的精简版 Android 操作系统 Microdroid

随着移动设备的普及和应用场景的多样化&#xff0c;安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid&#xff0c;是一个专为虚拟化环境设计的精简版Android操作系统&#xff0c;旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能…...

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目

自 NFTScan Site 上线以来&#xff0c;它迅速成为 NFT 市场中的一支重要力量&#xff0c;凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性&#xff0c;为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…...

Vue:模板 MVVM

Vue&#xff1a;模板 & MVVM 模板插值语法指令语法 MVVMdefineProperty数据代理 模板 Vue实例绑定一个容器&#xff0c;想要向容器中填入动态的值&#xff0c;就需要使用模板语法。模板语法分为插值语法和指令语法。 插值语法 插值语法很简单&#xff0c;使用{{}}包含一…...

Kafka 消息丢失如何处理?

今天给大家分享一个在面试中经常遇到的问题&#xff1a;Kafka 消息丢失该如何处理&#xff1f; 这个问题啊&#xff0c;看似简单&#xff0c;其实里面藏着很多“套路”。 来&#xff0c;咱们先讲一个面试的“真实”案例。 面试官问&#xff1a;“Kafka 消息丢失如何处理&#x…...

Mysql报错注入之floor报错详解

updatexml extractvalue floor 是mysql的函数 groupbyrandfloorcount 一、简述 利用 select count(),(floor(rand(0)2))x from table group by x&#xff0c;导致数据库报错&#xff0c;通过 concat 函数&#xff0c;连接注入语句与 floor(rand(0)*2)函数&#xff0c;实现将…...

EPS原理笔记

EPS UE(user equipment)&#xff0c;移动用户设备 LTE(Long Term Evolution)&#xff0c;无线接入网部分&#xff0c;E-UTRAN EPC(system Architecture Evolution、Evoloed Packet Core)&#xff0c;核心网部分&#xff0c;主要包括MME、S-GW、P-GW、HSS&#xff0c;连接Intern…...

LeetCode 876. 链表的中间结点

题目描述: 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0…...

划界与分类的艺术:支持向量机(SVM)的深度解析

划界与分类的艺术&#xff1a;支持向量机&#xff08;SVM&#xff09;的深度解析 1. 引言 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是机器学习中的经典算法&#xff0c;以其强大的分类和回归能力在众多领域得到了广泛应用。SVM通过找到最优超平面来分…...

题目:100条经典C语言笔试题目(1-5)

题目&#xff1a; 1、请填写 bool , float, 指针变量 与“零值”比较的if 语句。 提示&#xff1a;这里“零值”可以是 0, 0.0 , FALSE 或者“空指针” 。例如 int 变量 n 与“零值”比较的 if 语句为&#xff1a; &#xff08;1&#xff09;请写出bool flag 与“零值”比较…...

python代码编写规范及注意事项

目录 1. 注意1.1 变量与常量解释&#xff1a;建议的修复&#xff1a; 1.2 Too many arguments 和 Too many local variables解决方案1. 减少参数数量2. 减少局部变量数量3. 调整 Pylint 配置 总结 1. 注意 1.1 变量与常量 解读下面的pylint问题 C0103: Constant name “file_p…...

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…...

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…...

我也谈AI

“随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。在医疗行业中&#xff0c;人工智能技术正在被应用于病例诊断、药物研发等方面&#xff0c;为医学研究和临床治疗提供了新的思路和方法&#xff1b;在企业中&#xff0c;人工智能技术可以通过…...

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀&#xff0c;这一次讲解的是二叉树的深度搜索&#xff0c;大佬们请阅 1.前言 ⼆叉树中的深搜&#xff08;介绍&#xff09; 深度优先遍历&#xff08;DFS&#xff0c;全称为DepthFirstTraversal&#xff09;&#xff0c;是我们树或者图这样的数据结构中常⽤的⼀种…...

编写第一个 Appium 测试脚本:从安装到运行!

前言 最近接到一个测试项目&#xff0c;简单描述一下&#xff0c;需求就是&#xff1a;一端发送指令&#xff0c;另一端接受指令并处理指令。大概看了看有上百条指令&#xff0c;点点点岂不是废了&#xff0c;而且后期迭代&#xff0c;每次都需要点点点&#xff0c;想想就头大…...

mysql查表相关练习

作业要求&#xff1a; 单表练习&#xff1a; 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监&#xff0c;和…...

airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

一&#xff1a;主要内容 框架功能、框架架构及测试报告效果 airtest安装、环境搭建 框架搭建、框架运行说明 框架源码 二&#xff1a;框架功能及测试报告效果 1. 框架功能&#xff1a; 该框架笔者用来作为公司的项目的前端自动化&#xff0c;支持pc和app&#xff0c;本文…...

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…...

python使用pymysql

为了封装这个数据库操作为一个通用方法&#xff0c;我们可以创建一个函数&#xff0c;该函数接受数据库连接参数&#xff08;如主机名、用户名、密码、数据库名&#xff09;、SQL语句以及必要的参数&#xff08;用于参数化查询&#xff09;。下面是一个简单的封装示例&#xff…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...