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;

目录
相关文章
|
10天前
|
存储 IDE 开发工具
移动应用开发之旅:打造你的首个iOS应用
【9月更文挑战第23天】在数字化浪潮中,移动应用已成为连接用户与数字世界的关键桥梁。本文将带领读者踏上开发属于自己的第一个iOS移动应用的旅程,从理解移动操作系统的核心概念出发,逐步深入到实际的应用构建过程中。通过简洁明了的语言和具体的代码示例,我们将一起探索如何在苹果的iOS平台上实现一个简单的“待办事项列表”应用,让读者不仅能够学习到编程知识,还能体会到将想法转化为现实产品的成就感。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一个实用的指南,帮助你迈出成为移动应用开发者的第一步。
|
23天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
47 5
|
28天前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
39 11
|
1月前
|
API iOS开发
探索iOS开发:打造你的第一个天气应用
【8月更文挑战第31天】 在这篇文章中,我们将一起潜入iOS开发的海洋,从初学者的角度出发,一步步构建我们自己的天气应用。通过实际的项目实践,你将学习到如何获取网络数据、如何在界面上展示这些数据,以及如何处理用户交互。文章以通俗易懂的语言,结合代码示例,引导你理解并实现一个简单天气应用的核心功能。无论你是编程新手还是希望扩展你的iOS开发技能,这篇文章都将为你提供宝贵的指导和启发。
|
25天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。
|
开发者 iOS开发
iOS10中Messages独立应用与扩展插件详析(一)
iOS10中Messages独立应用与扩展插件详析
234 0
iOS10中Messages独立应用与扩展插件详析(一)
|
开发者 容器
iOS10中Messages独立应用与扩展插件详析(三)
iOS10中Messages独立应用与扩展插件详析
157 0
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
14天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
2天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
18 7
下一篇
无影云桌面