本文档分两个版本
1.客服SDK集成文档(iOS-QMLineSDK)
概述
容联·七陌 云客服平台访客端iOS SDK,可由对接企业移动端开发人员通过集成开发实现App内访客端的接入。
我们提供了较为完善的Demo以及Demo ui代码。对接之前,对接企业的负责人或已开通坐席平台的管理员可以下载Demo提供给研发进行运行体验,提前了解SDK能力便于更快速的进行SDK集成和开发工作。
Demo ui提供了一套基础的会话样式示例,如不满足您的样式需求需要您对Demo ui样式进行自定义修改,请详细阅读并了解Demo代码后进行自定义ui。
1、SDK工作流程
2、准备工作
2.1 文件说明
文件 | 说明 |
---|---|
IMSDK-OC | 使用Objective-C编写UI界面的demo, 快速集成可使用此demo |
QMLineSDK | 在线客服核心库、可以通过pod动态引用, pod之前请先咨询对接人员 |
2.2 开发环境
Xcode版本 -> 12.0 (12A7209) QMLineSDK版本 -> 4.0.0 FMDB版本 -> 2.7.5 Qiniu版本 -> 8.4.0 SocketRocket -> 0.5.1
3、快速集成
注: 集成和发布过程有问题,请看文档最后的常见问题
3.1 导入SDK
把IMSDK-OC中的Framework(QMLineSDK.framework)拷贝到工程路径下, 右键工程目录, 选择Add Files to "工程名"
3.2 集成Demo
QMChatVC: 聊天界面及部分工具类 Tools: 工具类 Resources: 表情资源文件 Assets: 其他图片资源 Vendors: 第三方库(TZImagePickerController、EmojiLabel、Voice、需手动导入) PrefixHeader: 头文件 注: FMDB、QiniuSDK、SocketRocket等第三方库可以自行pod或者导入demo提供的(注: SocketRocket的导入是在3.5.0支持,之前的版本不支持,如果工程中有使用的冲突,请更新至3.5.0及以上版本)
3.3 配置xcode(重要)
- General配置
Embedded Binaries,展开 Embedded Binaries 后 点击展开后下面的 + 来添加framework
- Build Settings配置 (不支持bitcode)
Build Options -> Enable Bitcode 选择No
- Info.plist配置 (允许http、获取权限)
3.4 注册SDK
- 初始化SDK
初始化sdk前需要先配置服务环境,可以与技术支持确认应该使用那种环境 [QMConnect switchServiceRoute:QMServiceLineTencent];//腾讯云 [QMConnect switchServiceRoute:QMServiceLineAliy];//阿里云
AppKey: 在后台SDK下载界面的下方, 是接入在线客服的唯一凭证 userName: 可以区分不同用户的用户名称, 可以显示在后台客服界面 userId: 可以区分不同用户接入在线客服, 不同用户用户ID一定不同 注: userId用户的唯一标识 只能使用字母、数字及下划线、否则会初始化失败, AppKey、userName、userId都是必填项 userId是用户的唯一标识,所以不同的访客的userId应该是不能重复的(userId重复的话会出现问题)
[QMConnect registerSDKWithAppKey:@"注册App的AppKey" userName:@"用户名" userId:@"1234"];
注:进行任何操作必须是注册AppKey成功的状态
- AppKey获取方法
- 监听注册状态
监听SDK初始化的状态需要注册广播:
CUSTOM_LOGIN_SUCCEED: 注册成功的时候广播的名字, SDK其他的接口操作都基于注册成功的状态才能进行, 如获取部门、或技能组的接口
CUSTOM_LOGIN_ERROR_USER: 注册失败时候广播的名字, 具体失败的原因提示:
1、accessId is Empty: appKey不可以为空值
2、userName is Empty: userName不可以为空值
3、userId is not match: userId不可以为空值
4、Create Socket Error: 建立连接失败
5、Connect Socket Error: 连接服务器失败
6、5: 服务器状态异常
7、400: appKey错误或不存在
8、服务端返回其他类型错误
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess:) name:CUSTOM_LOGIN_SUCCEED object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginFaile:) name:CUSTOM_LOGIN_ERROR_USER object:nil];
4、API接口
4.1 自建服务器设置网络地址
是不是自建服务器的用户不需要设置此项,此接口应在注册之前使用
[QMConnect setServerAddress:@"IP地址" tcpPort:@"端口" httpPost:@"TCP地址"];
4.2 获取渠道全局配置
获取全局配置,主要用于区分下一步操作日程管理和技能组(如果不配置日程管理的可跳过此步骤,直接获取技能组信息)
[QMConnect sdkGetWebchatGlobleConfig:^(NSDictionary * _Nonnull scheduleDic) {
//获取渠道全局配置字典
} failBlock:^{
//获取信息失败
}];
注册成功自动获取后台配置信息并写入本地plist文件
4.3 获取配置信息(开启日程管理时用到)
[QMConnect sdkGetWebchatScheduleConfig:^(NSDictionary * _Nonnull scheduleDic) {
//获取配置信息成功
} failBlock:^{
//获取配置信息失败
}];
4.4 获取部门信息(技能组)
后台可配置多个部门/技能组(如: 售前、售后等), SDK注册成功后, 调用此接口获取后台配置好的部门信息, 用户将选择对应的部门进行问题咨询,
[QMConnect sdkGetPeers:^(NSArray * _Nonnull peerArray) {
// 获取部门信息的数组
} failureBlock:^{
// 获取信息失败
}];
技能组包含部门ID和部门Name两个属性, 只有一个部门可以不提示选择框, 直接进入聊天界面
4.5 开始会话
进入聊天界面, 首先调用开始会话接口, 成功后才能获取坐席状态, 及消息的收发, 参数为刚刚选择的部门ID, 回调是否开启评价选择项
[QMConnect sdkBeginNewChatSession:self.peerId successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
开始会话带专属坐席(不能配置机器人)
params 为扩展信息和专属坐席信息
扩展信息:
@"customField":@{@"扩展信息key":@"扩展信息value"}
专属坐席:
@"agent":@"坐席工号"
扩展信息+专属坐席:
@{@"customField":@{@"123":@"456"},@"agent":@"8000"}
[QMConnect sdkBeginNewChatSession:self.peerId params:@{@"": @""} successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
开始会话(日程管理专用)
[QMConnect sdkBeginNewChatSessionSchedule: self.scheduleId processId: self.processId currentNodeId: self.currentNodeId params: @{@"":@""} successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
会话状态(以广播的形式推送给移动端)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(robotAction) name:ROBOT_SERVICE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customOnline) name:CUSTOMSRV_ONLINE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customOffline) name:CUSTOMSRV_OFFLINE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customClaim) name:CUSTOMSRV_CLAIM object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customFinish) name:CUSTOMSRV_FINISH object:nil];
其他推送 排队数
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customQueue:) name:CUSTOMSRV_QUEUENUM object:nil];
坐席信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customAgentMessage:) name:CUSTOMSRV_AGENT object:nil];
满意度
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customInvestigate) name:CUSTOMSRV_INVESTIGATE object:nil];
专属坐席未在线
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customVIP) name:CUSTOMSRV_VIP object:nil];
新消息通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNewReload:) name:CHATMSG_RELOAD object:nil]
4.6 坐席信息
Object | 说明 | 备注 |
---|---|---|
exten | 坐席工号 | 例:7000、8000 |
name | 坐席名称 | 后台未配置显示工号 |
icon_url | 坐席头像 | 后台未配置没有值 |
type | 类型 | robot(机器人)claim(人工) |
4.7 消息结构
Object | 说明 | 备注 |
---|---|---|
_id | 消息ID | 记录每条消息的ID |
device | 设备类型 | 如:iphone5s、iphone6 |
message | 消息内容 | |
messageType | 消息类型 | 如:text、image、voice、file、iframe(小网页)、richText(富文本)、Card(商品展示)、cardInfo(商品详情) |
platform | 平台类型 | 如:iOS、Android |
sessionId | 查询消息的ID | 不同用户的sessionId不同、根据sesssionId查询数据库消息 |
accessid | 查询消息的accessid | AppKey下的全部数据,可查看该用户的同一个AppKey下的全部数据库消息 |
createTime | 消息时间 | 创建消息的时间 |
fromType | 消息来源 | 自己发送的为0、接收的消息为1 |
status | 消息发送状态 | 发送成功为:0、发送失败为:1、正在发送中:2 |
recordSeconds | 录音时间 | 语音消息录音时长 |
localFilePath | 本地文件路径 | 文件上传或者下载后本地存储路径, 沙盒相对路径, 如: |
remoteFilePath | 远程文件路径 | 存储文件的网络路径,可以通过该路径下载各类文件 |
fileName | 文件名 | |
fileSize | 文件大小 | |
mp3FileSize | mp3消息类型文件大小 | |
downloadState | 下载状态 | 已下载:0, 未下载:1, 下载中:2 |
width | iframe类型webView宽度 | |
height | iframe类型webView高度 | |
agentExten | 坐席工号 | |
agentName | 坐席名称 | |
agentIcon | 坐席头像 | |
isRobot | 机器人消息 | |
robotType | 机器人类型 | |
robotId | 机器人id | |
isUseful | 机器人帮助状态 | |
questionId | 机器人问题ID | |
richTextUrl | 富文本地址 | |
richTextPicUrl | 图片地址 | |
richTextTitle | 标题 | |
richTextDescription | 描述 | |
cardImage | 商品信息左侧图片 | |
cardHeader | 商品信息标题 | |
cardSubhead | 商品信息副标题 | |
cardPrice | 商品信息价格 | |
cardUrl | 商品信息地址 | |
userId | 注册用户的userId | 可查询同一个userId下的全部消息 |
4.8 获取未读消息数
此接口Appkey、userName、userId必须与注册用的保持一致
[QMConnect sdkGetUnReadMessage:@"AppKey" userName:@"userName" userId: @"userId" successBlock:^(NSInteger) {
// 获取未读消息数成功
} failureBlock:^{
// 获取未读消息数失败
}];
获取未读消息数的AppKey、userName、userId必须和注册的保持一致
4.9 发送消息
发送文本消息
[QMConnect sendMsgText:@"文本消息" successBlock:^{
// 文本消息发送成功
} failBlock:^{
// 文本消息发送失败
}];
发送语音消息
[QMConnect sendMsgAudio:@"录音文件名" duration:@"录音时长" successBlock:^{
// 语音消息发送成功
} failBlock:^{
// 语音消息发送失败
}];
发送图片消息
[QMConnect sendMsgPic:image对象 successBlock:^{
// 图片发送成功
} failBlock:^{
// 图片发送失败
}];
发送文件消息
[QMConnect sendMsgFile:@"文件名字" filePath:@"文件路径" fileSize:@"文件大小" progressHander:^(float progress) {
// 文件上传进度回调
} successBlock:^{
// 文件上传成功
} failBlock:^{
// 文件上传失败
}];
发送卡片消息
[QMConnect sendMsgCardInfo:dic successBlock:^{
商品信息发送成功
} failBlock:^{
商品信息发送失败
}];
消息重发
[QMConnect resendMessage:消息实例 successBlock:^{
// 重新发送成功
} failBlock:^{
// 重新发送失败
}];
4.10 数据库操作
获取同一个accessId下数据库的全部信息,参数number为每次从数据库取回的消息条数
[QMConnect getAccessidAllDataFormDatabase:number];
获取同一个userId下数据库的全部信息,参数number为每次从数据库取回的消息条数
[QMConnect getUserIdDataFormDatabase:number]
获取单次会话的数据库信息(客服主动关闭后在进入消息清空), 参数number为每次从数据库取回的消息条数, dataArray为消息数组
dataArray = [QMConnect getDataFromDatabase:number]
获取单条消息, 参数为消息ID, 返回值虽然为数组类型, 但只包含一条消息, 一般用于发送失败的消息重发
dataArray = [QMConnect getOneDataFromDatabase:@"消息ID"]
删除单条消息, 参数为消息ID, 只能删除本地数据库中的消息
[QMConnect removeDataFromDataBase:@"消息ID"];
修改语音状态接口,参数为消息ID
[QMConnect changeAudioMessageStatus:@"消息ID"];
撤回消息接口,该接口只用于客服撤回消息
[QMConnect changeDrawMessageStatus:@"消息ID"];
查询MP3类型文件的消息的大小
[QMConnect queryMp3FileMessageSize:@"消息ID"];
修改MP3类型文件的消息的大小
[QMConnect changeMp3FileMessageSize:@"消息ID" fileSize:@"文件大小"];
插入商品信息卡片消息, 进入客服界面会出现该商品的消息
[QMConnect insertCardInfoData:消息字典];
删除商品信息卡片消息
[QMConnect deleteCardTypeMessage];
修改商品信息卡片消息时间
[QMConnect changeCardTypeMessageTime:消息时间];
4.11 是否启用机器人
在线客服包含机器人客服和人工客服, 如配置有机器人客服, 如没配置直接进入人工
[QMConnect allowRobot];
4.12 转人工服务
[QMConnect sdkConvertManual:^{
// 转人工客服成功
} failBlock:^{
// 转人工客服失败
}];
如未配置机器人客服不需要调用此接口, 转人工客服失败, 则直接跳转至留言界面或退出
4.13 授权其他坐席
专属坐席未在线的情况下,是否接受其他坐席的服务
[QMConnect sdkAcceptOtherAgentWithPeer:self.peerId successBlock:^{
// 授权成功
// 需要再次调用beginSession接口
} failBlock:^{
// 授权失败
}];
4.14 获取评价信息
[QMConnect sdkGetInvestigate:^(NSArray * _Nonnull investigateArray) {
// 获取评价信息成功
} failureBlock:^{
// 获取评价信息失败
}];
2.8.4新增接口(可获取满意度自定义标题和提示语)
[QMConnect newSDKGetInvestigate:^(Evaluation * _Nonnull evaluation) {
// 获取评价信息成功
} failureBlock:^{
// 获取评价信息失败
}];
4.15 提交评价
[QMConnect sdkSubmitInvestigate:@"评价名称" value:@"评价编号" successBlock:^{
// 评价成功
} failBlock:^{
// 评价失败
}];
4.16 机器人帮助评价
[QMConnect sdkSubmitRobotFeedback:isUseful questionId:@"机器人问题id" messageId:@"消息ID" robotType:@"机器人消息类型" robotId:@"机器人ID" successBlock:^{
//机器人帮助评价成功
} failBlock:^{
//机器人帮助评价失败
}];
4.17 提交留言
[QMConnect sdkSubmitLeaveMessage:@"部门ID" phone: @"联系电话" Email:@"联系邮箱" message:@"留言内容" successBlock:^{
// 留言成功
} failBlock:^{
// 留言失败
}];
4.18 关闭服务
[QMConnect logout];
4.19 下载文件
[QMConnect downloadFileWithMessage:文件消息实例 localFilePath:@"存储文件的路径" progressHander:^(float progress) {
// 文件下载进度
} successBlock:^{
// 文件下载成功
} failBlock:^(NSString * _Nonnull error) {
// 文件下载失败
}];
4.20 留言功能
留言功能
[QMConnect allowedLeaveMessage]
留言提示信息
[QMConnect leaveMessageAlert]
留言标题
[QMConnect leaveMessageTitle]
留言内容信息
[QMConnect leaveMessagePlaceholder]
自动关闭会话功能
[QMConnect allowedBreakSession]
自动关闭会话提示语
[QMConnect breakSessionAlert]
自动关闭会话时间
[QMConnect breakSessionDuration]
自动关闭提醒时间
[QMConnect breakSessionAlertDuration]
4.21 定时提醒和关闭会话(1.9.0以后不建议使用此接口)
QMConnect sdkChatTimerBreaking:^(NSDictionary * _Nonnull) {
//获取定时提示信息成功
} failBlock:^{
//获取定时提示消息失败
}];
4.22 更新deviceToken
每次启动应用都需要重新设置
[QMConnect setServerToken:deviceToken];
4.23 转人工按钮是否显示
[QMConnect manualButtonStatus];
4.24 xbot机器人底部推荐
[QMConnect xbotBottomList];
4.25 退出登录不接受离线消息
[QMConnect sdkLogoutAction];
常见问题
集成问题
编译问题
发布问题
逻辑问题
使用问题
推送问题
H5页面问题
技能组&日程问题
集成问题
1 . 不显示表情 解决方案: * 查看demo导入工程的时候是否将表情图片同时导入 * 查看对应表情的expressionImage.plist文件是否已经导入, 该文件在第三方库ExpressionView文件夹下 * 查看显示表情的Cell中是否支持表情的富文本, demo中使用的是EmojiLabel第三方库 2 . 第三方库冲突 * demo中的第三方库冲突可以二选一,将其中一个重复的删除 * SDK中使用了FMDB, Qiniu, AFNetworking等第三方库, 容易出现冲突的是AFNetworking出现冲突时可以更新新版的Qiniu就可以解决此问题 3 . 使用iphone真机注册失败 * 在蜂窝移动网络中,打开对应的网络管理 4 . pod search 不到最新的库 * 更新本地的缓存 pod repo update * 检查pod版本 5 . SDK界面部分显示成英文 * SDK支持国际化,导入代码的同时,需要在工程中建立创建多语言文件,Demo中的多语言文件名称为:Localizable.strings 6 . 已接入人工,导航栏仍显示 等待接入 (2.7.0版本之前显示的是等待连接) * 因为客服系统设置访客回复消息后才算接入会话, 修改方式看下图 7 . 发布App Store包体积增到3-4MB,请到开发者账号下看具体的增大体积
编译问题
- Linker command failed
错误如下 解决方案:
- General --> Linked Frameworks and Libraries 下添加 libresolv.tbd
逻辑问题
- 跳转至聊天界面
- 现象一 跳转至聊天界面后,网络断开重新连接,又跳转一次聊天界面
解决方案: 跳转界面根据注册SDK成功后,接收到相应的通知进行跳转,网络波动会导致后台重新连接,再次发出连接成功的通知,所以在跳转界面进行判断,在聊天界面的时候,接收连接成功的通知直接return不会跳转 - 现象二 应用将要进入后台的时候调用注销接口, 返回前台后收不到消息 解决方案: 需要重新注册和之前注册的AppKey、userName、userId需要保持一致
使用问题
- 客服发送消息用户无法收到 解决方案:登录后台系统需要使用google浏览器
- 客服不在线、用户的会话接入到了该客服 解决方案:客服登陆前、确保所有的待处理会话都已经结束
推送问题
1、 上传证书不离线推送
- 检查客服系统中是否配置过 p12 文件,此证书是否与此app的 Bundle Identifier 关联的推送证书
- 检查证书的线上、测试环境是否跟客服系统中配置的相同
- 检查 appName 是否和客服系统中填写的“App名称”一致
- 检查 provision profile 是否包含了推送证书
- 检查代码调试是否可以获取到 devicetoken
- 检查工程中的 Capablities 中是否开启了 Push Notifications
2、上传URL接收不到离线推送
- 消息以json数据发送给客服系统中配置的URL,检查是否收到json数据
3、SDK以离线 app在线时接收到离线推送提示处理
- 详见AppDelegate
4、关于离线推送会产生的问题 场景一、 APP退到后台 不能及时收到离线推送,大概3分钟之后才能正常收到离线推送
- 系统判断会话是否离线是通过是否调用[QMConnect logout]来判断。
- 正常的退到后台,并没有调用[QMConnect logout]方法,这时候系统并不能直接判断出改会话已经离线,会默认重连,大概3分钟的时间 如果没有重连成功就把改会话至为离线,在这之后方可才能正常收到客服发送过来的离线消息。
- 如果想要应用退到后台就能马上收到离线消息,需要在AppDelegate下面代理方法中添加[QMConnect logout]。
- (void)applicationDidEnterBackground:(UIApplication *)application {
//断开连接
[QMConnect logout];
}
场景二、 APP在聊天界面退到后台能正常收到离线消息,再次返回前台之后,收不到客服发的消息,退出再次进入可以看到客服发的消息
- APP后台之后就能马上收到离校消息,是因为AppDelegate中的下面代理方法添加了[QMConnect logout]
- (void)applicationDidEnterBackground:(UIApplication *)application {
//断开连接
[QMConnect logout];
}
- 需要在AppDelegate再次返回前台的代理方法中重新注册,
- (void)applicationWillEnterForeground:(UIApplication *)application {
//需要使用之前一样的appKey、userName、userId
[QMConnect registerSDKWithAppKey:@"" userName:@"" userId:@""];
}
- 这个方法在demo并没有展示出来,需要在添加离线推送 特别是在APP内部的聊天界面退到后台时调用了[QMConnect logout], 再次返回前台时一定需要再次进行注册,来确保与服务端建立连接,才能正常的收到客服发送的消息
场景三、 在APP内,不在聊天界面是否能收到离线推送
- 在应用内部,当进入聊天界面之后,退出改页面时需要调用[QMConnect logout]方法,不论是点击返回按钮还是手势,都需要调用[QMConnect logout]方法。
- 在应用内部是,收到离校推送会以UIAlertController弹框的形式呈现出来,具体代码可以参考demo中的AppDelegate
H5页面问题
- H5链接页面不显示
NSString *filePath = @"kf.7moor.com";
NSString *encodedString = [filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *weburl = [NSURL URLWithString:encodedString];
[webView loadRequest:[NSURLRequest requestWithURL:weburl]];
- H5页面点击图片或文件不跳转
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
if (self.presentedViewController != nil) {
[super dismissViewControllerAnimated:flag completion:completion];
}
}
- tabBar遮挡发送按钮
- 查看webView的frame的高度
技能组&日程问题
1、技能组&日程是在云客服管理员坐席进行更改 2、QMHomeViewController中的 -(void)registerSuccess:(NSNotification *)sender 方法中有明确判断,技能组只能走[self getPeers]方法, 日程流程只能走[self starSchedule]方法,不能混用,否则会出现无匹配日程问题
代码改动
4.0.0代码改动
ui部分适配暗黑模式,建议整体替换
3.9.0代码改动
- QMChatRoomViewController
- QMChatGuestBookViewController
- QMChatRobotCell
- QMChatRobotFlowCell
- QMChatFlowView
- QMLabelText
3.7.0代码改动
- QMChatRoomViewController
- QMChatLogistcsInfoCell
- QMChatRoomXbotCardCell
- QMChatRoomXbotCardView
- msgTask文件夹
3.6.0代码改动
- QMChatRoomViewController 新增消息类型
- QMChatFormCell 新增
- Form文件下的所有类新增
- AnswerMoreView 中tableview代理方法中代码改动
- QMChatImageCell 改动
- QMChatRobotCell 改动
- QMChatRobotFlowCell 改动
- QMChatFlowView 改动
3.5.0代码改动
- QMChatRoomViewController 新增消息类型、满意度评价增加新参数、发送消息接口增加失败返回值、开始新会话接口新增返回会话id参数
- QMChatEvaluationView 改动
- QMChatBaseCell.h 改动 新增回调
- QMChatNoteCell 改动 满意度主要改动
- QMChatRobotFlowCell 改动
- QMChatFlowView、QMCustomLayout 改动
- QMChatCommonProblemCell 新增
- SegmentView 新增
- AnswerView 新增
- AnswerMoreView 新增
- SocketRocket库 可pod导入
- UIView+Hex 新增
3.4.0代码改动
- demo里所有的类都进行改动,请从新替换
3.2.9代码改动
- QMChatRobotCell
- MLEmojiLabel第三方库的正则匹配格式,建议整个第三方库替换
3.2.8代码改动
- QMChatRoomViewController修改tableViewDelegate, LogoutAction方法更改,beginNewChat方法更改
- QMChatRoomRobotFlowCell、QMFlowView、QMTextModel、CustormLayout 修改xbot点选样式的
- QMChatRoomEvaluationView、RadioContentView、QMAlert 满意度评价修改
- QMChatRoomRobotCell、QMChatRoomRobotReplyCell修改了点赞点踩文案
- QMChatBaseCell、MLEmojiLabel、QMChatTextCell 增加回调,用于匹配电话号码进行复制和拨号
- QMChatRoomGuestBookViewController 修复留言重复提交功能
- 如果没做自定义 建议直接替换demo或者上诉出现的类
3.2.7代码改动
- QMChatRoomImageCell 新增79行代码 imgWidth判断
- QMChatRoomRobotCell 新增174行代码 width判断
- QMChatRoomVoiceCell 建议直接替换 新增语音转文字功能 修改代码较多
- QMTextModel 新增方法
- QMChatRoomViewController 重点 新增语音转文字方法新增通知方法refreshVoiceMessage来修改语音转文字、 customVIP改方法改动,新增提示可看一下效果自行选择是否弹框提示、 beginSession也有改动判断了技能组和日程调用不同的方法,QMEvaluation新增是否访客能主动发满意度评价字段,tableViewDelegate也做了修改, 该类修改内容较多,如果没有自定义建议直接替换
3.2.6代码改动
- 新增 QMMoreCardView、QMLogistsMoreView、QMCardInfoModel (QMMOreCardviews文件夹)QMLogistcsInfoModel、QMQuestionModel QMChatLogistcsInfoCell
- QMChatRoomViewController 添加insertModeltoIMDB:(QMQuestionModel *)model 插入特殊消息到聊天数据库.新增QMChatLogistcsInfoCell/QMChatRoomXbotCardCell
- QMConnect 添加退出sdkLogoutAction消息接口
- QMChatRoomXbotCardView 修改界面功能
- PrefixHeader添加QMHEXSRGB、 kIphone6sScaleWidth 宏
- QMChatRoomEvaluationView、QMEvaluation添加评论字数限制,及标签必选项
- QMChatRoomXbotCardView添加moreAction显示更多界面
- QMChatRoomViewController新增refeashData刷新功能dealloc添加 [QMConnect changeAllCardMessageHidden];
- Appdelgate 启动完成添加 [QMConnect changeAllCardMessageHidden];来修复未发送成功消息状态
- 本次更新内容较多,建议如果没自定义SDK类的文件全部更新,自定义的文件对比更新一下
3.2.5代码改动
- 新增QMChatRoomBottomListView
- 在QMChatRoomViewController中增加isBottomShow变量,changeBottomViewFrame方法,在该类中几处判断修改chatTableView.frame和bottomView.frame,在beginNewChat方法中增加部分判断代码
- 以下几个类中修改部分代码,直接替换类就行MLEmojiLabel QMChatRoomShowFileController、QMChatRoomRobotCell、 QMPickedAudioViewController、QMPickedDocViewController、QMPickedOtherViewController、QMPickedVideoViewController
3.2.4代码改动
- 新增QMChatRoomRobotFlowCell、QMChatRoomRobotFlowCollectionCell、CustormLayout、QMFlowView
- QMAlert新增方法
- QMTextModel新增方法
- QMChatRoomViewController部分改动
- QMChatRoomBaseCell中的一个block回调更改,在QMChatRoomRobotCell中用到的这个也进行了更改
3.2.3代码改动
- 新增QMChatRoomAssociationInputView
- 在QMChatRoomViewController中 新增CUSTOMSRV_ASSOCIATSINPUT通知方法--133行, 新增isShowAssociatsView、_cateIdArr、_questions变量,2.3.2demo中的292行的判断改动,909-912行,961-1023行新增,1393行和1294行新增,1577-1883新增,以上说的行数都是新下载的3.2.3的demo中的改动
- 本次更新就改动这些代码,具体行数都有标明
3.2.2代码更改
- QMDateManager新增时间方法
- QMChatRoomBaseCell 72行时间方法的调用
- QMChatRoomViewController:新增circleViews,coverView,修改- (void)getNewReload: (NSNotification *)sender方法里面的内容,修改createEvaluationView方法增加判断,修改- (void)logoutAction方法事件操作,新增- (void)isShowEvaluateBtn:(BOOL)speek方法,修改- (void)beginNewChat方法部分内容,以及283行manualButotn转人工按钮是否显示的判断等
- 主要更改的就是QMChatRoomViewController上述说到的方法,可以再demo中查阅一下
3.2.0代码更改
- 主要更改了QMChatRoomViewController
- 新增QMChatRoomEvaluationView和QMChatRoomRadioContentView两个类
- QMChatTileView增加部分代码
- QMChatRoomInputView 新增coverView
- QMManager
- 设计的代码太多,可能还设计其他类的代码,编译报错时对比demo即可修改,给您带来不便,抱歉。
- 这次改动较多,增强了收发消息等一些列问题,
更新日志
版本更新4.0.0
- 增加 SDK 暗黑模式
- 优化SDK,提升稳定性
版本更新3.9.0
- 增加xbot机器人状态下发送卡片类型消息触发机器人的未知回复
- 留言页面取值优化
- 优化sdk性能及修复一些已知bug
版本更新3.7.0
- 增加xbot机器人订单卡片和物流卡片功能。
- 支持配置人工状态下的联想输入功能。
- 优化转人工按钮重复点击问题。
版本更新3.6.0
- 新增xbot机器人表单功能。
- 优化SDK体验及修复一些已知bug。
版本更新3.5.0
- 新增机器人分组常见问题
- 新增机器人点选样式多选功能
- 新增机器人联想关键词匹配标红
- 新增满意度邀评按钮和不同会话评价
- 增加发送消息失败的错误信息返回
- 修复满意度评价内容苹果自带键盘错乱问题
- 新增SocketRocket库,可pod导入
版本更新3.4.0
- UI全新改版
- 适配暗盒模式
- 增加已读未读功能
版本更新3.2.9
- 新增xbot添加视频功能
- 新增xbot电话号码匹配
- 新增xbot机器人消息支持配置转人工类型文字按钮。
- 发送文件大小提高至200Mb。
版本更新3.2.8
- 新增注销按钮支持满意度弹框权限控制
- 新增xbot机器人点赞点踩自定义文案
- 新增xbot机器人点选消息类型
- 新增xbot机器人消息中增加图片展示
- 新增机器人文本消息电话号码匹配点击呼叫或复制功能
- 修复留言按钮重复提交功能
版本更新3.2.7
- 新增语音转文字功能
- 新增系统消息头像(云客服上传)
- 新增访客不同主动评价(云客服权限控制)
- 新增专属坐席不在线弹屏提示
- 修复专属坐席不在线转其他坐席时接入机器人问题
- 优化xbot机器人转人工不在线跳转留言逻辑
版本更新3.2.6
- 新增接口APP退出不接受离线消息
- 新增新类型卡片消息(demo中有例子)
- 新增满意度时效性功能,修复满意度评价部分功能
- 新增注册失败的返回状态
- 新增常见问题功能
- 修复图片展示和语音等部分功能
版本更新3.2.5
- 新增xbot底部推荐功能
- 修复附件上传和浏览附件返回按钮frame问题
- 修复机器人配置相同文本的富文本是点击链接跳转错误的问题
版本更新3.2.4
- 新增xbot部分功能
- 修改已知问题
版本更新3.2.3
- 新增xbot联想功能
- 修复获取技能组和满意度api返回值问题
版本更新3.2.2
- 新增xbot机器人
- 多次弹出满意度评价问题
- 满意度评价增加坐席回复才能进行评价逻辑
- 增加访客退出主动弹出满意度评价功能,提高参评率
- 修改聊天时间展示问题
- 修复无匹配日程产生无效会话问题
- 修复重复离开接入,客服系统显示未读消息数的功能
版本更新3.2.0
- 新增网络状态监控
- 修复长时间后台在返回前台收不到客服消息问题
- 在聊天界面客服关闭会话之后输入框更改
- 新增排队文案配置
版本更新3.0.0
- 修复商品信息卡片发送链接问题
- 修复默认转人工按钮显示状态问题
版本更新2.8.4
- 对应swift版本的2.8.4
- 之前的功能全部包含在内
2客服 SDK-iOS 对接文档 V4.3.0版本
概述
容联·七陌 云客服平台访客端iOS SDK,可由对接企业移动端开发人员通过集成开发实现App内访客端的接入。
我们提供了较为完善的Demo以及Demo UI代码。对接之前,对接企业的负责人或已开通坐席平台的管理员可以下载Demo提供给研发进行运行体验,提前了解SDK能力便于更快速的进行SDK集成和开发工作。
Demo UI提供了一套基础的会话样式示例,如不满足您的样式需求需要您对Demo UI样式进行自定义修改,请详细阅读并了解Demo代码后进行自定义UI。
SDK权限和隐私政策说明
sdk权限点击下方链接查看: https://m.7moor.com/static/m7SdkPermission.html
容联七陌隐私政策说明: https://m.7moor.com/static/m7PrivacyPolicy.html
1、SDK工作流程
2、准备工作
2.1 文件说明
文件 | 说明 |
---|---|
IMSDK | 使用Objective-C编写UI界面的demo, 并提供两种集成方式: |
1.QMIMDemo 客服UI以及相关依赖组件用cocoapods 管理,只需注册接入即可 | |
2.QMIMUIDemo 客服UI需手动导入,其他依赖组件可用 cocoapods 管理,可以根据需求自定义修改 | |
QMLineSDK | 在线客服核心库、可以通过cocoapods动态引用 |
2.2 开发环境
Xcode版本 -> 12.0 (12A7209) QMLineSDK -> 4.3.1 QMBaseLib -> 0.4 FMDB -> 2.7.5 Qiniu -> 8.4.4 SocketRocket -> 0.6.0 注:视频通话库,根据需求手动导入(WebRTC.framework,QMMeet.framework)
3、快速集成(提供两种集成方式)
注: 集成和发布过程有问题,请看文档最后的常见问题
3.1 UI 界面手动导入(可自定义 UI)
pod 'QMLineSDK', '~> 4.3.1' pod 'QMUIComponent', '~> 0.4' QMChatUI: 聊天界面(需手动导入)
3.2 UI 界面CocoaPods 管理
pod 'QMChatUI', '~> 1.0' pod 'QMLineSDK', '~> 4.3.1'
3.3 配置xcode(framework 根据需求自行添加)
- General配置
Embedded Binaries,展开 Embedded Binaries 后 点击展开后下面的 + 来添加framework
- Build Settings配置 (不支持bitcode)
Build Options -> Enable Bitcode 选择No
- Info.plist配置 (允许http、获取权限)
3.4 注册SDK
- 初始化SDK
初始化sdk前需要先配置服务环境,可以与技术支持确认应该使用那种环境 [QMConnect switchServiceRoute:QMServiceLineTencent];//腾讯云 [QMConnect switchServiceRoute:QMServiceLineAliy];//阿里云 [QMConnect switchServiceRoute:QMServiceLineHuawei];//华为云
AppKey: 在后台SDK下载界面的下方, 是接入在线客服的唯一凭证 userName: 可以区分不同用户的用户名称, 可以显示在后台客服界面 userId: 可以区分不同用户接入在线客服, 不同用户用户ID一定不同 注: userId用户的唯一标识 只能使用字母、数字及下划线、否则会初始化失败, AppKey、userName、userId都是必填项 userId是用户的唯一标识,所以不同的访客的userId应该是不能重复的(userId重复的话会出现问题)
[QMConnect registerSDKWithAppKey:@"注册App的AppKey" userName:@"用户名" userId:@"1234"];
注:进行任何操作必须是注册AppKey成功的状态
- AppKey获取方法
- 监听注册状态
监听SDK初始化的状态需要注册广播:
CUSTOM_LOGIN_SUCCEED: 注册成功的时候广播的名字, SDK其他的接口操作都基于注册成功的状态才能进行, 如获取部门、或技能组的接口
CUSTOM_LOGIN_ERROR_USER: 注册失败时候广播的名字, 具体失败的原因提示:
1、accessId is Empty: appKey不可以为空值
2、userName is Empty: userName不可以为空值
3、userId is not match: userId不可以为空值
4、Create Socket Error: 建立连接失败
5、Connect Socket Error: 连接服务器失败
6、5: 服务器状态异常
7、400: appKey错误或不存在
8、服务端返回其他类型错误
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess:) name:CUSTOM_LOGIN_SUCCEED object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginFaile:) name:CUSTOM_LOGIN_ERROR_USER object:nil];
4、API接口
4.1 自建服务器设置网络地址
是不是自建服务器的用户不需要设置此项,此接口应在注册之前使用
[QMConnect setServerAddress:@"IP地址" tcpPort:@"端口" httpPost:@"TCP地址"];
4.2 获取渠道全局配置
获取全局配置,主要用于区分下一步操作日程管理和技能组(如果不配置日程管理的可跳过此步骤,直接获取技能组信息)
[QMConnect sdkGetWebchatGlobleConfig:^(NSDictionary * _Nonnull scheduleDic) {
//获取渠道全局配置字典
} failBlock:^{
//获取信息失败
}];
注册成功自动获取后台配置信息并写入本地plist文件
4.3 获取配置信息(开启日程管理时用到)
[QMConnect sdkGetWebchatScheduleConfig:^(NSDictionary * _Nonnull scheduleDic) {
//获取配置信息成功
} failBlock:^{
//获取配置信息失败
}];
4.4 获取部门信息(技能组)
后台可配置多个部门/技能组(如: 售前、售后等), SDK注册成功后, 调用此接口获取后台配置好的部门信息, 用户将选择对应的部门进行问题咨询,
[QMConnect sdkGetPeers:^(NSArray * _Nonnull peerArray) {
// 获取部门信息的数组
} failureBlock:^{
// 获取信息失败
}];
技能组包含部门ID和部门Name两个属性, 只有一个部门可以不提示选择框, 直接进入聊天界面
4.5 开始会话
进入聊天界面, 首先调用开始会话接口, 成功后才能获取坐席状态, 及消息的收发, 参数为刚刚选择的部门ID, 回调是否开启评价选择项
[QMConnect sdkBeginNewChatSession:self.peerId successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
开始会话带专属坐席(不能配置机器人)
params 为扩展信息和专属坐席信息
扩展信息:
@"customField":@{@"扩展信息key":@"扩展信息value"}
专属坐席:
@"agent":@"坐席工号"
扩展信息+专属坐席:
@{@"customField":@{@"123":@"456"},@"agent":@"8000"}
[QMConnect sdkBeginNewChatSession:self.peerId params:@{@"": @""} successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
开始会话(日程管理专用)
[QMConnect sdkBeginNewChatSessionSchedule: self.scheduleId processId: self.processId currentNodeId: self.currentNodeId params: @{@"":@""} successBlock:^(BOOL remark) {
// 开始会话成功, 评价开关
} failBlock:^{
// 开始会话失败
}];
会话状态(以广播的形式推送给移动端)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(robotAction) name:ROBOT_SERVICE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customOnline) name:CUSTOMSRV_ONLINE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customOffline) name:CUSTOMSRV_OFFLINE object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customClaim) name:CUSTOMSRV_CLAIM object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customFinish) name:CUSTOMSRV_FINISH object:nil];
其他推送 排队数
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customQueue:) name:CUSTOMSRV_QUEUENUM object:nil];
坐席信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customAgentMessage:) name:CUSTOMSRV_AGENT object:nil];
满意度
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customInvestigate) name:CUSTOMSRV_INVESTIGATE object:nil];
专属坐席未在线
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customVIP) name:CUSTOMSRV_VIP object:nil];
新消息通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNewReload:) name:CHATMSG_RELOAD object:nil]
4.6 坐席信息
Object | 说明 | 备注 |
---|---|---|
exten | 坐席工号 | 例:7000、8000 |
name | 坐席名称 | 后台未配置显示工号 |
icon_url | 坐席头像 | 后台未配置没有值 |
type | 类型 | robot(机器人)claim(人工) |
4.7 消息结构
Object | 说明 | 备注 |
---|---|---|
_id | 消息ID | 记录每条消息的ID |
device | 设备类型 | 如:iphone5s、iphone6 |
message | 消息内容 | |
messageType | 消息类型 | 如:text、image、voice、file、iframe(小网页)、richText(富文本)、Card(商品展示)、cardInfo(商品详情) |
platform | 平台类型 | 如:iOS、Android |
sessionId | 查询消息的ID | 不同用户的sessionId不同、根据sesssionId查询数据库消息 |
accessid | 查询消息的accessid | AppKey下的全部数据,可查看该用户的同一个AppKey下的全部数据库消息 |
createTime | 消息时间 | 创建消息的时间 |
fromType | 消息来源 | 自己发送的为0、接收的消息为1 |
status | 消息发送状态 | 发送成功为:0、发送失败为:1、正在发送中:2 |
recordSeconds | 录音时间 | 语音消息录音时长 |
localFilePath | 本地文件路径 | 文件上传或者下载后本地存储路径, 沙盒相对路径, 如:NSString *sandboxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; |
NSString *realFilePath = [sandboxPath stringByAppendingPathComponent:message.localFilePath]; | ||
remoteFilePath | 远程文件路径 | 存储文件的网络路径,可以通过该路径下载各类文件 |
fileName | 文件名 | |
fileSize | 文件大小 | |
mp3FileSize | mp3消息类型文件大小 | |
downloadState | 下载状态 | 已下载:0, 未下载:1, 下载中:2 |
width | iframe类型webView宽度 | |
height | iframe类型webView高度 | |
agentExten | 坐席工号 | |
agentName | 坐席名称 | |
agentIcon | 坐席头像 | |
isRobot | 机器人消息 | |
robotType | 机器人类型 | |
robotId | 机器人id | |
isUseful | 机器人帮助状态 | |
questionId | 机器人问题ID | |
richTextUrl | 富文本地址 | |
richTextPicUrl | 图片地址 | |
richTextTitle | 标题 | |
richTextDescription | 描述 | |
cardImage | 商品信息左侧图片 | |
cardHeader | 商品信息标题 | |
cardSubhead | 商品信息副标题 | |
cardPrice | 商品信息价格 | |
cardUrl | 商品信息地址 | |
userId | 注册用户的userId | 可查询同一个userId下的全部消息 |
4.8 获取未读消息数
此接口Appkey、userName、userId必须与注册用的保持一致
[QMConnect sdkGetUnReadMessage:@"AppKey" userName:@"userName" userId: @"userId" successBlock:^(NSInteger) {
// 获取未读消息数成功
} failureBlock:^{
// 获取未读消息数失败
}];
获取未读消息数的AppKey、userName、userId必须和注册的保持一致
4.9 发送消息
发送文本消息
[QMConnect sendMsgText:@"文本消息" successBlock:^{
// 文本消息发送成功
} failBlock:^{
// 文本消息发送失败
}];
发送语音消息
[QMConnect sendMsgAudio:@"录音文件名" duration:@"录音时长" successBlock:^{
// 语音消息发送成功
} failBlock:^{
// 语音消息发送失败
}];
发送图片消息
[QMConnect sendMsgPic:image对象 successBlock:^{
// 图片发送成功
} failBlock:^{
// 图片发送失败
}];
发送文件消息
[QMConnect sendMsgFile:@"文件名字" filePath:@"文件路径" fileSize:@"文件大小" progressHander:^(float progress) {
// 文件上传进度回调
} successBlock:^{
// 文件上传成功
} failBlock:^{
// 文件上传失败
}];
发送卡片消息
[QMConnect sendMsgCardInfo:dic successBlock:^{
商品信息发送成功
} failBlock:^{
商品信息发送失败
}];
消息重发
[QMConnect resendMessage:消息实例 successBlock:^{
// 重新发送成功
} failBlock:^{
// 重新发送失败
}];
4.10 数据库操作
获取同一个accessId下数据库的全部信息,参数number为每次从数据库取回的消息条数
[QMConnect getAccessidAllDataFormDatabase:number];
获取同一个userId下数据库的全部信息,参数number为每次从数据库取回的消息条数
[QMConnect getUserIdDataFormDatabase:number]
获取单次会话的数据库信息(客服主动关闭后在进入消息清空), 参数number为每次从数据库取回的消息条数, dataArray为消息数组
dataArray = [QMConnect getDataFromDatabase:number]
获取单条消息, 参数为消息ID, 返回值虽然为数组类型, 但只包含一条消息, 一般用于发送失败的消息重发
dataArray = [QMConnect getOneDataFromDatabase:@"消息ID"]
删除单条消息, 参数为消息ID, 只能删除本地数据库中的消息
[QMConnect removeDataFromDataBase:@"消息ID"];
修改语音状态接口,参数为消息ID
[QMConnect changeAudioMessageStatus:@"消息ID"];
撤回消息接口,该接口只用于客服撤回消息
[QMConnect changeDrawMessageStatus:@"消息ID"];
查询MP3类型文件的消息的大小
[QMConnect queryMp3FileMessageSize:@"消息ID"];
修改MP3类型文件的消息的大小
[QMConnect changeMp3FileMessageSize:@"消息ID" fileSize:@"文件大小"];
插入商品信息卡片消息, 进入客服界面会出现该商品的消息
[QMConnect insertCardInfoData:消息字典];
删除商品信息卡片消息
[QMConnect deleteCardTypeMessage];
修改商品信息卡片消息时间
[QMConnect changeCardTypeMessageTime:消息时间];
4.11 是否启用机器人
在线客服包含机器人客服和人工客服, 如配置有机器人客服, 如没配置直接进入人工
[QMConnect allowRobot];
4.12 转人工服务
[QMConnect sdkConvertManual:^{
// 转人工客服成功
} failBlock:^{
// 转人工客服失败
}];
如未配置机器人客服不需要调用此接口, 转人工客服失败, 则直接跳转至留言界面或退出
4.13 授权其他坐席
专属坐席未在线的情况下,是否接受其他坐席的服务
[QMConnect sdkAcceptOtherAgentWithPeer:self.peerId successBlock:^{
// 授权成功
// 需要再次调用beginSession接口
} failBlock:^{
// 授权失败
}];
4.14 获取评价信息
[QMConnect sdkGetInvestigate:^(NSArray * _Nonnull investigateArray) {
// 获取评价信息成功
} failureBlock:^{
// 获取评价信息失败
}];
2.8.4新增接口(可获取满意度自定义标题和提示语)
[QMConnect newSDKGetInvestigate:^(Evaluation * _Nonnull evaluation) {
// 获取评价信息成功
} failureBlock:^{
// 获取评价信息失败
}];
4.15 提交评价
[QMConnect sdkSubmitInvestigate:@"评价名称" value:@"评价编号" successBlock:^{
// 评价成功
} failBlock:^{
// 评价失败
}];
4.16 机器人帮助评价
[QMConnect sdkSubmitRobotFeedback:isUseful questionId:@"机器人问题id" messageId:@"消息ID" robotType:@"机器人消息类型" robotId:@"机器人ID" successBlock:^{
//机器人帮助评价成功
} failBlock:^{
//机器人帮助评价失败
}];
4.17 提交留言
[QMConnect sdkSubmitLeaveMessage:@"部门ID" phone: @"联系电话" Email:@"联系邮箱" message:@"留言内容" successBlock:^{
// 留言成功
} failBlock:^{
// 留言失败
}];
4.18 关闭服务
[QMConnect logout];
4.19 下载文件
[QMConnect downloadFileWithMessage:文件消息实例 localFilePath:@"存储文件的路径" progressHander:^(float progress) {
// 文件下载进度
} successBlock:^{
// 文件下载成功
} failBlock:^(NSString * _Nonnull error) {
// 文件下载失败
}];
4.20 留言功能
留言功能
[QMConnect allowedLeaveMessage]
留言提示信息
[QMConnect leaveMessageAlert]
留言标题
[QMConnect leaveMessageTitle]
留言内容信息
[QMConnect leaveMessagePlaceholder]
自动关闭会话功能
[QMConnect allowedBreakSession]
自动关闭会话提示语
[QMConnect breakSessionAlert]
自动关闭会话时间
[QMConnect breakSessionDuration]
自动关闭提醒时间
[QMConnect breakSessionAlertDuration]
4.21 定时提醒和关闭会话(1.9.0以后不建议使用此接口)
QMConnect sdkChatTimerBreaking:^(NSDictionary * _Nonnull) {
//获取定时提示信息成功
} failBlock:^{
//获取定时提示消息失败
}];
4.22 更新deviceToken
每次启动应用都需要重新设置
[QMConnect setServerToken:deviceToken];
4.23 转人工按钮是否显示
[QMConnect manualButtonStatus];
4.24 xbot机器人底部推荐
[QMConnect xbotBottomList];
4.25 退出登录不接受离线消息
[QMConnect sdkLogoutAction];
常见问题
集成问题
编译问题
发布问题
逻辑问题
使用问题
推送问题
H5页面问题
技能组&日程问题
集成问题
1 . 不显示表情 解决方案: * 查看demo导入工程的时候是否将表情图片同时导入 * 查看对应表情的expressionImage.plist文件是否已经导入, 该文件在第三方库ExpressionView文件夹下 * 查看显示表情的Cell中是否支持表情的富文本, demo中使用的是EmojiLabel第三方库 2 . 第三方库冲突 * demo中的第三方库冲突可以二选一,将其中一个重复的删除 * SDK中使用了FMDB, Qiniu, AFNetworking等第三方库, 容易出现冲突的是AFNetworking出现冲突时可以更新新版的Qiniu就可以解决此问题 3 . 使用iphone真机注册失败 * 在蜂窝移动网络中,打开对应的网络管理 4 . pod search 不到最新的库 * 更新本地的缓存 pod repo update * 检查pod版本 5 . SDK界面部分显示成英文 * SDK支持国际化,导入代码的同时,需要在工程中建立创建多语言文件,Demo中的多语言文件名称为:Localizable.strings 6 . 已接入人工,导航栏仍显示 等待接入 (2.7.0版本之前显示的是等待连接) * 因为客服系统设置访客回复消息后才算接入会话, 修改方式看下图 7 . 发布App Store包体积增到3-4MB,请到开发者账号下看具体的增大体积
编译问题
- Linker command failed
错误如下 解决方案:
- General --> Linked Frameworks and Libraries 下添加 libresolv.tbd
逻辑问题
- 跳转至聊天界面
- 现象一 跳转至聊天界面后,网络断开重新连接,又跳转一次聊天界面
解决方案: 跳转界面根据注册SDK成功后,接收到相应的通知进行跳转,网络波动会导致后台重新连接,再次发出连接成功的通知,所以在跳转界面进行判断,在聊天界面的时候,接收连接成功的通知直接return不会跳转 - 现象二 应用将要进入后台的时候调用注销接口, 返回前台后收不到消息 解决方案: 需要重新注册和之前注册的AppKey、userName、userId需要保持一致
使用问题
- 客服发送消息用户无法收到 解决方案:登录后台系统需要使用google浏览器
- 客服不在线、用户的会话接入到了该客服 解决方案:客服登陆前、确保所有的待处理会话都已经结束
推送问题
1、 上传证书不离线推送
- 检查客服系统中是否配置过 p12 文件,此证书是否与此app的 Bundle Identifier 关联的推送证书
- 检查证书的线上、测试环境是否跟客服系统中配置的相同
- 检查 appName 是否和客服系统中填写的“App名称”一致
- 检查 provision profile 是否包含了推送证书
- 检查代码调试是否可以获取到 devicetoken
- 检查工程中的 Capablities 中是否开启了 Push Notifications
2、上传URL接收不到离线推送
- 消息以json数据发送给客服系统中配置的URL,检查是否收到json数据
3、SDK以离线 app在线时接收到离线推送提示处理
- 详见AppDelegate
4、关于离线推送会产生的问题 场景一、 APP退到后台 不能及时收到离线推送,大概3分钟之后才能正常收到离线推送
- 系统判断会话是否离线是通过是否调用[QMConnect logout]来判断。
- 正常的退到后台,并没有调用[QMConnect logout]方法,这时候系统并不能直接判断出改会话已经离线,会默认重连,大概3分钟的时间 如果没有重连成功就把改会话至为离线,在这之后方可才能正常收到客服发送过来的离线消息。
- 如果想要应用退到后台就能马上收到离线消息,需要在AppDelegate下面代理方法中添加[QMConnect logout]。
- (void)applicationDidEnterBackground:(UIApplication *)application {
//断开连接
[QMConnect logout];
}
场景二、 APP在聊天界面退到后台能正常收到离线消息,再次返回前台之后,收不到客服发的消息,退出再次进入可以看到客服发的消息
- APP后台之后就能马上收到离校消息,是因为AppDelegate中的下面代理方法添加了[QMConnect logout]
- (void)applicationDidEnterBackground:(UIApplication *)application {
//断开连接
[QMConnect logout];
}
- 需要在AppDelegate再次返回前台的代理方法中重新注册,
- (void)applicationWillEnterForeground:(UIApplication *)application {
//需要使用之前一样的appKey、userName、userId
[QMConnect registerSDKWithAppKey:@"" userName:@"" userId:@""];
}
- 这个方法在demo并没有展示出来,需要在添加离线推送 特别是在APP内部的聊天界面退到后台时调用了[QMConnect logout], 再次返回前台时一定需要再次进行注册,来确保与服务端建立连接,才能正常的收到客服发送的消息
场景三、 在APP内,不在聊天界面是否能收到离线推送
- 在应用内部,当进入聊天界面之后,退出改页面时需要调用[QMConnect logout]方法,不论是点击返回按钮还是手势,都需要调用[QMConnect logout]方法。
- 在应用内部是,收到离校推送会以UIAlertController弹框的形式呈现出来,具体代码可以参考demo中的AppDelegate
H5页面问题
- H5链接页面不显示
NSString *filePath = @"kf.7moor.com";
NSString *encodedString = [filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *weburl = [NSURL URLWithString:encodedString];
[webView loadRequest:[NSURLRequest requestWithURL:weburl]];
- H5页面点击图片或文件不跳转
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
if (self.presentedViewController != nil) {
[super dismissViewControllerAnimated:flag completion:completion];
}
}
- tabBar遮挡发送按钮
- 查看webView的frame的高度
技能组&日程问题
1、技能组&日程是在云客服管理员坐席进行更改 2、QMHomeViewController中的 -(void)registerSuccess:(NSNotification *)sender 方法中有明确判断,技能组只能走[self getPeers]方法, 日程流程只能走[self starSchedule]方法,不能混用,否则会出现无匹配日程问题
代码改动
4.2.0代码改动
- 增加相机拍摄图片
- 增加xbot快捷提问功能
- 增加排队保持设置
- 优化sdk性能及修复一些已知问题
4.1.0代码改动
- demo进行了优化,建议整体替换
4.0.0代码改动
ui部分适配暗黑模式,建议整体替换
3.9.0代码改动
- QMChatRoomViewController
- QMChatGuestBookViewController
- QMChatRobotCell
- QMChatRobotFlowCell
- QMChatFlowView
- QMLabelText
3.7.0代码改动
- QMChatRoomViewController
- QMChatLogistcsInfoCell
- QMChatRoomXbotCardCell
- QMChatRoomXbotCardView
- msgTask文件夹
3.6.0代码改动
- QMChatRoomViewController 新增消息类型
- QMChatFormCell 新增
- Form文件下的所有类新增
- AnswerMoreView 中tableview代理方法中代码改动
- QMChatImageCell 改动
- QMChatRobotCell 改动
- QMChatRobotFlowCell 改动
- QMChatFlowView 改动
3.5.0代码改动
- QMChatRoomViewController 新增消息类型、满意度评价增加新参数、发送消息接口增加失败返回值、开始新会话接口新增返回会话id参数
- QMChatEvaluationView 改动
- QMChatBaseCell.h 改动 新增回调
- QMChatNoteCell 改动 满意度主要改动
- QMChatRobotFlowCell 改动
- QMChatFlowView、QMCustomLayout 改动
- QMChatCommonProblemCell 新增
- SegmentView 新增
- AnswerView 新增
- AnswerMoreView 新增
- SocketRocket库 可pod导入
- UIView+Hex 新增
3.4.0代码改动
- demo里所有的类都进行改动,请从新替换
3.2.9代码改动
- QMChatRobotCell
- MLEmojiLabel第三方库的正则匹配格式,建议整个第三方库替换
3.2.8代码改动
- QMChatRoomViewController修改tableViewDelegate, LogoutAction方法更改,beginNewChat方法更改
- QMChatRoomRobotFlowCell、QMFlowView、QMTextModel、CustormLayout 修改xbot点选样式的
- QMChatRoomEvaluationView、RadioContentView、QMAlert 满意度评价修改
- QMChatRoomRobotCell、QMChatRoomRobotReplyCell修改了点赞点踩文案
- QMChatBaseCell、MLEmojiLabel、QMChatTextCell 增加回调,用于匹配电话号码进行复制和拨号
- QMChatRoomGuestBookViewController 修复留言重复提交功能
- 如果没做自定义 建议直接替换demo或者上诉出现的类
3.2.7代码改动
- QMChatRoomImageCell 新增79行代码 imgWidth判断
- QMChatRoomRobotCell 新增174行代码 width判断
- QMChatRoomVoiceCell 建议直接替换 新增语音转文字功能 修改代码较多
- QMTextModel 新增方法
- QMChatRoomViewController 重点 新增语音转文字方法新增通知方法refreshVoiceMessage来修改语音转文字、 customVIP改方法改动,新增提示可看一下效果自行选择是否弹框提示、 beginSession也有改动判断了技能组和日程调用不同的方法,QMEvaluation新增是否访客能主动发满意度评价字段,tableViewDelegate也做了修改, 该类修改内容较多,如果没有自定义建议直接替换
3.2.6代码改动
- 新增 QMMoreCardView、QMLogistsMoreView、QMCardInfoModel (QMMOreCardviews文件夹)QMLogistcsInfoModel、QMQuestionModel QMChatLogistcsInfoCell
- QMChatRoomViewController 添加insertModeltoIMDB:(QMQuestionModel *)model 插入特殊消息到聊天数据库.新增QMChatLogistcsInfoCell/QMChatRoomXbotCardCell
- QMConnect 添加退出sdkLogoutAction消息接口
- QMChatRoomXbotCardView 修改界面功能
- PrefixHeader添加QMHEXSRGB、 kIphone6sScaleWidth 宏
- QMChatRoomEvaluationView、QMEvaluation添加评论字数限制,及标签必选项
- QMChatRoomXbotCardView添加moreAction显示更多界面
- QMChatRoomViewController新增refeashData刷新功能dealloc添加 [QMConnect changeAllCardMessageHidden];
- Appdelgate 启动完成添加 [QMConnect changeAllCardMessageHidden];来修复未发送成功消息状态
- 本次更新内容较多,建议如果没自定义SDK类的文件全部更新,自定义的文件对比更新一下
3.2.5代码改动
- 新增QMChatRoomBottomListView
- 在QMChatRoomViewController中增加isBottomShow变量,changeBottomViewFrame方法,在该类中几处判断修改chatTableView.frame和bottomView.frame,在beginNewChat方法中增加部分判断代码
- 以下几个类中修改部分代码,直接替换类就行MLEmojiLabel QMChatRoomShowFileController、QMChatRoomRobotCell、 QMPickedAudioViewController、QMPickedDocViewController、QMPickedOtherViewController、QMPickedVideoViewController
3.2.4代码改动
- 新增QMChatRoomRobotFlowCell、QMChatRoomRobotFlowCollectionCell、CustormLayout、QMFlowView
- QMAlert新增方法
- QMTextModel新增方法
- QMChatRoomViewController部分改动
- QMChatRoomBaseCell中的一个block回调更改,在QMChatRoomRobotCell中用到的这个也进行了更改
3.2.3代码改动
- 新增QMChatRoomAssociationInputView
- 在QMChatRoomViewController中 新增CUSTOMSRV_ASSOCIATSINPUT通知方法--133行, 新增isShowAssociatsView、_cateIdArr、_questions变量,2.3.2demo中的292行的判断改动,909-912行,961-1023行新增,1393行和1294行新增,1577-1883新增,以上说的行数都是新下载的3.2.3的demo中的改动
- 本次更新就改动这些代码,具体行数都有标明
3.2.2代码更改
- QMDateManager新增时间方法
- QMChatRoomBaseCell 72行时间方法的调用
- QMChatRoomViewController:新增circleViews,coverView,修改- (void)getNewReload: (NSNotification *)sender方法里面的内容,修改createEvaluationView方法增加判断,修改- (void)logoutAction方法事件操作,新增- (void)isShowEvaluateBtn:(BOOL)speek方法,修改- (void)beginNewChat方法部分内容,以及283行manualButotn转人工按钮是否显示的判断等
- 主要更改的就是QMChatRoomViewController上述说到的方法,可以再demo中查阅一下
3.2.0代码更改
- 主要更改了QMChatRoomViewController
- 新增QMChatRoomEvaluationView和QMChatRoomRadioContentView两个类
- QMChatTileView增加部分代码
- QMChatRoomInputView 新增coverView
- QMManager
- 设计的代码太多,可能还设计其他类的代码,编译报错时对比demo即可修改,给您带来不便,抱歉。
- 这次改动较多,增强了收发消息等一些列问题,
更新日志
版本更新4.8.0:
增加卡⽚类型的按钮展示规则 增加满意度星级评价 优化sdk性能及修复⼀些已知问题
版本更新4.7.0:
- 增加切换机器⼈功能
- 增加 xbot 推联答案的⽀持
- 优化sdk性能及修复⼀些已知问题
版本更新4.6.0:
- 新增修改获取聊下消息默认条件
- 新增通过sql语句获取聊天数据
- 优化访客⽆响应断开提示
- 优化消息列表查询条件并增加⾃定义sql查询msg
- ⽀持动态配置⻚⾯按钮
- 优化⽆满意度配置提示
- 优化sdk性能及修复⼀些已知问题
版本更新4.5.0:
- 优化满意度评价显示
- 优化sdk性能及修复⼀些已知问题
版本更新4.4.0:
- 优化卡⽚展示样式
- 优化附件显示
- 优化机器⼈富⽂本显示
版本更新4.3.1
- 优化 xbot 机器人转人工
- 优化暗黑模式
版本更新4.3.0
- 新增转人工类型数据统计
- 新增华为云初始化配置
- 兼容支持 32 位处理器的架构
- 优化sdk性能及修复一些已知问题
版本更新4.2.0
- 增加相机拍摄图片
- 增加xbot快捷提问功能
- 增加排队保持设置
- 优化sdk性能及修复一些已知问题
版本更新4.1.0
- 增加访客与坐席正在输入提示
- 优化xbot机器人消息富文本展示
- 优化图片查看
- 调整sdk依赖结构
- 优化sdk性能及修复一些已知问题
版本更新4.0.0
- 增加 SDK 暗黑模式
- 优化SDK,提升稳定性
版本更新3.9.0
- 增加xbot机器人状态下发送卡片类型消息触发机器人的未知回复
- 留言页面取值优化
- 优化sdk性能及修复一些已知bug
版本更新3.7.0
- 增加xbot机器人订单卡片和物流卡片功能。
- 支持配置人工状态下的联想输入功能。
- 优化转人工按钮重复点击问题。
版本更新3.6.0
- 新增xbot机器人表单功能。
- 优化SDK体验及修复一些已知bug。
版本更新3.5.0
- 新增机器人分组常见问题
- 新增机器人点选样式多选功能
- 新增机器人联想关键词匹配标红
- 新增满意度邀评按钮和不同会话评价
- 增加发送消息失败的错误信息返回
- 修复满意度评价内容苹果自带键盘错乱问题
- 新增SocketRocket库,可pod导入
版本更新3.4.0
- UI全新改版
- 适配暗盒模式
- 增加已读未读功能
版本更新3.2.9
- 新增xbot添加视频功能
- 新增xbot电话号码匹配
- 新增xbot机器人消息支持配置转人工类型文字按钮。
- 发送文件大小提高至200Mb。
版本更新3.2.8
- 新增注销按钮支持满意度弹框权限控制
- 新增xbot机器人点赞点踩自定义文案
- 新增xbot机器人点选消息类型
- 新增xbot机器人消息中增加图片展示
- 新增机器人文本消息电话号码匹配点击呼叫或复制功能
- 修复留言按钮重复提交功能
版本更新3.2.7
- 新增语音转文字功能
- 新增系统消息头像(云客服上传)
- 新增访客不同主动评价(云客服权限控制)
- 新增专属坐席不在线弹屏提示
- 修复专属坐席不在线转其他坐席时接入机器人问题
- 优化xbot机器人转人工不在线跳转留言逻辑
版本更新3.2.6
- 新增接口APP退出不接受离线消息
- 新增新类型卡片消息(demo中有例子)
- 新增满意度时效性功能,修复满意度评价部分功能
- 新增注册失败的返回状态
- 新增常见问题功能
- 修复图片展示和语音等部分功能
版本更新3.2.5
- 新增xbot底部推荐功能
- 修复附件上传和浏览附件返回按钮frame问题
- 修复机器人配置相同文本的富文本是点击链接跳转错误的问题
版本更新3.2.4
- 新增xbot部分功能
- 修改已知问题
版本更新3.2.3
- 新增xbot联想功能
- 修复获取技能组和满意度api返回值问题
版本更新3.2.2
- 新增xbot机器人
- 多次弹出满意度评价问题
- 满意度评价增加坐席回复才能进行评价逻辑
- 增加访客退出主动弹出满意度评价功能,提高参评率
- 修改聊天时间展示问题
- 修复无匹配日程产生无效会话问题
- 修复重复离开接入,客服系统显示未读消息数的功能
版本更新3.2.0
- 新增网络状态监控
- 修复长时间后台在返回前台收不到客服消息问题
- 在聊天界面客服关闭会话之后输入框更改
- 新增排队文案配置
版本更新3.0.0
- 修复商品信息卡片发送链接问题
- 修复默认转人工按钮显示状态问题
版本更新2.8.4
- 对应swift版本的2.8.4
- 之前的功能全部包含在内