上一篇文章主要讲述了有关Sticker的快速集成,这篇文章就说一下如何在信息应用里集成自定义的列表界面,以及信息的交互。
在上篇文章中提到,显示界面的ViewController是Xcode 自动为我们创建的 MessagesViewController。
不管是添加Stiker(贴纸,表情),还是我们自定义的view,最终都是要放到 MessagesViewController 当中的。
1、 创建一个自己的View,或者 ViewController。假设叫做 MyMessageViewController。这里假设放了一个UITableView作为 MyMessageViewController的内容。
self.messageViewController = [[MyMessageShopViewController alloc]init];
self.messageViewController.delegate = self; //准守自定义的协议(目的是让MessagesViewController处理选中某个cell后的逻辑)
[self.view addSubview:self.messageViewController.view];
[self.messageViewController.view autoPinEdgesToSuperviewEdges];
仅仅就这一步,打开信息,就可以看到我们的界面了,但只是界面,目前还无法发送给给联系人。当然,联系人更没有办法通过点击收到的消息,继续操作。
在解决这些问题之前。先了解一下几个概念。
MSConversation :这个类包含了我们的消息体MSMessage,以及发送message的方法。
//发送一个 MSMessage 消息体
- (void)insertMessage:(MSMessage *)message completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;
//发送Sticker(贴纸,表情)
- (void)insertSticker:(MSSticker *)sticker completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;
//发送纯文本消息
- (void)insertText:(NSString *)text completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;
//发送文件
- (void)insertAttachment:(NSURL *)URL withAlternateFilename:(nullable NSString *)filename completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;
MSMessage:消息体,包含了我们消息的内容的排版MSMessageLayout。
MSMessageLayout:对于消息体的排版,系统已经为我们抽象出了一个这个类,只暴露了.h文件。
MSMessageTemplateLayout:继承与MSMessageLayout,包含了消息的内容,有一下这些属性:
image;
imageTitle;
imageSubtitle;
caption;
subcaption;
trailingCaption;
trailingSubcaption;
具体显示位置如下:
2、发送消息:
#pragma mark - MessageSelectedDelegate//这个协议是我们自定义的,用来处理我们的cell选中后的内容.
- (void)didSelectedMessage:(MyModel *)model{
MSConversation * conversion = [[MSConversation alloc]init];//创建对话
MSMessage *sendMessage = [[MSMessage alloc]init];//创建消息体
sendMessage.URL = [NSURL URLWithString:F(@"%@",model.id)];//传递一些我们需要的参数(用于消息发送成功后的点击操作)
MSMessageTemplateLayout *messageLayout = [[MSMessageTemplateLayout alloc]init];//Layout排版
messageLayout.image = self.messageViewController.messgaeImage;//把我们cell上的图片传递过来
messageLayout.imageTitle = model.imageTitle;
messageLayout.imageSubtitle = model.imageSubtitle;
messageLayout.caption = model.caption;
messageLayout.subcaption = model.subcaption;
sendMessage.layout = messageLayout;
//开始发送消息
@weakify(self)
[conversion insertMessage:sendMessage completionHandler:^(NSError * error) {
@strongify(self)
if (self.presentationStyle == MSMessagesAppPresentationStyleExpanded) {
[self requestPresentationStyle:MSMessagesAppPresentationStyleCompact]; //发送成功后,改变MessageViewController的展现方式(当然你也可以不用这样做,根据需要来)
}
}];
}
3、用户点击收到的消息的响应
每当消息被选中的时候,被选中的MSMessage的中url属性就会发生变化。因此我们可以监听这个变化。
@weakify(self)
[RACObserve(self, activeConversation) subscribeNext:^(MSConversation *x) {
@strongify(self)
if (x.selectedMessage.URL) {
[self.extensionContext openURL:[NSURL URLWithString:F(@"urlschema://goods_code=%@",[x.selectedMessage.URL absoluteString])] completionHandler:^(BOOL success) {
}];//点击收到的消息,通过你App的urlschema,以及传递的参数,打开你的App,并跳转到指定的页面。
}
}];
我这里使用了ReactCocoa,你也可以使用系统的KVC进行监听,道理是一样的。
如果你想在自己的消息里面,通过点击发送成功的消息进入App的指定页面。需要在如下的方法里添加这样的代码:
-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle {
if (self.activeConversation.selectedMessage.URL) {
[self.extensionContext openURL:[NSURL URLWithString:F(@"urlschema://goods_code=%@",[self.activeConversation.selectedMessage.URL absoluteString])] completionHandler:^(BOOL success) {
}];
}
}
补充:MessageViewController的方法调用顺序。
1、当我们的iMessage刚启动的时候,会掉用
-(void)didBecomeActiveWithConversation:(MSConversation *)conversation;
2、改变显示模式的时候,会调用
-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
3、取消发送消息的时候分别调用
-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
-(void)didCancelSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
4、用户点击发送消息的时候分别调用
-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
-(void)didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
-(void)didStartSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
————— 完