下面所有的IM框架的描述,都是基于我現(xiàn)在項目的框架的總結(jié)峭沦,希望有用同樣的通信方式的同學(xué)看到了贾虽,可以給出一些建議。
這里的通信方式是通過socket發(fā)送和接收吼鱼,并且服務(wù)器收到客戶端發(fā)送的消息后蓬豁,會回復(fù)一個ACK。
IM主體功能:
1菇肃、發(fā)送消息地粪,消息發(fā)送狀態(tài)反饋(成功,超時)
2巷送、接收消息驶忌,通過廣播的方式通知到視圖層。
IM架構(gòu).png
MessageCenter的主要工作:
1、創(chuàng)建消息結(jié)構(gòu)體
2付魔、發(fā)送消息
3聊品、接收消息
4、寫數(shù)據(jù)庫(歷史消息几苍,最新消息 等)
5翻屈、消息發(fā)送狀態(tài)監(jiān)聽,與反饋
** 需要注意的就是消息狀態(tài)監(jiān)聽妻坝,需要保存消息狀態(tài)回調(diào)伸眶。
messageCenter分成2條主要是流程圖:
1、發(fā)送流程圖
2刽宪、接收流程圖
發(fā)送消息流程圖.png
接收消息流程圖.png
消息代理的詳細(xì)代碼:
前提條件:
1厘贼、每一個消息都有一個唯一的消息ID
消息狀態(tài)更新具體設(shè)計:
//消息代理,用來保存發(fā)送出去的消息和需要返回消息狀態(tài)的回調(diào)圣拄。
@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
{
//根據(jù)自己的超時要求判斷超時芥永,并執(zhí)行想要的回調(diào)
}
#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];
}