差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 后一修订版 两侧同时换到之后的修订记录 | ||
cs:300visitoraccess:iossdkapi [2019/05/20 04:14] liulj [发送扩展消息] |
cs:300visitoraccess:iossdkapi [2020/05/07 04:05] dujiepeng [获取一个留言的所有评论] |
||
---|---|---|---|
行 111: | 行 111: | ||
visitor.phone = @"13636362637"; | visitor.phone = @"13636362637"; | ||
visitor.companyName = @"环信"; | visitor.companyName = @"环信"; | ||
- | visitor.nickName = @"风口上的猪"; | + | visitor.nickName = @"风口上的猪";//必填 |
visitor.email = @"abv@126.com"; | visitor.email = @"abv@126.com"; | ||
visitor.desc = @"环信客服云"; | visitor.desc = @"环信客服云"; | ||
行 297: | 行 297: | ||
**详见**:SatisfactionViewController.m类 | **详见**:SatisfactionViewController.m类 | ||
+ | ==== 主动发起满意度评价邀请 ==== | ||
+ | <code> | ||
+ | // conversation 是HDConversationManager类型对象 | ||
+ | [conversation sendSatisfactionEvaluationCompletion:^(BOOL send, HDError *error) {}]; | ||
+ | </code> | ||
===== 留言 ===== | ===== 留言 ===== | ||
行 303: | 行 308: | ||
<code> | <code> | ||
- | /* | + | /** |
- | @param tenantId 租户Id | + | @brief 获取留言列表 |
- | @param cname IM 服务号 | + | @discussion 失败返回NSError,成功返回responseObject |
- | @param projectId 留言的Project ID | + | |
- | @param page 第几页,从0开始,默认为第0页 | + | @param projectId 留言ProjectId 进入“管理员模式 → 留言”,可以看到这个Project ID |
- | @param pageSize 每一页的大小,默认为10,最大不能超过100 | + | @param targetUser IM 服务号 |
- | */ | + | @param page 第几页从0开始 |
- | [[[HDClient sharedClient] leaveMsgManager] getLeaveMsgsWithProjectId:<#projectId#> cname:<#NSString *#> page:<#page#> pageSize:<#pageSize#> completion:^(id responseObject, NSError *error) { | + | @param pageSize 每页显示个数 |
- | if(!error) { //请求成功 | + | @param completion 返回结果 |
- | } else { //请求失败 | + | */ |
- | } | + | - (void)getLeaveMsgsWithProjectId:(NSString *)projectId |
- | }]; | + | targetUser:(NSString *)imCustomerService |
+ | page:(NSInteger)page | ||
+ | pageSize:(NSInteger)pageSize | ||
+ | completion:(void(^)(id responseObject,NSError *error))completion; | ||
</code> | </code> | ||
行 320: | 行 328: | ||
<code> | <code> | ||
- | //留言包括:创建者信息、附件[数组]以及其他属性 | + | /** |
- | Creator *creator = [Creator new]; | + | @brief 给一个留言添加评论 |
- | creator.name = <#创建者名称#>; | + | @discussion 失败返回NSError,成功返回responseObject |
- | creator.avatar = <#头像地址#>; | + | @param targetUser im服务号 |
- | creator.email = <#邮箱#>; | + | @param projectId 留言ProjectId 进入“管理员模式 → 留言”,可以看到这个Project ID |
- | creator.phone = <#电话号码#>; | + | @param ticketId 留言ID |
- | creator.qq = <#qq号码#>; | + | @param requestBody 请求体 |
- | creator.companyName = <#公司#>; | + | @param completion 返回结果block |
- | creator.desc = <#备注#>; | + | */ |
- | //附件(附件可以没有,也可以是多个) | + | - (void)createLeaveMsgCommentWithProjectId:(NSString*)projectId |
- | LeaveMsgAttachment *attachment = [LeaveMsgAttachment new]; | + | targetUser:(NSString *)imCustomerService |
- | attachment.name = <#文件名#>; | + | ticketId:(NSString *)ticketId |
- | attachment.type = <#类型 AttachmentType#>; | + | requestBody:(LeaveMsgRequestBody*)requestBody |
- | attachment.url = <#url#>; | + | completion:(void(^)(id responseObject,NSError *error))completion; |
- | LeaveMsgRequestBody *body = [[LeaveMsgRequestBody alloc] init]; | + | |
- | body.subject = <#主题#>; | + | |
- | body.content = <#内容#>; | + | |
- | body.status = <#默认处理状态#>; | + | |
- | body.creator = creator; | + | |
- | NSArray *attachments = @[attachment]; | + | |
- | body.attachments = attachments; | + | |
- | /* | + | |
- | @param tenantId 租户Id | + | |
- | @param projectId 留言的Project ID | + | |
- | @param cname IM服务号 | + | |
- | @param requestBody 留言参数 | + | |
- | */ | + | |
- | [[[HDClient sharedClient] leaveMsgManager] createLeaveMsgWithProjectId:<#NSString *#> cname:<#NSString *#> requestBody:<#LeaveMsgRequestBody *#> completion:^(id responseObject, NSError *error) { | + | |
- | if(error == nil){ //发送留言成功 | + | |
- | } else {//发送留言失败 | + | |
- | } | + | |
- | }]; | + | |
</code> | </code> | ||
行 357: | 行 347: | ||
<code> | <code> | ||
- | /* | + | /** |
- | @param tenantId 租户Id | + | @brief 获取留言详情 |
- | @param projectId 留言的Project ID | + | @discussion 失败返回NSError,成功返回responseObject |
- | @param cname IM服务号 | + | |
- | @param tickedId 留言Id | + | @param projectId 留言的Project ID |
- | */ | + | @param targetUser im服务号 |
- | [[[HDClient sharedClient] leaveMsgManager] getLeaveMsgDetailWithProjectId:projectId:<#NSString *#> cname:<#NSString *#> ticketId:<#NSString *#> completion:^(id responseObject, NSError *error) { | + | @param ticketId 留言ID |
- | if(error == nil){ //获取成功 | + | @param completion 返回结果 通过error判断成败 |
- | } else {//获取失败 | + | */ |
- | } | + | - (void)getLeaveMsgDetailWithProjectId:(NSString *)projectId |
- | }]; | + | targetUser:(NSString *)imCustomerService |
+ | ticketId:(NSString*)ticketId | ||
+ | completion:(void(^)(id responseObject,NSError *error))completion; | ||
</code> | </code> | ||
行 373: | 行 365: | ||
<code> | <code> | ||
- | /* | + | /** |
- | @param tenantId 租户Id | + | @brief 获取留言下所有评论 |
- | @param projectId 留言的Project ID | + | @discussion 失败返回NSError,成功返回responseObject |
- | @param cname IM服务号 | + | @param targetUser im服务号 |
- | @param tickedId 留言Id | + | @param projectId 留言ProjectId 进入“管理员模式 → 留言”,可以看到这个Project ID |
- | @param page 第几页,从0开始,默认为第0页 | + | @param ticketId 留言ID |
- | @param pageSize 每页数据数目,每一页的大小,默认为10,最大不能超过100 | + | @param page 第一页从0开始 |
- | */ | + | @param pageSize 每页显示的个数 |
- | [[[HDClient sharedClient] leaveMsgManager] getLeaveMsgCommentsWithProjectId:<#(NSString *)#> cname:<#NSString *#> ticketId:<#(NSString *)#> page:<#(NSUInteger)#> pageSize:<#(NSUInteger)#> completion:^(id responseObject, NSError *error) { | + | @param completion 返回结果 通过error判断成败 |
- | if(error == nil){ //获取成功 | + | */ |
- | } else {//获取失败 | + | |
- | } | + | - (void)getLeaveMsgCommentsWithProjectId:(NSString*)projectId |
- | }]; | + | targetUser:(NSString *)imCustomerService |
+ | ticketId:(NSString *)ticketId | ||
+ | page:(NSUInteger)page | ||
+ | pageSize:(NSUInteger)pageSize | ||
+ | completion:(void(^)(id responseObject,NSError *error))completion; | ||
</code> | </code> | ||
行 391: | 行 387: | ||
<code> | <code> | ||
- | //回复包括:创建者信息、附件[数组]以及其他属性 | + | /** |
- | Creator *creator = [Creator new]; | + | @brief 给一个留言添加评论 |
- | creator.identity = <#可选,创建这个评论人的id#>; | + | @discussion 失败返回NSError,成功返回responseObject |
- | creator.name = <#创建者名称#>; | + | @param targetUser im服务号 |
- | creator.avatar = <#头像地址#>; | + | @param projectId 留言的Project ID |
- | creator.email = <#邮箱#>; | + | @param ticketId 留言ID |
- | creator.phone = <#电话号码#>; | + | @param requestBody 请求体 |
- | creator.qq = <#qq号码#>; | + | @param completion 返回结果block |
- | creator.companyName = <#公司#>; | + | */ |
- | //附件(附件可以没有,也可以是多个) | + | - (void)createLeaveMsgCommentWithProjectId:(NSString*)projectId |
- | LeaveMsgAttachment *attachment = [LeaveMsgAttachment new]; | + | targetUser:(NSString *)imCustomerService |
- | attachment.name = <#文件名#>; | + | ticketId:(NSString *)ticketId |
- | attachment.type = <#类型 AttachmentType#>; | + | requestBody:(LeaveMsgRequestBody*)requestBody |
- | attachment.url = <#url#>; | + | completion:(void(^)(id responseObject,NSError *error))completion; |
- | LeaveMsgRequestBody *body = [[LeaveMsgRequestBody alloc] init]; | + | |
- | body.subject = <#主题#>; | + | |
- | body.content = <#内容#>; | + | |
- | body.replyId = <#回复评论的Id#> | + | |
- | body.status = <#默认处理状态#>; | + | |
- | body.creator = creator; | + | |
- | NSArray *attachments = @[attachment]; | + | |
- | body.attachments = attachments; | + | |
- | + | ||
- | /* | + | |
- | @param tenantId 租户Id | + | |
- | @param projectId 留言的Project ID | + | |
- | @param cname IM服务号 | + | |
- | @param tickedId 留言Id | + | |
- | @param requestBody 请求体 | + | |
- | */ | + | |
- | [[[HDClient sharedClient] leaveMsgManager] createLeaveMsgCommentWithProjectId:<#projectId#> cname:<#NSString *#> ticketId:<#留言id#> requestBody:<#LeaveMsgRequestBody*#> completion:^(id responseObject, NSError *error) { | + | |
- | if(error == nil){ //回复成功 | + | |
- | } else {//回复失败 | + | |
- | } | + | |
- | }]; | + | |
</code> | </code> | ||
行 431: | 行 406: | ||
<code> | <code> | ||
- | @param toUser IM服务号 | + | /** |
- | [[[HDClient sharedClient] leaveMsgManager] getWorkStatusWithToUser:<#(NSString *)#> completion:^(BOOL isWork, NSError *error) { | + | @brief 获取客服工作状态 |
- | if (error == nil) { //成功 | + | |
- | if (isWork) { //工作状态 | + | @param imServiceNumber im服务号 |
- | } else { //下班 | + | @param completion 返回结果 true or false |
- | } | + | */ |
- | } else { //请求失败 | + | - (void)getWorkStatusWithToUser:(NSString *)imServiceNumber completion:(void (^)(BOOL,NSError *))completion; |
- | } | + | |
- | }]; | + | |
</code> | </code> | ||
===== 实时音视频 ===== | ===== 实时音视频 ===== | ||
- | ==== 实时通话相关 ==== | + | ==== 基本设置 ==== |
<code> | <code> | ||
行 454: | 行 427: | ||
options.previewView = <#(HCallLocalView*)#>; //本地预览View | options.previewView = <#(HCallLocalView*)#>; //本地预览View | ||
[[HDClient sharedClient].callManager setCallOptions:options]; | [[HDClient sharedClient].callManager setCallOptions:options]; | ||
- | //注册实时通话回调 | + | </code> |
+ | |||
+ | ==== 监听呼入通话 ==== | ||
+ | |||
+ | <code> | ||
+ | //注册实时通话回调 | ||
[[HDClient sharedClient].callManager addDelegate:<#(id<HDCallManagerDelegate>)#> delegateQueue:nil]; //queue默认为main | [[HDClient sharedClient].callManager addDelegate:<#(id<HDCallManagerDelegate>)#> delegateQueue:nil]; //queue默认为main | ||
//移除实时通话回调 | //移除实时通话回调 | ||
行 474: | 行 452: | ||
- (void)onNotice:(HMediaNoticeCode)code arg1:(NSString *)arg1 arg2:(NSString *)arg2 arg3:(id)arg3; | - (void)onNotice:(HMediaNoticeCode)code arg1:(NSString *)arg1 arg2:(NSString *)arg2 arg3:(id)arg3; | ||
- | //接受视频请求 | + | </code> |
+ | |||
+ | ==== 接听通话 ==== | ||
+ | <code> | ||
[[HDClient sharedClient].callManager acceptCallCompletion:^(id obj, HDError *error) { | [[HDClient sharedClient].callManager acceptCallCompletion:^(id obj, HDError *error) { | ||
if (error == nil) { //接受成功 | if (error == nil) { //接受成功 | ||
} | } | ||
}]; | }]; | ||
- | //拒绝视频请求 | + | </code> |
+ | |||
+ | ==== 拒绝接听 ==== | ||
+ | <code> | ||
[[HDClient sharedClient].callManager endCall]; | [[HDClient sharedClient].callManager endCall]; | ||
- | //挂断视频请求 | + | </code> |
+ | |||
+ | ==== 挂断通话 ==== | ||
+ | <code> | ||
[[HDClient sharedClient].callManager endCall]; | [[HDClient sharedClient].callManager endCall]; | ||
- | //切换镜头 | + | </code> |
- | [[HDClient sharedClient].callManager switchCameraPosition:YES]; //默认前置摄像头(YES) | + | |
+ | |||
+ | ==== 暂停和恢复语音或视频数据传输 ==== | ||
+ | |||
+ | <code> | ||
//关闭麦克风 | //关闭麦克风 | ||
[[HDClient sharedClient].callManager pauseVoice]; | [[HDClient sharedClient].callManager pauseVoice]; | ||
行 494: | 行 485: | ||
[[HDClient sharedClient].callManager resumeVideo]; | [[HDClient sharedClient].callManager resumeVideo]; | ||
- | //订阅成员视频 | + | </code> |
+ | |||
+ | ==== 切换摄像头 ==== | ||
+ | <code> | ||
+ | //切换镜头 | ||
+ | [[HDClient sharedClient].callManager switchCameraPosition:YES]; //默认前置摄像头(YES) | ||
+ | </code> | ||
+ | |||
+ | ==== 视频通话订阅对方的流和显示图像 ==== | ||
+ | |||
+ | <code> | ||
+ | // topView 用于显示的view | ||
[[HDClient sharedClient].callManager subscribeStreamId:streamId view:topView completion:^(id obj, HDError *error) { | [[HDClient sharedClient].callManager subscribeStreamId:streamId view:topView completion:^(id obj, HDError *error) { | ||
if (error == nil) { | if (error == nil) { | ||
行 500: | 行 502: | ||
} | } | ||
}]; | }]; | ||
- | //取消订阅 | + | </code> |
+ | |||
+ | ==== 取消订阅 ==== | ||
+ | <code> | ||
[[HDClient sharedClient].callManager unSubscribeStreamId:streamId completion:^(id obj, HDError *error) { | [[HDClient sharedClient].callManager unSubscribeStreamId:streamId completion:^(id obj, HDError *error) { | ||
if (error == nil) { | if (error == nil) { | ||
} else { | } else { | ||
} | } | ||
+ | }]; | ||
+ | </code> | ||
+ | |||
+ | ==== 取消视频邀请 ==== | ||
+ | <code> | ||
+ | [[HDClient sharedClient].callManager asyncCancelVideoInviteWithImId:<#im服务号#> completion:^(HDError *error) { | ||
+ | | ||
+ | }]; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== 共享桌面 ==== | ||
+ | <code objc> | ||
+ | // view 为需要共享的view | ||
+ | [[HDClient sharedClient].callManager publishWindow:view completion:^(id obj, HDError * error) {}]; | ||
+ | </code> | ||
+ | |||
+ | ⚠️注:因为ios系统比较特殊,系统级别的共享方案在ios10推出,ios11才完善,您也可以公告自定义数据流的方式通过系统api获取桌面流,然后传入sdk中,具体参考如下: | ||
+ | <code> | ||
+ | [[HDClient sharedClient].callManager publishWindow:nil completion:^(id obj, HDError * error) { | ||
+ | [[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) | ||
+ | { | ||
+ | if (CMSampleBufferDataIsReady(sampleBuffer) && bufferType == RPSampleBufferTypeVideo) | ||
+ | { | ||
+ | [[HDClient sharedClient].callManager inputCustomVideoSampleBuffer:sampleBuffer rotation:UIDeviceOrientationPortrait publishId:obj completion:^(HDError *error) {}]; | ||
+ | } | ||
+ | } | ||
+ | completionHandler:nil]; | ||
}]; | }]; | ||
</code> | </code> | ||
行 512: | 行 545: | ||
==== 显示排队人数 ==== | ==== 显示排队人数 ==== | ||
- | 首先,初始化时,需要调用''option.visitorWaitCount = YES;''打开待接入访客排队人数功能。 然后实现HDChatManagerDelegate中的''visitorWaitCount''方法。 | + | 首先,初始化时,需要调用''option.visitorWaitCount = YES;''打开待接入访客排队人数功能。 完成以下设置,之后实现HDChatManagerDelegate中的''visitorWaitCount''方法。 |
- | + | 1、在sdk初始化时开始设置: | |
+ | <code> | ||
+ | HDOptions *option = [[HDOptions alloc] init]; | ||
+ | ... | ||
+ | option.visitorWaitCount = YES; | ||
+ | HDError *initError = [[HDClient sharedClient] initializeSDKWithOptions:option]; | ||
+ | </code> | ||
+ | 2、调用方法: | ||
+ | <code> | ||
+ | [[HDClient sharedClient].chatManager bindChatWithConversationId:<#会话id#>]; | ||
+ | </code> | ||
+ | |||
+ | 3、当调用以上方法后,排队人数会开启查询模式,每隔3秒左右会回调HDChatManagerDelegate#visitorWaitCount:方法上报排队人数。 | ||
<code> | <code> | ||
-(void)visitorWaitCount:(int)count; | -(void)visitorWaitCount:(int)count; |