好友功能在1.9.1版本中被添加,接口在IYWContactService协议中,您可以通过[self.imkit.IMCore getContactService]来获得具体对象。
同步好友列表
SDK内部默认会在每次登陆成功后与服务端同步好友列表,开发者可以通过设置disableAutoRequestAllContacts
来禁用这个特性,也可以通过
- (void)requestAllContactsFromServerWithResultBlock:(YWContactsOperationResultBlock)resultBlock;
来主动发起同步请求。
获取本地好友
开发者可以通过
/// 获取不同排序和分组模式的FRC对象 - (YWFetchedResultsController *)fetchedResultsControllerWithListMode:(YWContactListMode)aMode imCore:(YWIMCore *)imCore; /// 使用关键字搜索用户,使用用户名 // 如果希望搜索好友,needIsFriend置为YES,否则可以置为NO - (YWFetchedResultsController *)fetchedResultsControllerWithSearchKeyword:(NSString *)aKeyword needIsFriend:(BOOL)needIsFriend imCore:(YWIMCore *)imCore;
来获取本地好友。
好友添加
可以通过以下方式来发起添加好友请求:
[[self.imkit.IMCore getContactService] addContact:person withIntroduction:@"" withResultBlock:^(NSError *error, YWAddContactRequestResult result) { NSString *title = nil; if(result == YWAddContactRequestResultError) { title = @"请求发送失败"; } else if (result == YWAddContactRequestResultSuccess) { title = @"好友添加成功"; } else { title = @"请求发送成功,等待对方验证"; } [YWIndicator showTopToastTitle:title content:[NSString stringWithFormat:@"添加%@", person.personId] userInfo:nil withTimeToDisplay:1.5 andClickBlock:nil]; }];
被添加方可以使用:
- (void)addAddContactRequestBlockV2:(void (^)(YWPerson *person, YWContactAddRequestType type, BOOL isOffline, NSString *message))block forKey:(NSString *)key ofPriority:(YWBlockPriority)priority;
来监听被添加的请求,也可以通过
- (YWConversation *)fetchContactSystemConversation;
来获取好友请求列表。
对于被添加的请求,可以使用:
- (void)responseToAddContact:(BOOL)accept fromPerson:(YWPerson *)person withMessage:(NSString*)message andResultBlock:(YWAddContactResultBlock)resultBlock;
这个接口接受或者拒绝。
当被添加方处理后,添加发起方可以通过:
- (void)addAddContactResponseBlockV2:(void (^)(YWPerson *person, YWContactAddResponseType type, BOOL isOffline, NSString *message))block forKey:(NSString *)key ofPriority:(YWBlockPriority)priority;
来获得对方处理的结果。
注:以上add开头添加的block均需要在不使用的时候调用对应的remove方法。
删除好友
开发者可以通过
- (void)removeContact:(YWPerson *)persons withResultBlock:(YWRemoveContactResultBlock)resultBlock;
来删除好友,通过
- (void)addFriendBeRemovedBlock:(void (^)(YWPerson *person, BOOL isOffline))block forKey:(NSString *)key ofPriority:(YWBlockPriority)priority;
来接收被删除的回调。
修改好友的备注名
开发者可以通过
- (void)modifyContact:(YWPerson *)person WithNewNick:(NSString *)nickName andResultBlock:(YWContactOperationResultBlock)resultBlock;
来修改好友的备注名,通过
- (NSString *)contactNickOfPerson:(YWPerson *)aPerson;
来获取好友的备注名。
查询person是否为好友
- (BOOL)ifPersonIsFriend:(YWPerson *)person;
IYWContactService.h
,开发者可以从YWIMCore对象中获取该Service__weak typeof(self) weakSelf = self; [[self.imkit.IMCore getContactService] fetchBlackListWithCompletionBlock:^(NSError *error, NSArray *blackList) { if (error == nil || error.code == 0) { weakSelf.blackList = [blackList mutableCopy]; [weakSelf.tableView reloadData]; } }];
/// 判断某个person是否在黑名单中 - (BOOL)isPersonInBlackList:(YWPerson *)person;
YWPerson *person = [[YWPerson alloc] initWithPersonId:personId appKey:[YWAPI sharedInstance].appKey]; [[weakSelf.imkit.IMCore getContactService] addPersonToBlackList:person withResultBlock:^(NSError *error, YWPerson *person) { if (error == nil || error.code == 0) { [weakSelf updateBlackList]; } }];
__weak typeof(self) weakSelf = self; [[_imkit.IMCore getContactService] removePersonFromBlackList:person withResultBlock:^(NSError *error, YWPerson *person) { BOOL isSuccess = (error == nil || error.code == 0); // 提示结果 if(isSuccess) { [weakSelf updateBlackList]; } }];
在线状态相关接口位于IYWContactService.h
默认不启用在线状态功能,即IM将所有的用户都显示为在线。
如果开发者需要启用在线状态,请使用如下接口:
/// 是否启用在线状态功能 /// 默认为NO,即所有用户均显示为在线 @property (nonatomic, assign) BOOL enableContactOnlineStatus;
开发者可以通过如下接口异步更新在线状态:
/// 获取缓存中的在线状态,如果有缓存过期,则会发起网络请求,请求返回后回调block,且只回调一次 // @param persons 需要获取在线状态的person数组 // @param expire 过期时间,距离上次更新时间超过此参数的缓存将被认为是过期,从而触发网络请求 // @param block 回调 - (void)updateOnlineStatusForPersons:(NSArray *)persons withExpire:(NSTimeInterval)expire andOnlineStatusUpdateBlock:(YWOnlineStatusDidUpdateBlock)block;
当开发者异步更新在线状态后,开发者可以通过如下接口获取本地保存的在线状态:
/// 获取缓存中的在线状态,不会发起网络请求, - (NSDictionary *)getOnlineStatusForPersons:(NSArray *)persons;
注意:目前移动端IMSDK不支持实时从服务器同步在线状态,这里的监听在线状态变更是指监听本地在线状态变更,以保持本地显示的一致性。
/// 添加对某个person在线状态改变的监听 - (void)addPersonOnlineStatusChanged:(NSArray *)persons withBlock:(YWOnlineStatusChangeBlock)block forKey:(NSString *)aKey ofPriority:(YWBlockPriority)aPriority; /// 移除对某个person在线状态改变的监听 - (void)removePersonOnlineStatusChanged:(YWPerson *)person forKey:(NSString *)aKey; /// 移除某个key对应的所有block - (void)removePersonOnlineStatusChangedBlockForKey:(NSString *)aKey;
如果开发者集成的是YWIMKit
层,那么聊天页面标题栏默认开启输入状态显示,开发者可以通过IYWConversationService
中的
- (void)setDisableInputStatus:(BOOL)disableInputStatus;
来关闭这一功能,注意,当YWConversationViewController
的disableTitleAutoConfig
为YES时,不会自动显示输入状态。
在该功能未被关闭的情况下,聊天界面会自动发送输入状态,如果需要开发者可以通过YWIMCore
层中的IYWConversationService
中
/** * 发送输入状态,该状态只起到通知的作用,不做存储 * @param inputStatu 输入状态 * 注意,当 disableContactInputStatus 为 YES 时无效 */ - (void)sendUserInputStatus:(YWConversationInputStatus)inputStatus forConversation:(YWConversation *)conversation;
来发送输入状态。
开发者可以通过IYWConversationService
中的
/// 设置收到输入状态变化的回调 - (void)addConversationInputStatusChangeBlock:(YWConversationInputStatusChangeBlock)inputStatusChangeBlock forPerson:(YWPerson *)person ofPriority:(YWBlockPriority)aPriority;
来监听输入状态的变化,下面是一个简单的示例:
__weak typeof(self) weakSelf = self; YWPerson *personRequest = ((YWP2PConversation *)self.conversation).person; [[self.coreRef getConversationService] addConversationInputStatusChangeBlock:^(YWPerson *person, YWConversationInputStatus status) { if ([person isEqual:personRequest]) { weakSelf.inputStatus = status; [weakSelf configTitleItems:status onlineStatus:weakSelf.onlineStatus]; } } forPerson:personRequest ofPriority:YWBlockPriorityDeveloper];
云旺的单聊消息支持显示对方已读未读状态,但此功能默认关闭,开发者可以通过IYWConversationService
中的
- (void)setEnableMessageReadFlag:(BOOL)enableMessageReadFlag;
方法启用该功能,在未启用的情况下,当用户阅读消息时仍将发送已读消息,但不会显示,这样为了方便开发者进行兼容。
当开发者需要将消息置为已读时,开发者可以通过YWIMCore
层中YWP2PConversation
中的
/** * @virtual * 标识某消息为已读 */ - (void)markMessageAsReadWithMessageIds:(NSArray *)messageIds
来实现。
开发者可以通过YWIMCore
层中id<IYWMessage>
对象的receiverHasReaded
还获取本地已读未读状态,开发者也可以通过YWIMCore
层中YWP2PConversation
中的
/** * 获取消息接收者的已读未读标记 * @param messageIds,需要获取的 id<IYWMessage> 数组 * @param completion,回调 * 注意,启用已读未读功能需要将 IYWConversationService 中 enableMessageReadFlag 置为 YES */ - (void)roamingReceiverReadFlagForMessages:(NSArray *)messages withCompletionBlock:(YWCompletionBlock)completion;
从服务端更新已读未读状态,如果状态发生变化将通过YWConversation
的objectDidChangeBlock
回调。
开发者可以通过YWIMCore
层中YWConversation
对象的
/** * 清空该会话已有的本地消息,被清空的消息不会再被漫游下来。 * @note 还没有被漫游下来的云端消息,仍然会被漫游下来 * @note 云端消息不会受影响,即如果在其他设备登录,这些消息仍会漫游 */ - (void)removeAllLocalMessages;
来删除该会话的聊天记录
为了更快的加载资源以及节省网络流量,SDK内部会缓存一些资源,尤其是一些多媒体文件,在某些情况下,可能需要清除这些缓存。开发者可以通过
[[[YWAPI sharedInstance] getGlobalUtilService4Cache] removeAllDatas];
来清除缓存,并通过
long long size = [[[YWAPI sharedInstance] getGlobalUtilService4Cache] cacheSize];
来获取缓存所占的空间。由于存在一些索引文件,缓存所占的大小不会严格为零,如果需要显示给用户,可以参考这样的逻辑:
NSString *sizeStr = nil; if (size > 1024 * 1024 * 1024) { sizeStr = [NSString stringWithFormat:@"%.1fG", (1.f * size)/(1024 * 1024 * 1024)]; } else if (size > 1024 * 1024) { sizeStr = [NSString stringWithFormat:@"%.1fM", (1.f * size)/(1024 * 1024)]; } else if (size > 1024) { sizeStr = [NSString stringWithFormat:@"%.1fK", (1.f * size)/1024]; } else { sizeStr = @"0K"; }
相关逻辑可以参考官方Demo中的SPSettingController
。
开发者可以通过
/** * 获取最近联系的客服 */ - (YWPerson *)getLastEHelper:(YWPerson *)eHelper;
来获取最近联系的客服,这个接口会返回本地接收到最新一条消息的客服发送者。
当接入Core层时需要关注这一小节,如果接入的是Kit层,SDK内部已经做了完整的逻辑。
开发者可以通过YWConversation
的属性来访问和设置草稿:
/** * 会话未发送的草稿 */ @property (nonatomic, copy) NSString *conversationDraft; /** * 会话未发送的草稿更新时间 */ @property (nonatomic, readonly) NSDate *conversationDraftUpdateTime;
只需要三步即可集成短视频功能:
OpenIM提供了在聊天中发送短视频的功能。短视频存储要使用百川多媒体(顽兔)服务,开通流程及收费策略
请点击百川云旺官网,侧边栏依次选择基础技术开放管理->即时通讯服务->视频功能设置,如下图所示。
如果开发者使用Kit层接入,还需要需要链接YWExtensionForShortVideoFMWK.framework
、TBAVSDK.framework
、VSVideoCore.framework
、ALBBMediaService.framework
和系统的GLKit.framework
用于短视频录制和上传,前面四个SDK可以在官方Demo中找到,注意将YWExtensionForShortVideoFMWK.framework
中的YWShortVideo.bundle单独添加到工程中。
如果开发者使用Kit层接入,SDK默认支持短视频播放,可以在聊天界面添加聊天插件方式支持发送,
#define SPExtensionServiceFromProtocol(service) \ (id<service>)[[[YWAPI sharedInstance] getGlobalExtensionService] getExtensionByServiceName:NSStringFromProtocol(@protocol(service))] if ([conversationController.messageInputView isKindOfClass:[YWMessageInputView class]]) { __weak typeof(conversationController) weakController = conversationController; YWInputViewPlugin *shortVideoPlugin = [SPExtensionServiceFromProtocol(IYWExtensionForShortVideoService) getShortVideoPluginWithPickerOverBlock:^(id<YWInputViewPluginProtocol> plugin, NSURL *fileUrl, UIImage *frontImage, NSUInteger width, NSUInteger height, NSUInteger duration) { [weakController sendVideoMessage:fileUrl videoSize:0 frontImage:frontImage width:width height:height duration:duration]; }]; [(YWMessageInputView *)conversationController.messageInputView addPlugin:shortVideoPlugin]; }
具体可以参考官方Demo SPKitExample
中的逻辑。
如果开发者使用Core层接入,开发者负责短视频录制和展示,只需要链接ALBBMediaService.framework
用于短视频上传。开发者可以通过YWMessageBodyShortVideo
发送短视频,使用方式可以参考发送图片消息。
较早版本的iOS SDK收到短视频消息会在聊天界面提示升级,会话列表界面最新消息显示内容为一段json。
短视频最长时间以及UI颜色,暂时不支持自定义。