美文网首页
IOS IM客户端主体结构

IOS IM客户端主体结构

作者: Aliyunyun | 来源:发表于2016-07-06 11:55 被阅读378次

    下面所有的IM框架的描述,都是基于我现在项目的框架的总结,希望有用同样的通信方式的同学看到了,可以给出一些建议。
    这里的通信方式是通过socket发送和接收,并且服务器收到客户端发送的消息后,会回复一个ACK。

    IM主体功能:
    1、发送消息,消息发送状态反馈(成功,超时)
    2、接收消息,通过广播的方式通知到视图层。

    IM架构.png

    MessageCenter的主要工作:
    1、创建消息结构体
    2、发送消息
    3、接收消息
    4、写数据库(历史消息,最新消息 等)
    5、消息发送状态监听,与反馈

    ** 需要注意的就是消息状态监听,需要保存消息状态回调。

    messageCenter分成2条主要是流程图:
    1、发送流程图
    2、接收流程图

    发送消息流程图.png 接收消息流程图.png

    消息代理的详细代码:
    前提条件:
    1、每一个消息都有一个唯一的消息ID

    消息状态更新具体设计:

    //消息代理,用来保存发送出去的消息和需要返回消息状态的回调。

        @interface RSMessageCenterTaskDelegate : NSObject
    
        @property (nonatomic, weak) MessageCenter *messageManager;
        @property (nonatomic, copy) MessageTaskCompletionHandler completionHandler;
        @property (nonatomic, strong) ChatMessage *chatMessage;
    
        @end
    
    
        @interface MessageCenter()<IMSocketDelegate, WebSocketConnectionDelegate>
        @property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByMessageIdentifier;
        @property (readwrite, nonatomic, strong) NSLock *lock;
        @property (readwrite, nonatomic, strong) NSTimer *checktTimeOutTimer;
        @end
    
        - (instancetype)init
        {
            self = [super init];
            if (self) {
                self.mutableTaskDelegatesKeyedByMessageIdentifier = [[NSMutableDictionary alloc]init];
                self.lock = [[NSLock alloc]init];
                self.lock.name = @“RSMESSAGE_TASK_LOCK”;
                self.checktTimeOutTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(checkSocketSendTimerOut) userInfo:nil repeats:true];
                [[NSRunLoop currentRunLoop]addTimer:checktTimeOutTimer forMode:NSRunLoopCommonModes];
              }
       }
    
        - (void)checkSocketSendTimerOut
        {
          //根据自己的超时要求判断超时,并执行想要的回调
        }
        #pragma -mark MessageCnter callback
        - (void)setDelegate:(RSMessageCenterTaskDelegate *)delegate forMessage:(NSString *)messageKey
        {
            [self.lock lock];
            self.mutableTaskDelegatesKeyedByMessageIdentifier[messageKey] = delegate;
            [self.lock unlock];
        }
    
        - (void)removeDelegateForMessage:(NSString *)messageKey
        {
            [self.lock lock];
            [self.mutableTaskDelegatesKeyedByMessageIdentifier removeObjectForKey:messageKey];
            [self.lock unlock];
        }
    
        - (void)addDelegateForMessage:(ChatMessage *)chatMessageData         completionHandler:(MessageTaskCompletionHandler)completionHandler
        {
            RSMessageCenterTaskDelegate *delegate =  [[RSMessageCenterTaskDelegate alloc]init];
            delegate.completionHandler = completionHandler;
            delegate.messageManager = self;
            delegate.chatMessage = chatMessageData;
            NSString *messageKey = [self messageDelegateKey:chatMessageData.messageId];
            [self setDelegate:delegate forMessage:messageKey];
        }

    相关文章

      网友评论

          本文标题:IOS IM客户端主体结构

          本文链接:https://www.haomeiwen.com/subject/jvihjttx.html