Interactive Messages
Message API Overview
public enum MSMessagesAppPresentationStyle : UInt {
case compact
case expanded
}
在Compact模式中,不能访问键盘;也不能左滑或者右滑,那实质上相当于切换了iMessage App;可以访问到用户输入框,用户可以不停的插入新的消息并且取代旧的那一个。
<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>
iMessage Extension Lifecycle
Compose a Message
消息由类MSMessage定义。它拥有以下属性:
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函数来获得被点击的消息。