本文转载至 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中添加表情包。添加的贴纸需要满足一下条件

  1. 图片类型必须是 png、apng、gif或者jpeg
  2. 文件大小必须 小于500K
  3. 图片大小必须在 100 100 到 206 206 之间

需要注意的是:必须要永远提供 @3x 大小的图片(即 300 300 到 618 618 )。系统可以根据当前设备通过 runtime 自动调整图片来呈现 @2x 和 @1x

系统能够自适应的展示贴纸,所以为了更好的展示贴纸,最好提供的贴纸是以下三种大小的类型

  1. 小型 100*100
  2. 中型 136*136
  3. 大型 206*206

添加方法也很简单,方式直接如下图

2.iMessage应用

iMessage app使用完整的框架和Message app进行交互。使用iMessage app能够

  1. 在消息应用内呈现一个自定义的用户交互界面。 使用MSMessagesAppViewController
  2. 创建一个自定义或者动态的表情包浏览器。使用 MSStickerBrowserViewController
  3. 添加文本、表情、或者媒体文件到消息应用的文本输入框。使用 MSConversation
  4. 创建带有特定的应用数据交互的消息。使用 MSMessage
  5. 更新可以相互影响的消息(例如,创建游戏或者可以合作的应用)。使用 MSSession

我们可以通过iMessage完成以上五种事情,下面分别来说:

  1. 新建一个空白应用后,会有一个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
  1. MSStickerBrowserViewController自带拖动添加、长按预览、点击添加。使用这个类来自定义表情浏览器的话,可定制性会更高,她可以根据data source来动态改变数据,也可以自定义每个贴纸的大小。创建后需要实现它的两个代理numberOfStickersInStickerBrowserView: 和 stickerBrowserView:stickerAtIndex:来返回相应的内容。

    需要注意的是1.内容要是本地图片 2.表情的大小是可以调整的,但是还是只支持是三种样式

  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的更多相关文章

  1. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  2. iOS开发 iOS10推送必看

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...

  3. (译)openURL 在 iOS10中已弃用

    翻译自:openURL Deprecated in iOS10 译者:Haley_Wong 苹果在iOS 2 推出了 openURL:方法 作为一种打开外部链接的方式.而与之相关的方法 canOpen ...

  4. iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  5. iOS 解决LaunchScreen中图片加载黑屏问题

    iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...

  6. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  7. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

  8. iOS:项目中疑难Crash问题集锦

    项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...

  9. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

随机推荐

  1. 动态SQL是什么??什么是静态SQL,动态SQL的动态体现在哪里???

    首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程.在某种高级语言中 ...

  2. Git -- 从远程库克隆

    上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...

  3. C# 在EF中直接运行SQL命令

    相信不少使用EF的同志们已经知道如何在EF中运行SQL命令了.我在这里简单总结下,希望对大家学习EF有所帮助! 在 EF第一个版本(.NET 3.5 SP1)中,我们只能通过将ObjectContex ...

  4. ZeroClipboard插件——复制到剪切板

    ZeroClipboard是一个轻量级的jQuery“复制到剪贴板”插件采用了时下流行的零剪贴板库.官网:http://www.steamdev.com/zclip 参数及默认值path(必选)  Z ...

  5. Java标准I/O流编程一览笔录

    I/O是什么 I/O 是Input/Output(输入.输出)的简称,输入流可以理解为向内存输入,输出流是从内存输出. 流 流是一个连续的数据流,可以从流中读取数据,也可以往流中写数据.流与数据源,或 ...

  6. 8.4 Java 命名规范

    Class: 所有单词的首字母大写, TestJava Method: 第一个单词的首字母小写,之后每个单词的首字母大写, getAddressForMe() Property: 第一个单词的首字母小 ...

  7. USBWebServer 中文便携版 快速搭建 PHP/MySQL 网站服务器环境

    如果你是一位 WEB 开发者,或正在学习网页编程,你一定会发现,每到一台新电脑上想要在本地调试测试/运行网站代码都得搭建配置一遍 WAMP (Win.Apache.PHP.MySQL) 环境简直烦透了 ...

  8. ioncube

    FileRun多功能的VPS文件管理器使用ioncube加密的 ioncube通过将代码编译成字节码,使PHP源代码免受他人监控.剽窃以及改动 ioncube提供了一个安装的向导程序 下载地址http ...

  9. spring+mybatise注解实现

    spring+mybatise注解实现 spring.jpa.database=MYSQL spring.datasource.type=com.alibaba.druid.pool.DruidDat ...

  10. python 函数结果缓存一段时间的装饰器

    把函数结果缓存一段时间,比如读取一个mongodb,mongodb中的内容又在发生变化,如果从部署后,自始至终只去读一次那就感触不到变化了,如果每次调用一个函数就去读取那太频繁了耽误响应时间也加大了c ...