iOS10中Messages独立应用与扩展插件详析(二)

简介: iOS10中Messages独立应用与扩展插件详析

3.解析MSMessagesAppViewController类


       由于MSMessagesAppViewController类是继承于UIViewController类的,因此UIViewController中的视图控制器切换方法这里都可以直接使用,MSMessagesAppViewController中供开发者进行调用的属性和方法如下:


//当前激活的会话实例 后面会介绍

@property (nonatomic, strong, readonly, nullable) MSConversation *activeConversation;

//当前界面所在的状态

/*

typedef NS_ENUM(NSUInteger, MSMessagesAppPresentationStyle) {

   //紧凑状态

   MSMessagesAppPresentationStyleCompact,

   //扩宽状态

   MSMessagesAppPresentationStyleExpanded

} NS_ENUM_AVAILABLE_IOS(10_0);

*/

@property (nonatomic, assign, readonly) MSMessagesAppPresentationStyle presentationStyle;

//切换界面状态

-(void)requestPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

//调用此方法后,MessagesApp被收回 弹出键盘

-(void)dismiss;

MSMessagesAppViewController中新增加的声明周期方法如下:


//当Messages App将要激活时调用

-(void)willBecomeActiveWithConversation:(MSConversation *)conversation;

//当Messages App已经被激活后调用

-(void)didBecomeActiveWithConversation:(MSConversation *)conversation;

//当Messages App将要被注销时调用

-(void)willResignActiveWithConversation:(MSConversation *)conversation;

//当MessageApp已经被注销时调用

-(void)didResignActiveWithConversation:(MSConversation *)conversation;

//消息实体在会话中将要被选中时调用

-(void)willSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

//消息实体在会话中已经被选中时调用

-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

//接收到同一Messages App发送的消息实体时调用

-(void)didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

//开发发送消息时调用

-(void)didStartSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

//取消发送时调用

-(void)didCancelSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

//控制器界面模式将要改变时调用

-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

//控制器界面已经改变时调用

-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

4.使用MSConversation会话类来进行消息的发送


       MSConversation类用来描述会话,MSMessagesAppViewController中内置MSConversation对象,开发者可以用它来进行消息传递,示例代码如下:


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

   switch (indexPath.row) {

       case 0:

       {

           [self.activeConversation insertText:@"新的信息" completionHandler:^(NSError * error) {

             

           }];

       }

           break;

       case 1:

       {

           [self.activeConversation insertSticker:[[MSSticker alloc] initWithContentsOfFileURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"productImage" ofType:@"png"]] localizedDescription:@"image" error:nil] completionHandler:nil];

       }

           break;

       case 2:

       {

           [self.activeConversation insertAttachment:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"file" ofType:nil]] withAlternateFilename:@"文件" completionHandler:nil];

       }

           break;

       case 3:

       {

           MSMessage * message = [[MSMessage alloc]initWithSession:_session];

           message.URL = [NSURL URLWithString:@"http://www.baidu.com"];

           message.accessibilityLabel = @"message";

           message.summaryText = @"message";

           MSMessageTemplateLayout * layout = [[MSMessageTemplateLayout alloc]init];

           layout.caption = @"caption";

           layout.subcaption = @"subcaption";

           layout.trailingCaption = @"trailing";

           layout.trailingSubcaption =@"subtrailing";

           layout.image = [UIImage imageNamed:@"productImage"];

           layout.mediaFileURL =[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"productImage" ofType:@"png"]];

           layout.imageTitle = @"杜康";

           layout.imageSubtitle = @"酒水";

         

           message.layout = layout;

         

           [self.activeConversation insertMessage:message completionHandler:nil];

       }

           break;

       case 4:

       {

           [self presentViewController:[StackerViewController new] animated:YES completion:nil

            ];

       }

           break;

       case 5:

       {

           [self presentViewController:[StackController new] animated:YES completion:nil

            ];

       }

           break;

       default:

           break;

   }

}

MSConversation支持发送的消息分为4中,分别为文本消息,表情贴图消息,文件消息和Message实体消息,上面代码都做了演示。MSConversation中重要属性和方法解析如下:


//本地的设备UUID

@property (nonatomic, readonly) NSUUID *localParticipantIdentifier;

//会话中远程设备的UUID 支持多人会话

@property (nonatomic, readonly) NSArray<NSUUID *> *remoteParticipantIdentifiers;

//当前选中的消息实体

@property (nonatomic, readonly, nullable) MSMessage *selectedMessage;

//插入文本消息

- (void)insertText:(NSString *)text completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;

//插入表情贴图消息

- (void)insertSticker:(MSSticker *)sticker completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;

//插入文件附件消息

- (void)insertAttachment:(NSURL *)URL withAlternateFilename:(nullable NSString *)filename completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;

//插入Message实体消息

- (void)insertMessage:(MSMessage *)message completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;

效果图如下:

image.png

            image.png

image.png


5.消息实体MSMessage的应用


       MSMessage是Messages App定义的一种消息实体,其可以用来在Messages App间传递信息,因为它的存在,通过Messages用用实现休闲对战游戏变得十分容易,开发者不需要在写即时通信链接,只需设计游戏逻辑即可。MSMessage不能够完全自定义UI,但是Messages框架中的MSMessageTemplateLayout类可以对其UI进行简单的配置。


       MSMessage类中常用的属性和方法如下:


//初始化方法 可以绑定一个session,同一个session种的消息实体会被归为一类

-(instancetype)initWithSession:(MSSession *)session NS_DESIGNATED_INITIALIZER;

//发送此消息的设备

@property (nonatomic, readonly) NSUUID *senderParticipantIdentifier;

//消息的UI布局信息

@property (nonatomic, copy, nullable) MSMessageLayout* layout;

//消息附带的URL 开发者可以通过这个URL来传值

@property (nonatomic, copy, nullable) NSURL *URL;

//是否保留过期的消息

@property (nonatomic, assign) BOOL shouldExpire;


//盲人模式中对应的文案

@property (nonatomic, copy, nullable) NSString *accessibilityLabel;

6.消息实体布局类MSMessageLayout


       前面介绍,MSMessage类中并没有定义UI,UI部分需要配合MSMessageLayout类来配置。需要注意,MSMessageLayout类是一个抽象类,apple设计的目的可能是为了以后便于扩展多个消息布局模板。目前,开发者只需要使用MSMessageTemplateLayout类来对消息实体进行布局。


       MSMessageTemplateLayout类中可以配置的属性如下:


//设置消息实体的标题

@property (nonatomic, copy, nullable) NSString *caption;

//设置消息实体的子标题

@property (nonatomic, copy, nullable) NSString *subcaption;

//设置消息实体的右侧标题

@property (nonatomic, copy, nullable) NSString *trailingCaption;

//设置消息实体的右侧子标题

@property (nonatomic, copy, nullable) NSString *trailingSubcaption;

//设置消息实体的图片

@property (nonatomic, strong, nullable) UIImage *image;

//设置消息实体的媒体地址 需要注意 如果设置的image属性 这个属性将被忽略

@property (nonatomic, copy, nullable) NSURL *mediaFileURL;

//设置消息实体的图标标题

@property (nonatomic, copy, nullable) NSString *imageTitle;

//设置消息实体的图片子标题

@property (nonatomic, copy, nullable) NSString *imageSubtitle;

目录
相关文章
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
334 4
|
2月前
|
JavaScript 前端开发 iOS开发
ios样式开关按钮jQuery插件
ios样式开关按钮jQuery插件
58 7
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
72 2
|
3月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
94 1
|
4月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
78 5
|
开发者 iOS开发
iOS10中Messages独立应用与扩展插件详析(一)
iOS10中Messages独立应用与扩展插件详析
263 0
iOS10中Messages独立应用与扩展插件详析(一)
|
开发者 容器
iOS10中Messages独立应用与扩展插件详析(三)
iOS10中Messages独立应用与扩展插件详析
181 0
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
141 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。

热门文章

最新文章

  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    24
  • 2
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    21
  • 3
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    141
  • 4
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    224
  • 5
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    87
  • 6
    深入探索iOS开发中的SwiftUI框架
    143
  • 7
    ios样式开关按钮jQuery插件
    58
  • 8
    Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
    74
  • 9
    深入探索iOS与Android操作系统的安全性差异
    102
  • 10
    安卓与iOS开发中的跨平台策略:一次编码,多平台部署
    174