via:AVOS Cloud Bloggit
不少開發者想在本身的 App 中添加實時通信的功能,但一般由於沒有合適的後端支持,最終沒能實現。而 AVOSCloud 與時俱進,給你們帶來了但願。下面就來介紹使用 AVOSCloud 給本身的 App 添加實時通信功能。github
AVOSCloud SDK 從 2.5.9 開始提供了實時通信模塊。本文主要基於 iOS SDK 2.6.2.1 實現,假設你已經具備必定的 iOS 開發基礎,省略掉非實時通信相關的代碼,github 完整代碼點此 。後端
此部分只列出了通信相關的代碼,省略了一些本地對話和消息保存的代碼。完整代碼能夠查看 github 完整代碼網絡
首先是 SDK 的初始化,在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 裏面添加如下代碼完成 SDK 的初始化session
[AVOSCloud setApplicationId:AVOSAppID clientKey:AVOSAppKey];
而後是通信模塊的初始化,這裏使用一個 CDSessionManager 的單例類來管理。這裏有兩部分app
- (instancetype)init { if ((self = [super init])) { ... AVSession *session = [[AVSession alloc] init]; session.sessionDelegate = self; session.signatureDelegate = self; _session = session; ... [self commonInit]; } return self; }
這裏是在整個運行週期只會運行一次的代碼,主要是構造一個 Session。post
- (void)commonInit { ... //打開 session [_session open:[AVUser currentUser].username withPeerIds:nil]; ... while ([rs next]) { //遍歷本地保存的對話記錄 ... if (type == CDChatRoomTypeSingle) { [peerIds addObject:otherid]; } else if (type == CDChatRoomTypeGroup) { ... //加入到已保存的 group 對話中 AVGroup *group = [_session getGroup:otherid]; group.delegate = self; [group join]; } ... } //加入已保存的我的對話 [_session watchPeers:peerIds]; initialized = YES; }
這裏是每次從新登陸後都會運行的代碼,主要包括打開 session,恢復對話,這裏使用用戶名做爲 peerId。code
對話就是本身與某一個對象(包括我的或羣組)的通信過程,開啓一個我的對話對象
- (void)addChatWithPeerId:(NSString *)peerId { BOOL exist = NO; ... if (!exist) { //若是對話已經存在就跳過 [_session watchPeers:@[peerId]]; ... } }
開啓一個羣組對話,這裏包括新建羣組和加入已有羣組blog
- (AVGroup *)startNewGroup { //新建羣組 AVGroup *group = [_session getGroup:nil]; group.delegate = self; [group join]; return group; } - (AVGroup *)joinGroup:(NSString *)groupId { //加入已有羣組 BOOL exist = NO; ... if (!exist) { //若是對話已經存在就跳過 AVGroup *group = [_session getGroup:groupId]; group.delegate = self; [group join]; ... } return [_session getGroup:groupId]; }
發送消息給我的
- (void)sendMessage:(NSString *)message toPeerId:(NSString *)peerId { ... [_session sendMessage:payload isTransient:NO toPeerIds:@[peerId]]; ... [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_MESSAGE_UPDATED object:nil userInfo:dict]; }
發送消息給羣組
- (void)sendMessage:(NSString *)message toGroup:(NSString *)groupId { ... [[_session getGroup:groupId] sendMessage:payload isTransient:NO]; ... [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_MESSAGE_UPDATED object:nil userInfo:dict]; }
代碼中 notification 用於通知 UI 更新
接收我的消息
- (void)onSessionMessage:(AVSession *)session message:(NSString *)message peerId:(NSString *)peerId { ... BOOL exist = NO; ... if (!exist) { //尚未與該人的對話 [self addChatWithPeerId:peerId]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SESSION_UPDATED object:session userInfo:nil]; } [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_MESSAGE_UPDATED object:session userInfo:dict]; }
接收羣組消息
- (void)session:(AVSession *)session group:(AVGroup *)group didReceiveGroupMessage:(NSString *)message fromPeerId:(NSString *)peerId { ... BOOL exist = NO; ... if (!exist) { //尚未與該羣組的對話,你可能在別的客戶端加入了此羣組,但此客戶端尚未建立對話記錄 [self joinGroup:group.groupId]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SESSION_UPDATED object:session userInfo:nil]; } [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_MESSAGE_UPDATED object:session userInfo:dict]; }
- (void)session:(AVSession *)session group:(AVGroup *)group didReceiveGroupEvent:(AVGroupEvent)event memberIds:(NSArray *)memberIds { ... if (event == AVGroupEventSelfJoined) { //接收到本身加入羣組成功的事件,新加入的羣組在此時才能獲取 groupId BOOL exist = NO; ... if (!exist) { ... [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SESSION_UPDATED object:session userInfo:nil]; } } }
代碼中 notification 用於通知 UI 更新
本文主要展示了怎麼使用 AVOSCloud SDK 實現我的和羣組聊天通信功能。