[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)方 ...
随机推荐
- Html中怎么用CSS让ul中多个li标签不换行横排显示
布局 通常有三种方式 { 1. position 2. float: left --> 其次是这个 3. block: inline-block --> 他们推荐我用这个 } 具体描述 ...
- e810. 创建弹出菜单
final JPopupMenu menu = new JPopupMenu(); // Create and add a menu item JMenuItem item = new JMenuIt ...
- 每天一个linux命令:mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
- Linux入门教程:如何检查Linux系统的最后重启时间
问题: 是否有一个命令可以快速地检查系统已经运行了多久? 也就是我怎么知道Linux系统最后的重启时间? 有许多方法来查询系统最后的重启时间. 方法一 第一种方法是使用last命令. $ last r ...
- 如何在 Ubuntu 16.04,15.10,14.04 中安装 GIMP 2.8.16(类似于PS软件)
GIMP 图像编辑器 2.8.16 版本在其20岁生日时发布了.下面是如何安装或升级 GIMP 在 Ubuntu 16.04, Ubuntu 15.10, Ubuntu 14.04, Ubuntu 1 ...
- idea过期激活
1.进到文件夹中:C:\Windows\System32\drivers\etc ,找到hosts文件,用记事本编辑 2.将“ 0.0.0.0 account.jetbrains.com ”添加到h ...
- JAVA构造方法与方法是啥意思,方法重载方法覆盖俗谈
构造函数跟构造方法是一样的,只是称呼不同; C语言里叫函数,Java里叫方法. 成员方法必须有返回类型即使是没有返回,也要写上void 构造方法没有返回类型,而且和类名一样!一个类里面,一看就知道了譬 ...
- [Learn AF3]第三章 App Framework 3组件之Panel:afui的核心
Panel,afui的核心组件 组件名称:Panel 使用说明:按照官方的说法,panel组件是af3的“核心(heart of the ui)”,panel用于构造应用中独立的内容展示区域, ...
- 关于golang中包(package)的二三事儿
golang的package和其他语言的组织方式完全不同,刚开始接触时,很不适应. golang的package的特点: 1.go的package不局限于一个文件,可以由多个文件组成. 组成一个pac ...
- SharePoint PowerShell使用Export-SPWeb和Import-SPWeb指令来导出和导入网站
导出网站,例如: Export-SPWeb -Identity http://win2012sp2013:1000/Hopewell_Portal/ -Path "C:\KenmuTemp\ ...