最近任务是环信的群组功能,记录所思以备后用。
0.消息
消息是IM中交互的实体,在SDK中对应的类型是EMMessage,EMMessage可以由多个符合<IEMMessageBody>协议的body组成,文档中还提到强力建议使用一个body,多个body存在bug
/*!
@method
@brief 创建消息实例(用于:创建一个新的消息)
@discussion 消息实例会在发送过程中内部状态发生更改,比如deliveryState
@param receiver 消息接收方
@param bodies 消息体列表
@result 消息实例
*/
- (id)initWithReceiver:(NSString *)receiver
bodies:(NSArray *)bodies;
环信代码中有这样一行:
EMMessage *message = [[EMMessage alloc] initWithReceiver:_callSession.sessionChatter bodies:@[textBody]];
/*!
@class
@brief 通话对方的username
*/
@property (strong, nonatomic) NSString *sessionChatter;
<1.sessionChaatter是username,初始化时用的是username !
1.透传消息
环信SDK提供的一种特殊类型的消息,即CMD,既不会走APNS也不会存db,类似一种指令型的消息,比如服务器要通知客户端做某些操作,则服务器和客户端提前约定好某个字段,当客户端收到约定好的字段时,执行某种特定操作。
<1.什么是指令型的消息呢?
<2.如果不走APNS,并且网络请求是HTTP时,服务器怎样推送消息给客户端呢?
环信文档中透传消息的初始化是这样的:
EMChatCommand *cmdChat = [[EMChatCommand alloc] init]; cmdChat.cmd = @"reason"; EMCommandMessageBody *body = [[EMCommandMessageBody alloc] initWithChatObject:cmdChat]; // 生成message EMMessage *message = [[EMMessage alloc] initWithReceiver:@"6001" bodies:@[body]]; message.messageType = eMessageTypeChat; // 设置为单聊消息
环信代码中是这样的:
/*!
@class
@brief 聊天的命令对象类型
*/
@interface EMChatCommand : NSObject<IEMChatObject>
文档中说透传消息类似指令型的消息,EMChatCommand即聊天的命令对象类型。
/*!
@property
@brief 命令
*/
@property (nonatomic, strong) NSString *cmd;
cmd是EMChatCommand的属性,是服务器和客户端约定好的字段
2.解析消息
解析普通消息:
// 收到消息的回调,带有附件类型的消息可以用SDK提供的下载附件方法下载(后面会讲到) -(void)didReceiveMessage:(EMMessage *)message { id<IEMMessageBody> msgBody = message.messageBodies.firstObject; switch (msgBody.messageBodyType) { case eMessageBodyType_Text: { // 收到的文字消息 NSString *txt = ((EMTextMessageBody *)msgBody).text; NSLog(@"收到的文字是 txt -- %@",txt); } break;
default: break; } } 解析透传消息:
-(void)didReceiveCmdMessage:(EMMessage *)cmdMessage{ EMCommandMessageBody *body = (EMCommandMessageBody *)cmdMessage.messageBodies.lastObject; NSLog(@"收到的action是 -- %@",body.action); }
解析消息扩展属性:
-(void)didReceiveCmdMessage:(EMMessage *)cmdMessage{ // cmd消息中的扩展属性 NSDictionary *ext = cmdMessage.ext; NSLog(@"cmd消息中的扩展属性是 -- %@",ext); } // 收到消息回调 -(void)didReceiveMessage:(EMMessage *)message{ // 消息中的扩展属性 NSDictionary *ext = message.ext; NSLog(@"消息中的扩展属性是 -- %@",ext); }