对于每一个聊天用户来说,我们将这个用户抽象成Client模型,在我们的应用中,根据用户的唯一标识userID来创建一个client。
// Tom 创建了一个 client,用自己的名字作为 clientId
self.client = [[AVIMClient alloc] initWithClientId:@"Tom"];
第二步:开启聊天
- (void)openWithCallback:(AVIMBooleanResultBlock)callback;
第三步:聊天开启成功后,根据传入对方的 clientId,创建一个新的用户对话(conversation)。
[self.client createConversationWithName:@"猫和老鼠" clientIds:@[@"Jerry"] callback:^(AVIMConversation *conversation, NSError *error)
后续的发送消息,都是通过对话(conversation)来发送。
[conversation sendMessage:[AVIMTextMessage messageWithText:@"耗子,起床!" attributes:nil] callback:^(BOOL succeeded, NSError *error) { if (succeeded) { NSLog(@"发送成功!"); } }];
第四步:结束某个账户的聊天
- (void)closeWithCallback:(AVIMBooleanResultBlock)callback;
如何接收消息
- (void)jerryReceiveMessageFromTom {
// Jerry 创建了一个 client,用自己的名字作为 clientId
self.client = [[AVIMClient alloc] initWithClientId:@"Jerry"];
// 设置 client 的 delegate,并实现 delegate 方法 self.client.delegate = self;
// Jerry 打开 client
[self.client openWithCallback:^(BOOL succeeded, NSError *error) { // ... }];}
#pragma mark - AVIMClientDelegate
// 接收消息的回调函数
- (void)conversation:(AVIMConversation *)conversation didReceiveTypedMessage:(AVIMTypedMessage *)message {
NSLog(@"%@", message.text); // 耗子,起床!
}
如何发送图片,音频文件
图片来源可以从系统提供的拍照 API 或本地媒体库中获取,也可以用有效的图像 URL。先调用 SDK 方法构造出一个AVIMImageMessage对象,然后把它当做参数交由 AVIMConversation发送出去即可。
【场景一】用系统自身提供的 API 去获取本地媒体库里的照片的数据流,然后构造出 AVIMImageMessage来发送:
// Tom 创建了一个图像消息
NSString *filePath = [self imagePath];
NSDictionary *attributes = @{ @"location": @"旧金山" }; AVIMImageMessage *message = [AVIMImageMessage messageWithText:@"发自我的 iPhone" attachedFilePath:filePath attributes:attributes];
// Tom 将图像消息发给 Jerry
[conversation sendMessage:message callback:^(BOOL succeeded, NSError *error) {
if (succeeded) {
NSLog(@"发送成功!");
} }];
场景二】从微博上复制的一个图像链接来创建图像消息:
// Tom 发了一张图片给 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(@"发送成功!");
} }];
以上两种场景对于 SDK 的区别为:
场景一:SDK 获取了完整的图像数据流,先上传文件到云端,再将文件的元数据以及 URL 等一并包装,发送出去。
场景二:SDK 并没有将图像实际上传到云端,而仅仅把 URL 包装在消息体内发送出去,这种情况下接收方是无法从消息体中获取图像的元信息数据,但是接收方可以自行通过客户端技术去分析图片的格式、大小、长宽之类的元数据。