IOS IM客户端主体结构

2016-07-06  本文已影响378人  Aliyunyun

下面所有的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];
    }
上一篇下一篇

猜你喜欢

热点阅读