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

————— 完

快速集成 iMessage(下)相关推荐

  1. 快速集成 iMessage (上)

    iMessage 是iOS10 新推出的一个 App Extension,能够在系统应用信息中,加入我们自己的内容,发送给好友,甚至能和好友对同一条信息就操作. 本篇文章主要讲如何在 iMessage ...

  2. 网易云信集成视频教程(六):如何快速实现iOS下IM自定义消息收发?

    第三期视频集成教程中,我们介绍了Android自定义消息的实现,有小伙伴留言问我们会有iOS版本吗,现在iOS版本来了!第六期视频教程我们将教大家如何快速实现iOS下IM自定义消息收发. 第六期 如何 ...

  3. android a z 快速定位,快速集成android实现listview的字母A-Z排序,界面侧边字母索引...

    Android手机字母A-Z排序侧边索引是非常常见的功能,在此提供快速集成框架.教你用Android studio工具一分钟搞定这个效果. 实现效果: 以及点击F跳转效果 第一步库包导入实现拼音检索功 ...

  4. 友盟分享快速集成--学习记录

    1 产品概述 友盟社会化组件,可以让移动应用快速具备社会化分享.登录.评论.喜欢等功能,并提供实时.全面的社会化数据统计分析服务. 指南将会手把手教你使用社会化组件SDK,用5分钟为APP增加新浪微博 ...

  5. GMaps.js:让你快速集成 Google Maps 服务的 jQuery 插件

    GMaps.js 功能 除了添加指定经纬度的标准地图之外,GMaps.js 还能定义地图放大的级别,添加标注,获取当前用户的地理位置(HTML5 geolocation),定义路线,绘制折线,并且实现 ...

  6. Spring Boot 快速集成第三方登录功能

    Spring Boot 快速集成第三方登录功能 前言 此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth 实现第三方登录,包括 QQ 登录.G ...

  7. 快速集成iOS基于RTMP的视频推流

    http://www.jianshu.com/p/8ea016b2720e 效果图 iTools有点卡, 但是推到服务器倒是很快的. 推流 前言 这篇blog是iOS视频直播初窥:<喵播APP& ...

  8. springboot 集成mybatis_SpringBoot快速集成Mybatis并轻松上手调试教程,请查收!

    本篇主题:SpringBoot如何快速集成Mybatis并上手调试? 引入相关Jar依赖 这里使用Gradle作为构建工具,构建脚本build.gradle见下图: build.gradle 事实上, ...

  9. SpringBoot动态切换数据源-快速集成多数据源的启动器

    简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器. 其支持 Jdk 1.7+, SpringBoot 1.4 ...

  10. android个推快速集成,个推用户画像产品(个像)Android集成实践

    咱们团队以前一直是个推推送的忠实用户,近期个推新推出了产品"个像·用户画像",恰好很是契合咱们的业务需求,因而咱们也试用了一下.总的来讲效果还不错,这篇文章就为你们介绍一下如何从零 ...

最新文章

  1. 禅道8.2.4 腾讯云迁移至VM
  2. tensorflow随笔-变量
  3. python僵尸进程和孤儿进程_python学习笔记——孤儿进程和僵尸进程
  4. 键盘改键软件_一秒五键,一键三招,万种光污染,杜伽K310樱桃轴机械键盘感受...
  5. 【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)
  6. 存储器容量扩展——位扩展、字扩展
  7. Arduino笔记-Arduino UNO与WeMos D1串口通信(数据交互)
  8. Python内置GUI模块Tkinter的几点笔记
  9. Map ,Reduce
  10. 机器学习基础:极大似然估计(Machine Learning Fundamentals: Maximum Likelihood Estimation)
  11. 概率论与数理统计基础
  12. js 生成二维码 vue项目
  13. 生产排程系统_【经典文章】漫谈生产计划排程与控制系统
  14. 【建议收藏】10个适合程序员逛的在线社区
  15. Yang‘s 不等式与 Cauchy-Schwarz 不等式
  16. 做虚拟化的服务器网卡用什么,VMware ESX两种虚拟网卡性能对比测试
  17. sqp方法 matlab程序,matlab-program 基于matlab编写了SQP法 - 下载 - 搜珍网
  18. 【电脑使用】硬盘无法引导进入系统,无法退出BIOS
  19. 标量、向量和矩阵的求导法则
  20. Dialog的Dismiss方法使用注意事项

热门文章

  1. 如何生成WIFI二维码供手机扫一扫连接WIFI
  2. Django系列16-员工管理系统实战--echar图表统计
  3. openwrt中luci学习笔记
  4. CIS芯片测试到底怎么测?
  5. 移动前端开发人员必知必会:移动设备概述
  6. VP9编码:迄今的尝试
  7. java导出excel水印_java实现导出带有水印的excel
  8. CSS盒子模型、浮动+例子分析
  9. 小学英语口语测试软件,最新小学英语口语测试题(四年级)
  10. 我研究了3年,终于找出2021年完美的听歌方案!