[iOS] 在 ios10 中使用 imessage
本文转载至 http://www.tuicool.com/articles/zIFvQn7
在iOS10中使用iMessage
2016-06-22
iMessage
在iOS中新增了两种iMessage的方式,1.内置表情包,2.iMessage应用
1.内置表情包(Sticker Packs)
可以通过在Xcode中新建Sticker Pack Application来创建。这种方式可以简单地通过添加图片来在iMessage中添加表情包。添加的贴纸需要满足一下条件
- 图片类型必须是 png、apng、gif或者jpeg
- 文件大小必须 小于500K
- 图片大小必须在 100 100 到 206 206 之间
需要注意的是:必须要永远提供 @3x 大小的图片(即 300 300 到 618 618 )。系统可以根据当前设备通过 runtime 自动调整图片来呈现 @2x 和 @1x
系统能够自适应的展示贴纸,所以为了更好的展示贴纸,最好提供的贴纸是以下三种大小的类型
- 小型 100*100
- 中型 136*136
- 大型 206*206
添加方法也很简单,方式直接如下图

2.iMessage应用
iMessage app使用完整的框架和Message app进行交互。使用iMessage app能够
- 在消息应用内呈现一个自定义的用户交互界面。 使用MSMessagesAppViewController
- 创建一个自定义或者动态的表情包浏览器。使用 MSStickerBrowserViewController
- 添加文本、表情、或者媒体文件到消息应用的文本输入框。使用 MSConversation
- 创建带有特定的应用数据交互的消息。使用 MSMessage
- 更新可以相互影响的消息(例如,创建游戏或者可以合作的应用)。使用 MSSession
我们可以通过iMessage完成以上五种事情,下面分别来说:
新建一个空白应用后,会有一个MessagesViewController,继承自MSMessagesAppViewController,这个是我们看到啊的主页,在这里进行自定义界面的创建。
同时还有几个方法
//当拓展从不活动进入到活动状态时会被调用,这个会发生在呈现UI的时候。使用这个方法来配置拓展和恢复之前的状态。
-(void)willResignActiveWithConversation:(MSConversation *)conversation
//当拓展从活动进入到不活动时会被调用。这个会发生在界面消失、改变会话或者退出Message应用时。使用这个方法来释放共有的资源、存储用户数据、注销timer和存贮足够的状态信息来当它崩溃时可以来恢复你的拓展的状态.
-(void)didBecomeActiveWithConversation:(MSConversation *)conversation
//这个方法当接收到一个从对方发送并且是通过此拓展发送的消息时会被调用。用这个方法来触发UI更新来相应这个消息.
-(void)didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation
//点击发送按钮时会被调用
-(void)didStartSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation
//当用户删除而不发送消息时调用.使用这个方法来清理相关删除消息状态。
-(void)didCancelSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation
//在拓展从一个过渡到一个新的外观状态前会被调用.使用这个方法来为改变外观状态做准备
-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle
//在拓展已经过度到新的外观状态后会被调用。使用这个方法来完成与外观风格变化有关的任何行为.
-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle
MSStickerBrowserViewController自带拖动添加、长按预览、点击添加。使用这个类来自定义表情浏览器的话,可定制性会更高,她可以根据data source来动态改变数据,也可以自定义每个贴纸的大小。创建后需要实现它的两个代理numberOfStickersInStickerBrowserView: 和 stickerBrowserView:stickerAtIndex:来返回相应的内容。
需要注意的是1.内容要是本地图片 2.表情的大小是可以调整的,但是还是只支持是三种样式
MSConversation
如果想要发送其他内容可以使用MSConversation来进行操作.
当前MessagesViewController中包含了一个当前的conversation->activeConversation
发送消息时可以通过如下方法
//文件
-insertAttachment:withAlternateFilename:completionHandler:
//消息
-insertMessage:localizedChangeDescription:completionHandler:
//表情
-insertSticker:completionHandler:
//文本
-insetText:completionHandler:
这些方法在发送相应内容的时候进行调用,需要注意的是,这里进行的不是发送消息,而是将消息添加到文本框,用户还需要自己点击发送按钮进行发送.
除了文本和贴纸外,还要说下MSMessage对象,他可以包含特有的数据、持有一个会话、让参与者更新消息,但是这个对象的呈现需要layout属性.
其中有一个URL属性,这个属性要求是一个HTTP(S)链接或者是一个数据URL。要是一个有效的链接,如果是一个网址,那么会在浏览器中加载。
layout属性必须是MSMessTemplateLay,并且你不能在创建子类或者新建MSMessageLayout。消息模板包含消息扩展的图标,图像,视频或音频文件,以及一些文本元素(标题,副标题,标题,subcaption,尾随标题和尾随subcaption)。如下图

需要注意的是,发送的内容必须是本地内容,而且MSMessageTempLayout的mediaFileURL属性会在设置image属性后被忽略.
selectedMessage
想要实现具备特殊交互的,除了发送类型是MSMessage消息外,还需要处理点击事件.
*. 如果用户点击了拓展消息中的一个,这个属性会被设置成当前消息,否则会被设置成nil。
*. 如果你的拓展因用户点击消息而启动,那么这个属性会被设置成拓展启动时的消息。可以在 didBecomeActiveWithConversation 中监听
*. 如果用户在你的拓展运行时点击消息,这个属性的值会改变。 可以在willTransitionToPresentationStyle 中监听
*. 页使用KVO来监听这个属性来响应相应的变化. (其实说实话,这个我没能实现)
应用的数据可以在message的url属性来解析。
如果消息与会话关联,你可以使用用一个会话实力一个新的消息来更新消息。使用conversation的 insertMessage:localizedChangeDescription:completionHandler: 方法来发送新消息。当用户发送消息时,系统将其移动到底部,并更新其内容。
你还可以保存相应内容.
最后是我的demo。可能有点乱
[iOS] 在 ios10 中使用 imessage的更多相关文章
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS开发 iOS10推送必看
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...
- (译)openURL 在 iOS10中已弃用
翻译自:openURL Deprecated in iOS10 译者:Haley_Wong 苹果在iOS 2 推出了 openURL:方法 作为一种打开外部链接的方式.而与之相关的方法 canOpen ...
- iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- unity导出工程导入到iOS原生工程中详细步骤
一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- iOS:项目中疑难Crash问题集锦
项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...
- 关于iOS去除数组中重复数据的几种方法
关于iOS去除数组中重复数据的几种方法 在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...
随机推荐
- PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization
用卷积神经网络对相机位置和角度进行回归.
- elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- javapms部署之后首页不能正常显示问题
今天在ligerui的技术群里看见了javapms,于是就到官网逛了逛 首先要做的就是了解了javapms使用到的技术 然后下载了程序安装包javapms_v1.1_beta(官网下载失败了,就bai ...
- TCP三次握手建立关系
三次握手(three times handshake:three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的 发送和接收同步,根据所接收到的数据量而 ...
- C# 分享几个ip的方法吧,包括正则验证ip
/// <summary> /// 正规则试验IP地址 /// </summary> /// <param name="IP"></par ...
- HTML5 3D爱心动画及其制作过程
之前有看到过很多基于HTML5或者CSS3制作的爱心动画,不过基本上都是2D平面的,今天在国外的网站上看到一个基于HTML5 3D的爱心动画,对于HTML5爱好者来说,不免兴奋了一把.下面将分享一下这 ...
- shell特殊符号cut命令 sort_wc_uniq命令 tee_tr_split命令 shell特殊符号
shell特殊符号cut命令 特殊符号 * 通配符,任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 c=\$a\$b echo $c | 管道符 cat 1.txt |less ...
- UART Receive FIFO and Receive Timeout
为什么UART要有FIFO? 现代的CPU运转速度越来越快.UART的波特率通常达不到10M,在没有FIFO的情况下.每次填充数据给UART 或者 从UART取数据都会占用CPU的时间.这是极大的浪费 ...
- Dominoserver 安装
domino安装及语言包安装 http://wenku.baidu.com/view/f473600d581b6bd97f19ea9b.html dominoserver 安装后启动配置: http: ...
- koa项目用mongoose与mongodb交互,始终报错FormModel is not defined
koa项目用mongoose与mongodb交互,始终报错FormModel is not defined,就是自己定义的model实例始终不能找到,但是明明定义了,这时候就要看大小写了,当创建一个m ...