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;
效果图如下:
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;