Interactive Messages
Interactive Messages(交互消息),顾名思义,它允许用户对其进行交互性操作。
Message API Overview
MSMessagesAppViewController:这个视图提供了消息扩展的用户界面(providing your extension's UI)。
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_0.jpg)
它拥有两种表现形式:
public enum MSMessagesAppPresentationStyle : UInt {
case compact
case expanded
}
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_1.jpg)
在Compact模式中,不能访问键盘;也不能左滑或者右滑,那实质上相当于切换了iMessage App;可以访问到用户输入框,用户可以不停的插入新的消息并且取代旧的那一个。在Expanded模式中,可以访问到键盘;也可以使用横向的滑动;但是不能访问到用户输入框;当两种模式开始切换的时候会调用:
open func willTransition(to presentationStyle: MSMessagesAppPresentationStyle)
当两种模式切换完成的时候调用:
open func didTransition(to presentationStyle: MSMessagesAppPresentationStyle)
获得指定的模式:
open func requestPresentationStyle(_ presentationStyle: MSMessagesAppPresentationStyle)
取消iMessage App并且展示键盘
open func dismiss()
MSConversation:这个API提供了发送消息与获取会话信息的功能
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_2.jpg)
MSMessage:之所以能有这个消息球在这边展示,就是MSMessage的功能了。可以看到它由两部分组成,MSSession与MSMessageTemplateLayout。它们分别用于控制消息如何发送以及消息如何展示。
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_3.jpg)
iMessage Extension Lifecycle
它的启动过程:
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_4.jpg)
它的销毁过程:
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_5.jpg)
Compose a Message
消息由类MSMessage定义。它拥有以下属性: url:URL类型。它用来描述消息内容,但是在mac中这个链接不会被解析,只会通过浏览器来打开展示。 accessibilityLabel:对消息的描述,使用户可以在看到消息的同时获取到足够的描述信息。
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_6.jpg)
layout:MSMessageLayout类型。它可以控制消息的展现形式,通过设定不同的子类可以实现不同的展现方式,但是,目前系统只提供MSMessageTemplateLayout一种展示方法,属性如下:
image:用来展示图片,图片展示区域为上图的粉色部分。
mediaFileURL:拥有与image相同的展示区域,当image不足以支持想要展示的内容时,就可以使用该属性。比如说本地的短视频啥的。同时它也支持PNG,JPEG,GIF等格式。
需要注意的是:当image与url都提供的时候,image的优先级要高于url;其次,为了避免因为缩放导致的一些问题,例如清晰度啥的,尽量避免直接在图片上渲染文字,系统为我们提供了解决方案:
imageTitle:文本类型,展示文字。。。
imageSubtitle:文本类型,展示文字。。。
其他的还有下边标题栏四个属性:
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_7.jpg)
需要注意的是,如果这四个属性都置为nil,则标题栏消失:
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_8.jpg)
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
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_9.jpg)
当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。
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_10.jpg)
无论是Extension是inactive还是active,当时间线结束以后你都可以通过在MSMessagesAppViewController中调用MSConversation的selectedMessage函数来获得被点击的消息。
Session Messages
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_11.png)
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_12.png)
上面两个图分别展示了是否使用MSSession形成的不同效果,左图是未使用,右图是使用。可以对比出当未使用MSSession时会出现大量的未完成的图片以及对话框,,使用了的相对就简洁许多。当我们发送第一个消息时,创建并初始化一个MSSession对象,接下来,当回复这个消息时,不再创建新的MSSession,而是通过activeConversation的selectMessage来获取到已存在的session。通过设置message的summaryText来给予一个概要信息,例如
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_13.png)
当这个值被设置为nil时,则不会有那个概要信息的提示
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_14.jpg)
Advanced Messages API
用户点击发送按钮时候回调:
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_15.jpg)
![[iuud8]ios10之iMessageApp,Part2](http://www.codesec.net/app_attach/201610/11/20161011_426_480928_16.jpg)
**************************************算了,网络好差,心情好差,不想写了