10 分鐘爲你的 App 加入實時通信功能

via:AVOS Cloud Bloggit

不少開發者想在本身的 App 中添加實時通信的功能,但一般由於沒有合適的後端支持,最終沒能實現。而 AVOSCloud 與時俱進,給你們帶來了但願。下面就來介紹使用 AVOSCloud 給本身的 App 添加實時通信功能。github

AVOSCloud SDK 從 2.5.9 開始提供了實時通信模塊。本文主要基於 iOS SDK 2.6.2.1 實現,假設你已經具備必定的 iOS 開發基礎,省略掉非實時通信相關的代碼,github 完整代碼點此 。後端

概念

  • peerId 惟一表示一個用戶的標識,能夠是用戶名、用戶 ID 或設備 ID 等等跟用戶關聯的東西
  • Session 表示一個會話,處理底層網絡鏈接,收發消息
  • Message 消息,能夠本身定義格式,如文本或 JSON 等,從而達到實現不一樣類型消息的目的
  • Signature 簽名,用於驗證消息合法性
  • Group 羣組,一個用戶集合的抽象,給一個羣組發送消息,羣組裏面全部的人都將收到此消息

實現

此部分只列出了通信相關的代碼,省略了一些本地對話和消息保存的代碼。完整代碼能夠查看 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 實現我的和羣組聊天通信功能。

相關文章
相關標籤/搜索