對于每一個(gè)聊天用戶來說,我們將這個(gè)用戶抽象成Client模型,在我們的應(yīng)用中,根據(jù)用戶的唯一標(biāo)識(shí)userID來創(chuàng)建一個(gè)client。
// Tom 創(chuàng)建了一個(gè) client,用自己的名字作為 clientId
self.client = [[AVIMClient alloc] initWithClientId:@"Tom"];
第二步:開啟聊天
- (void)openWithCallback:(AVIMBooleanResultBlock)callback;
第三步:聊天開啟成功后,根據(jù)傳入對方的 clientId,創(chuàng)建一個(gè)新的用戶對話(conversation)。
[self.client createConversationWithName:@"貓和老鼠" clientIds:@[@"Jerry"] callback:^(AVIMConversation *conversation, NSError *error)
后續(xù)的發(fā)送消息,都是通過對話(conversation)來發(fā)送。
[conversation sendMessage:[AVIMTextMessage messageWithText:@"耗子,起床!" attributes:nil] callback:^(BOOL succeeded, NSError *error) { if (succeeded) { NSLog(@"發(fā)送成功!"); } }];
第四步:結(jié)束某個(gè)賬戶的聊天
- (void)closeWithCallback:(AVIMBooleanResultBlock)callback;
如何接收消息
- (void)jerryReceiveMessageFromTom {
// Jerry 創(chuàng)建了一個(gè) client,用自己的名字作為 clientId
self.client = [[AVIMClient alloc] initWithClientId:@"Jerry"];
// 設(shè)置 client 的 delegate,并實(shí)現(xiàn) delegate 方法 self.client.delegate = self;
// Jerry 打開 client
[self.client openWithCallback:^(BOOL succeeded, NSError *error) { // ... }];}
#pragma mark - AVIMClientDelegate
// 接收消息的回調(diào)函數(shù)
- (void)conversation:(AVIMConversation *)conversation didReceiveTypedMessage:(AVIMTypedMessage *)message {
NSLog(@"%@", message.text); // 耗子,起床!
}
如何發(fā)送圖片,音頻文件
圖片來源可以從系統(tǒng)提供的拍照 API 或本地媒體庫中獲取,也可以用有效的圖像 URL。先調(diào)用 SDK 方法構(gòu)造出一個(gè)AVIMImageMessage對象,然后把它當(dāng)做參數(shù)交由 AVIMConversation發(fā)送出去即可。
【場景一】用系統(tǒng)自身提供的 API 去獲取本地媒體庫里的照片的數(shù)據(jù)流,然后構(gòu)造出 AVIMImageMessage來發(fā)送:
// Tom 創(chuàng)建了一個(gè)圖像消息
NSString *filePath = [self imagePath];
NSDictionary *attributes = @{ @"location": @"舊金山" }; AVIMImageMessage *message = [AVIMImageMessage messageWithText:@"發(fā)自我的 iPhone" attachedFilePath:filePath attributes:attributes];
// Tom 將圖像消息發(fā)給 Jerry
[conversation sendMessage:message callback:^(BOOL succeeded, NSError *error) {
if (succeeded) {
NSLog(@"發(fā)送成功!");
} }];
場景二】從微博上復(fù)制的一個(gè)圖像鏈接來創(chuàng)建圖像消息:
// Tom 發(fā)了一張圖片給 Jerry
AVFile *file = [AVFile fileWithURL:[self imageURL]]; AVIMImageMessage *message = [AVIMImageMessage messageWithText:@"萌妹子一枚" file:file attributes:nil]; [conversation sendMessage:message callback:^(BOOL succeeded, NSError *error) {
if (succeeded) {
NSLog(@"發(fā)送成功!");
} }];
以上兩種場景對于 SDK 的區(qū)別為:
場景一:SDK 獲取了完整的圖像數(shù)據(jù)流,先上傳文件到云端,再將文件的元數(shù)據(jù)以及 URL 等一并包裝,發(fā)送出去。
場景二:SDK 并沒有將圖像實(shí)際上傳到云端,而僅僅把 URL 包裝在消息體內(nèi)發(fā)送出去,這種情況下接收方是無法從消息體中獲取圖像的元信息數(shù)據(jù),但是接收方可以自行通過客戶端技術(shù)去分析圖片的格式、大小、長寬之類的元數(shù)據(jù)。