[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)方 ...
随机推荐
- Ogre2.1 结合OpenGL3+高效渲染
在DX10与OpenGL3+之前,二者都是固定管线与可编程管线的混合,其中对应Ogre1.x的版本,也是结合固定与可编程管线设计.转眼到了OpenGL3+与DX10后,固定管线都被移除了,相对应着色器 ...
- C#之内存分配
在C#中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等 ...
- (转)DSound开发常用的几个结构
WAVEFORMATEX WAVEFORMATEX { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPe ...
- IE8不支持数组的indexOf方法
在IE8下有个js错误,但是在其它浏览器下(Firefox, Chrome, IE9)下面都很正常.后来调试发现原因是在IE8下,js数组没有indexOf方法. 在使用indexOf方法前,执行一下 ...
- C# 实现写入文本文件内容功能
private void write_txt(string str1, string str2, string str3) { System.DateTime currentTime = System ...
- C# 把字符串中间的多个连续的空格转化成一个空格
今天在弄帮客户将txt文件中的信息导入到数据库中,遇到了这个问题.因为客户的txt文件中两个字符串之间的空格数量不确定,没有办法使用split函数来分割,最后想到的办法是,将连续的空格转成一个空格,然 ...
- layui框架遇到时间控件在搜索之后再次点击出现异常的问题
原因:使用jquery赋值html代码问题 解决方法:使用js代码处理即可,如: document.getElementsByTagName('tbody')[0].innerHTML = 自己的ht ...
- 磁盘格式化/磁盘挂载/手动增加swap空间
4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间 磁盘格式化 查看centos7支持的文件系统格式 cat /etc/filesystem,centos7默认的文件 ...
- SharePoint PowerShell使用Backup-SPSite指令来备份网站集
备份网站集: Backup-SPSite -Identity http://win2012sp2013:1000/ -Path "C:\KenmuTemp\Test File\Temp\si ...
- 缓存管理(本地缓存+memcached)
http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html