[iuud8]ios10之iMessage App,Part2

前篇: ios10之Message App, Part1


Interactive Messages

Interactive Messages(交互消息),顾名思义,它允许用户对其进行交互性操作。

Message API Overview

MSMessagesAppViewController:这个视图提供了消息扩展的用户界面(providing your extension's UI)。

它拥有两种表现形式:
public enum MSMessagesAppPresentationStyle : UInt {
    case compact
    case expanded
}

在Compact模式中,不能访问键盘;也不能左滑或者右滑,那实质上相当于切换了iMessage App;可以访问到用户输入框,用户可以不停的插入新的消息并且取代旧的那一个。
在Expanded模式中,可以访问到键盘;也可以使用横向的滑动;但是不能访问到用户输入框;
当两种模式开始切换的时候会调用:
<span style="font-size:14px;">open func willTransition(to presentationStyle: MSMessagesAppPresentationStyle)</span>
当两种模式切换完成的时候调用:
<span style="font-size:14px;">open func didTransition(to presentationStyle: MSMessagesAppPresentationStyle)</span>
获得指定的模式:
<span style="font-size:14px;">open func requestPresentationStyle(_ presentationStyle: MSMessagesAppPresentationStyle)</span>
取消iMessage App并且展示键盘
<span style="font-size:14px;">open func dismiss()</span>
MSConversation:这个API提供了发送消息与获取会话信息的功能

MSMessage:之所以能有这个消息球在这边展示,就是MSMessage的功能了。可以看到它由两部分组成,MSSession与MSMessageTemplateLayout。它们分别用于控制消息如何发送以及消息如何展示。

iMessage Extension Lifecycle

它的启动过程:

它的销毁过程:


Compose a Message

消息由类MSMessage定义。它拥有以下属性:
url:URL类型。它用来描述消息内容,但是在mac中这个链接不会被解析,只会通过浏览器来打开展示。
accessibilityLabel:对消息的描述,使用户可以在看到消息的同时获取到足够的描述信息。

layout:MSMessageLayout类型。它可以控制消息的展现形式,通过设定不同的子类可以实现不同的展现方式,但是,目前系统只提供MSMessageTemplateLayout一种展示方法,属性如下:

image:用来展示图片,图片展示区域为上图的粉色部分。

mediaFileURL:拥有与image相同的展示区域,当image不足以支持想要展示的内容时,就可以使用该属性。比如说本地的短视频啥的。同时它也支持PNG,JPEG,GIF等格式。

需要注意的是:当image与url都提供的时候,image的优先级要高于url;其次,为了避免因为缩放导致的一些问题,例如清晰度啥的,尽量避免直接在图片上渲染文字,系统为我们提供了解决方案:

imageTitle:文本类型,展示文字。。。

imageSubtitle:文本类型,展示文字。。。

其他的还有下边标题栏四个属性:


需要注意的是,如果这四个属性都置为nil,则标题栏消失:


Send a Message

这里所说的“发送消息”,应该说成是“把消息添加到用户输入框”更合适些。要做到这样,需要一个MSConversation实例。它可以通过MSMessagesAppViewController的activeConversation获得。一旦有了这个实例,就可以写入消息,传递消息,并且获得返回的错误等。

可以传递以下各种类型的消息(交互型消息,sticker,text,音视频):

open func insert(_ message: MSMessage, completionHandler: (@escaping (Error?) -> Swift.Void)? = nil)
open func insert(_ sticker: MSSticker, completionHandler: (@escaping (Error?) -> Swift.Void)? = nil)
open func insertText(_ text: String, completionHandler: (@escaping (Error?) -> Swift.Void)? = nil)
open func insertAttachment(_ URL: URL, withAlternateFilename filename: String?, completionHandler: (@escaping (Error?) -> Swift.Void)? = nil)

 
 当这些做了以后用户就可以点击“发送”来发送消息,需要注意的是:There's no way for your extension to actually automatically send a message and we always want the user to have the final say as to what gets send to their friends.

Replying to a Message

关于回复消息存在两种情况:Extension is inactive与Extension is active



当Extension is inactive时,用户点击聊天气泡的时候,Message Extension立刻启动,进程当即被激活。即在上面介绍的iMessage Extension Lifecycle部分,启动过程最前面加上一个Bubble Tapped的流程。当最后viewDidAppear执行以后,app就进入了Expanded模式。

当Extension is active时,app处于compact style。用户点击聊天气泡,然后Message Extension激活。它不会调用willBecomeActive或者didBecomeActive。相反,它会调用willTransition()将要切换到expanded style;然后调用didSelect函数,表明是哪个对话的哪个消息被选中;最后会调用didTransition()函数并成功切换到expanded style。



无论是Extension是inactive还是active,当时间线结束以后你都可以通过在MSMessagesAppViewController中调用MSConversation的selectedMessage函数来获得被点击的消息。

Session Messages

















































上面两个图分别展示了是否使用MSSession形成的不同效果,左图是未使用,右图是使用。可以对比出当未使用MSSession时会出现大量的未完成的图片以及对话框,,使用了的相对就简洁许多。当我们发送第一个消息时,创建并初始化一个MSSession对象,接下来,当回复这个消息时,不再创建新的MSSession,而是通过activeConversation的selectMessage来获取到已存在的session。通过设置message的summaryText来给予一个概要信息,例如

当这个值被设置为nil时,则不会有那个概要信息的提示


Advanced Messages API

用户点击发送按钮时候回调:



**************************************
算了,网络好差,心情好差,不想写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值