快速集成 iMessage(下)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013749108/article/details/52923857

上一篇文章主要讲述了有关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;

————— 完

展开阅读全文

没有更多推荐了,返回首页