交互消息式IMessage扩展开发记录
IMessage扩展简介
iOS10新加入的基于iMessage的应用扩展,可以丰富发送消息的内容。(分享表情、图片、文字、视频、动态消息;一起完成任务或游戏。)
简单的将发送的数据内型分为三种:
1.贴纸Stickers;
2.交互消息Interactive Messages; (本文介绍此种)
3.图片,音视频,文本,链接等;
两种显示模式:Compact和Expanded。

Compact(收缩)模式不能访问键盘和相机,不能使用横向滑动,横向滑动操作会由系统捕获;但可以访问输入框。
Expanded(展开)模式不能访问用户输入框;但是可以访问键盘、相机,并且可以使用横向滑动操作。
新建IMessage扩展
xcode新建
打开xcode :File->New->Target 然后在右侧输入框输入IMessage->点击IMessage Extension

podfile
podfile里面加入IMessage需要依赖的库,下面是一个例子,这里我提取了跟主应用公共依赖的库到函数commonPod,需要注意的是有用了UIAPPlication的库在IMessage里面可能导致崩溃,因为很多直接获取这个函数的都会返回空(因为是扩展)
platform :ios, '14.0'
def commonPodpod "YYKit"pod 'SnapKit'pod 'SwiftyJSON'
endtarget 'TestIM' do# Comment the next line if you don't want to use dynamic frameworksuse_frameworks!commonPodpod 'LookinServer', :configurations => ['Debug']pod 'IQKeyboardManagerSwift'endtarget 'MyIM' douse_frameworks!commonPodend
应用图标
新建项目默认在asset中有这个文件(如下图),但是右侧图标都是空的,需要按照下面图标标的样式,手动将对应文件拖到右边的那个位置。

目录结构
新建的IMessage扩展只有如下文件,主要UI代码是在MessagesViewController上进行显示。

使用IMessage api

MessagesViewController
本类为新建IMessage xcode自动为我们创建的类,他继承MSMessagesAppViewController(然后这个又继承自UIViewController),为主要控制IMessage展示的控制器。
它是如下图所示,框中的部分是收缩状态的vc,需要注意的是 他有一部分是在屏幕之外的,向上手动拖拽扩展的时候下面那块才会露出来。

这个是展开状态的vc:

主要生命周期:
//扩展激活(打开)前open func willBecomeActive(with conversation: MSConversation)//扩展已被激活(打开)open func didBecomeActive(with conversation: MSConversation)//扩展被关闭前open func willResignActive(with conversation: MSConversation)//扩展被关闭open func didResignActive(with conversation: MSConversation)//vc将要收起或者展开 初始化的时候不会调用,只在状态切换时调用。在松手的时候会调用@available(iOS 10.0, *)open func willTransition(to presentationStyle: MSMessagesAppPresentationStyle)//vc完成收起或者展开 初始化的时候不会调用,只在状态切换时调用。@available(iOS 10.0, *)open func didTransition(to presentationStyle: MSMessagesAppPresentationStyle)
需要注意的是,只要这个ViewController变成不可见,这个扩展就会关闭(例如切换IMessage的其他扩展、切后台等。
MessagesViewController有展开收起状态,对应的,他的属性presentationStyle,会是expanded或者compact
open var presentationStyle: MSMessagesAppPresentationStyle { get }
手动调整扩展展开或收缩的状态切换
if isExpand {requestPresentationStyle(.expanded)}else{requestPresentationStyle(.compact)}
MSConversation
在MessagesViewController中有个属性叫activeConversation,它是MSConversation
,用来操作发送,例如IMessage的输入框里面插入文本或组件,或者直接在IMessage中发送文本或者组件。这个东西在模拟器上用回崩溃。
向IMessage的输入框插入文本(并换行)
activeConversation?.insertText("这是一串文本")
向IMessage的输入框插入组件:这里使用了MSMessageTemplateLayout配置样式,并通过发送MSMessage实现

let layout = MSMessageTemplateLayout()
layout.image = UIImage(named: "iMessage App Icon")
layout.caption = "Ask Al Anything"
let myMessage = MSMessage()
myMessage.layout = layout
activeConversation?.insert(myMessage)
这个组件可以发送到对方手机的IMessage,如果对方装了我们的应用,会在IMessage直接打开扩展并切换到展开状态,否则IMessage的appstore扩展会打开,并展示我们的应用详情页面。
坑点要点
见这篇文章:
iMessage 开发要点 坑点记录
相关文章:
交互消息式IMessage扩展开发记录
IMessage扩展简介 iOS10新加入的基于iMessage的应用扩展,可以丰富发送消息的内容。(分享表情、图片、文字、视频、动态消息;一起完成任务或游戏。) 简单的将发送的数据内型分为三种: 1.贴纸Stickers; 2.交…...
软件团队降本增效-建立需求评估体系
需求对于软件开发来说是非常重要的输入,它们直接决定了软件的产品形态、代码数量和质量。如果需求不清晰、不完善,或者存在逻辑冲突,将会导致软件质量迅速下降,增加代码耦合性和开发成本。 在开发过程中,对需求的产品…...
npm yarn pnpm 命令集
npm 安装依赖 npm install 安装某个依赖 npm install xxx7.6.3 安装到全局(dependencies) npm install xxx7.6.3 -S 安装到线下(devDependencies) npm install xxx7.6.3 -D 卸载某个依赖 npm uninstall xxx 卸载全局依…...
python 开发环境(PyCharm)搭建指南
Python 的下载并安装 参考:Python基础教程——搭建Python编程环境 下载 Python Python 下载地址:官网 (1)点击【Downloads】>>>点击【Windows】>>>点击【Python 3.x.x】下载最新版 Python; Pyt…...
springboot里 运用 easyexcel 导出
引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…...
一“码”当先,PR大征集!2023 和RT-Thread一起赋能开源!
活动地址:https://club.rt-thread.org/ask/article/3c7cf7345ca47a18.html 活动介绍 「一“码”当先,PR大征集!」是一项为了鼓励开发者积极参与开源软件开发维护的活动。 你可在Github RT-Thread( https://github.com/RT-Thread …...
jmeter模拟多用户并发
一、100个真实的用户 1、一个账号模拟100虚拟用户同时登录和100账号同时登录 区别 (1)1个账号100个人用,同时登录; (2)100个人100个账号,同时登录。 相同 (1)两个都…...
澎峰科技|邀您关注2023 RISC-V中国峰会!
峰会概览 2023 RISC-V中国峰会(RISC-V Summit China 2023)将于8月23日至25日在北京香格里拉饭店举行。本届峰会将以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。 本…...
【系统架构】系统架构设计之数据同步策略
文章目录 一、介绍1.1、分布式系统中的数据同步定义1.2、为何数据同步如此关键1.3、数据同步策略简介 二、为什么需要数据同步2.1、提高系统可用性2.2、备份与灾难恢复2.3、提高性能2.4、考虑地理位置(如使用CDN) 三、同步备份3.1、定义和概述3.2、工作原…...
Linux内核学习笔记——ACPI命名空间
所有定义块都加载到单个命名空间中。命名空间 是由名称和路径标识的对象层次结构。 以下命名约定适用于 ACPI 中的对象名称 命名空间: 所有名称的长度均为 32 位。 名称的第一个字节必须是“A”-“Z”、“_”之一。 名称的每个剩余字节必须是“A”-“Z”、“0”之…...
使用 OpenCV Python 实现自动图像注释工具的详细步骤--附完整源码
注释是深度学习项目中最关键的部分。它是模型学习效果的决定因素。然而,这是非常乏味且耗时的。一种解决方案是使用自动图像注释工具,这大大缩短了时间。 本文是pyOpenAnnotate系列的一部分,其中包括以下内容。 1、使用 OpenCV 进行图像注释的路线图。 2、pyOpenAnnotate工…...
RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解
大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。 WebSocket协议 WebSocket 是一种…...
【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)
需求:: 有一个List<Map<String.Object>>,存储了某年某月的数据, 数据是根据用户查询条件进行显示的;所以查询的数据是动态的;需按月份统计每个年月数据出现的次数,并且按照月份排序࿱…...
kafka踩坑
问题:项目中用到kafka作为消息中间件,因为现在是开发阶段,试了一次没问题之后就没在管,今天又要测试kafka相关功能,发现消息发送者能够正常发送消息,但是消费者怎么也就收不到数据。然后经过各种百度进行了…...
让你专注于工作的电脑桌面日程提醒软件
在现代职场中,上班族们常常在繁忙的工作中会遇到各种各样的事情干扰。比如,当我们专注于完成重要的报告时,却又有同事来询问问题;在准备去会议事项时,手机却突然收到了一系列的短信和通知。这些干扰不仅浪费了我们的时…...
62页智慧产业园区数字化综合解决方案PPT
导读:原文《62页智慧产业园区数字化综合解决方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以关注评论转发本文&#…...
苹果开发者账号注册方法简明指南
注册苹果开发者账号的方法 在2020年以前,注册苹果开发者账号后,就可以生成证书。 但2020年后,因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号,所以需要缴费才能创建ios证书了。 所以新政策出来后,…...
SQL-每日一题【1321. 餐馆营业额变化增长】
题目 表: Customer 你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。 计算以 7 天(某日期 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。 结果按 …...
PyCharm PyQt5 开发环境搭建
环境 python:3.6.x PyCharm:PyCharm 2019.3.5 (Community Edition) 安装PyQT5 pip install PyQt5 -i https://pypi.douban.com/simplepip install PyQt5-tools -i https://pypi.douban.com/simple配置PyCharm PyQtUIC Program :D:\Pytho…...
2023-08-17 Untiy进阶 C#知识补充8——C#中的日期与时间
文章目录 一、名词概念二、DateTime三、TimeSpan 一、名词概念 (一)格里高利历 格里高利历一般指公元,即公历纪年法。目前我们所说公历,就是格里高利历。 比如 2022 年就是从公元元年开始算起的两千二十二年。 …...
RT-Thread中断处理实战:从机制原理到嵌入式实时系统设计
1. 项目概述与核心价值搞嵌入式开发的朋友,对RT-Thread这个国产的物联网操作系统应该都不陌生。从最开始的点灯、串口打印,到后面玩线程、信号量、邮箱,一路摸索过来,感觉就像在搭积木,一块块地把系统功能给垒起来。但…...
Unity UI实战:从零构建高效Dropdown下拉菜单系统
1. Dropdown组件基础解析 下拉菜单是游戏UI中最常用的交互控件之一,Unity内置的Dropdown组件让开发者能够快速实现选择功能。我第一次在项目中用到Dropdown时,发现它比想象中要复杂得多——表面上看只是个简单的选择框,但实际包含Label文本、…...
别再被hierarchy搞晕了!OpenCV cv2.findContours四种模式(RETR_*)保姆级图解指南
OpenCV轮廓检测全解析:四种层级模式与实战图解 轮廓检测是计算机视觉中最基础也最强大的工具之一,但很多开发者在面对cv2.findContours的层级参数时常常感到困惑。本文将用直观的可视化方式,带你彻底理解RETR_EXTERNAL、RETR_LIST、RETR_CCOM…...
【CLIP论文阅读】:基于自然语言监督的通用视觉预训练范式
论文信息 标题:Learning Transferable Visual Models From Natural Language Supervision会议:ICML 2021单位:OpenAI代码:https://github.com/OpenAI/CLIP论文:https://arxiv.org/pdf/2103.00020.pdf 一、引言&#x…...
短剧低成本创业方案|轻量化H5+小程序组合,零压力快速启动项目
一、前言 现在短剧行业内卷严重,很多新手盲目投入资金开发APP、购买高价版权、大额投放流量,最后成本回不来、项目烂尾。对于普通创业者、小型流量工作室来说,重资产、高成本、长周期的模式早已不适合入局。 真正适合新手的玩法,…...
解锁VideoLingo高级功能:打造你的AI字幕组全流程定制指南
解锁VideoLingo高级功能:打造你的AI字幕组全流程定制指南 【免费下载链接】VideoLingo Netflix-level subtitle cutting, translation, alignment, and even dubbing - one-click fully automated AI video subtitle team | Netflix级字幕切割、翻译、对齐、甚至加上…...
【ROS2速成 - Day2】ROS2五大核心概念吃透(嵌入式类比记忆,超好懂)
前言 大家好,我是深耕嵌入式 15 年的老林。上一篇 Day1 我们搭好了 ROS2 的开发环境,很多同学私信我说,ROS2 的概念太多了,什么节点、话题、服务,听着就头大,完全不知道和我们平时写单片机代码有什么关系。…...
Topit:3分钟掌握macOS窗口置顶,工作效率提升200%的终极指南
Topit:3分钟掌握macOS窗口置顶,工作效率提升200%的终极指南 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 在macOS多任务处理中&#x…...
Jaeger在DeepSeek高并发场景下的链路爆炸真相:如何用1个配置将Trace延迟压降92%?
更多请点击: https://intelliparadigm.com 第一章:Jaeger在DeepSeek高并发场景下的链路爆炸真相 当DeepSeek的推理服务集群在每秒处理超12万QPS请求时,Jaeger后端突然出现Trace采样率飙升至98%、Span写入延迟突破3.2s、ES索引碎片数激增至47…...
英雄联盟玩家如何通过本地化智能工具提升游戏胜率:League Akari 完整使用指南
英雄联盟玩家如何通过本地化智能工具提升游戏胜率:League Akari 完整使用指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit Leag…...
