0
评论

在线直播源码打造互动直播平台需要开发的功能 直播平台开发 直播 直播系统源码

q2466131704 发表了文章 • 203 次浏览 • 2019-04-23 16:39 • 来自相关话题

通常情况下,我们在购买一套在线直播源码之前,需要事先了解一下它都包含哪些功能。在直播应用场景下,其自身具备的互动性和实时性是非常显著的特点。要想满足直播的实时性和互动性,并且能够给用户带来优质的产品体验,就需要在功能层面上多下功夫。那么,要想打造一款互动直播平台需要开发哪些功能呢?
1.弹幕功能
直播中最基础且必不可少的就是弹幕功能了。不仅可以带动直播间内的活跃程度,还可以增进用户与主播之间的交流沟通,特别是游戏直播场景下,满屏的弹幕和发送弹幕已经成为直播平台靓丽的“风景线”。当然,在开发弹幕功能时还需要注意弹幕的自动审核,对于弹幕消息进行一定的过滤,从而保证平台的整体语言风气。





2.礼物功能
刷礼物,是直播中最直接也最实现的变现方式。用户以送礼物的形式表达自己对主播的喜爱,而主播也会为了获得更多的礼物努力输出令人感兴趣的直播内容,从而增加直播平台的用户黏性和活跃程度。当然,礼物的配置也需要进行一定的优化,比如支持PC、APP、H5的道具播放效果。
3.活动功能
大多数运营级直播平台都会利用各种各样的节日策划各种活动,以奖励为“噱头”吸引用户参与互动,从而增加平台的用户黏性。
4.任务功能
一些直播平台为了增强用户黏性,提高用户日活量,会在新用户注册之后提供任务指引,比如“观看3位主播的直播,并尝试送礼物1次”,以完成任务的形式发送奖励,打消用户的试玩心理。






5.靓号功能
这一功能主要是给喜欢个性并且有意义号码需求的提供的,就像有的人喜欢换简单好记的手机号,有的人并不介意手机号的排列顺序。
6.会员功能
为用户提供相应的特权服务,将会员分为多个不同的层次,刺激用户进行消费充值,并设定有效期,这也是直播平台能够变现的方式之一。
7.守护功能
大部分直播平台都会具备守护功能,给主播礼物打赏数量最高的会获得守护头像框,并排名在显眼的位置,还可以享受一定的特权服务。
8.游戏功能
小游戏对于互动性强的直播平台来说是必不可少的,主播可以在直播过程中与用户玩游戏进行互动,以游戏的方式增强用户黏性,从而给主播增加一定的观看人数,并且使用户能够感受到强烈的参与感。
所以说,要想打购买在线直播源码并打造一款互动直播平台的话,不仅需要对其质量进行考察,还需要了解其中所包含的功能是否能够调动用户的活跃性和积极性。只有这样,才能增加平台的用户流量,最终实现变现目的。文章结尾给大家提个建议,购买源码还是要找专业的源码服务商才行。
本文声明原创,转载请注明出处及作者。 查看全部
通常情况下,我们在购买一套在线直播源码之前,需要事先了解一下它都包含哪些功能。在直播应用场景下,其自身具备的互动性和实时性是非常显著的特点。要想满足直播的实时性和互动性,并且能够给用户带来优质的产品体验,就需要在功能层面上多下功夫。那么,要想打造一款互动直播平台需要开发哪些功能呢?
1.弹幕功能
直播中最基础且必不可少的就是弹幕功能了。不仅可以带动直播间内的活跃程度,还可以增进用户与主播之间的交流沟通,特别是游戏直播场景下,满屏的弹幕和发送弹幕已经成为直播平台靓丽的“风景线”。当然,在开发弹幕功能时还需要注意弹幕的自动审核,对于弹幕消息进行一定的过滤,从而保证平台的整体语言风气。

47291482820971.jpg

2.礼物功能
刷礼物,是直播中最直接也最实现的变现方式。用户以送礼物的形式表达自己对主播的喜爱,而主播也会为了获得更多的礼物努力输出令人感兴趣的直播内容,从而增加直播平台的用户黏性和活跃程度。当然,礼物的配置也需要进行一定的优化,比如支持PC、APP、H5的道具播放效果。
3.活动功能
大多数运营级直播平台都会利用各种各样的节日策划各种活动,以奖励为“噱头”吸引用户参与互动,从而增加平台的用户黏性。
4.任务功能
一些直播平台为了增强用户黏性,提高用户日活量,会在新用户注册之后提供任务指引,比如“观看3位主播的直播,并尝试送礼物1次”,以完成任务的形式发送奖励,打消用户的试玩心理。

14816215168966_副本.png


5.靓号功能
这一功能主要是给喜欢个性并且有意义号码需求的提供的,就像有的人喜欢换简单好记的手机号,有的人并不介意手机号的排列顺序。
6.会员功能
为用户提供相应的特权服务,将会员分为多个不同的层次,刺激用户进行消费充值,并设定有效期,这也是直播平台能够变现的方式之一。
7.守护功能
大部分直播平台都会具备守护功能,给主播礼物打赏数量最高的会获得守护头像框,并排名在显眼的位置,还可以享受一定的特权服务。
8.游戏功能
小游戏对于互动性强的直播平台来说是必不可少的,主播可以在直播过程中与用户玩游戏进行互动,以游戏的方式增强用户黏性,从而给主播增加一定的观看人数,并且使用户能够感受到强烈的参与感。
所以说,要想打购买在线直播源码并打造一款互动直播平台的话,不仅需要对其质量进行考察,还需要了解其中所包含的功能是否能够调动用户的活跃性和积极性。只有这样,才能增加平台的用户流量,最终实现变现目的。文章结尾给大家提个建议,购买源码还是要找专业的源码服务商才行。
本文声明原创,转载请注明出处及作者。
0
评论

直播平台开发搭建常见问题汇总 直播平台开发

q3557873521 发表了文章 • 168 次浏览 • 2019-04-23 16:00 • 来自相关话题

直播平台开发的重点在于功能设计,以及如何优化提升后期直播平台的用户直播体验,从整个直播平台开发到搭建部署、封装上架,有很多常见的问题是需要我们关注的。我们就来汇总整理下。
1.直播平台CDN是如何计费的?
三方CDN服务为直播平台内容的分发提供了可行性方案。但CDN费用如何计算经常困扰着运营方,尤其是刚刚接触直播平台开发项目的朋友。目前两种主流的CDN计费方式,一种是按照峰值计费,另一种则是按照流量计费。在后期的直播平台运营过程中,当在线用户较多时,建议采用峰值计费方式会更加经济实惠一些。
2.直播平台搭建部署需要准备哪些内容?
针对手机直播APP的搭建部署需要准备的内容主要有:APP名字,APP应用进场图,观看页图等,开通CDN服务,三方接口信息资料,合理的服务器配置,苹果App Store上架和安卓相关应用市场上架需要的内容资料等。
3.苹果开发者账号相关问题
申请苹果开发者账号,主要的目的是用于将应用上架到App Store供用户安装下载。目前苹果开发者账号主要有以下三种:
(1)企业开发者账号:企业账号开发的应用不能上架App Store,通常用于企业内部分发测试应用。申请费用299美元,现阶段来讲企业账号很难申请。需要提供公司的邓白氏编码。
(2)公司开发者账号:申请时需要填写公司的邓白氏编码,可以用来进行应用上架App Store,有条件的话尽量申请。
(3)个人开发者账号:个人开发者账号也可以进行上架,如果用作签名分发时会有设备数量限制,从字面意思看更适用于个人开发者,如果做APP运营推广,还是要申请公司账号。
4.打开直播APP源码用什么开发工具?
安卓端的开发工具:Android studio 
iOS端开发工具:xcode
5.服务器的系统该如何选择?
建议使用Linux 服务系统, CentOS 7.2 64位操作系统。通常直播平台搭建部署环境是支持LNMP或LAMP配置环境的。
6.什么是苹果UDID?
UDID是由子母和数字组成的40个字符串的序号,主要用来区分每一个唯一的iOS设备的标识,当使用个人签名进行应用分发下载时,需要提供设备的UDID给开发者。如果是企业签名分发下载则不需要UDID,而且没有设备数量限制。
7.直播平台开发广泛使用的流媒体协议有哪些? 
比较常见的如UDP私有协议,使用最为广泛的是RTMP协议,在手机网页端观看视频直播则更多地采用HLS传输协议。这些协议各有优劣势,适用的场景也各不相同。
8.直播平台中的 定位功能,跟附近的人功能有何区别?
绝大多数直播平台都具有“定位”功能和“附近的人”功能,二者是不同的。定位功能主要用于直播的个人信息中,显示主播的位置;附近的人功能,则是在主播列表中,用来显示主播和用户之间的距离。
以上这些问题都是大家在直播平台开发搭建运营时经常遇到的,搞清楚这些问题后,会使得整个开发过程更加顺畅。 查看全部
直播平台开发的重点在于功能设计,以及如何优化提升后期直播平台的用户直播体验,从整个直播平台开发到搭建部署、封装上架,有很多常见的问题是需要我们关注的。我们就来汇总整理下。
1.直播平台CDN是如何计费的?
三方CDN服务为直播平台内容的分发提供了可行性方案。但CDN费用如何计算经常困扰着运营方,尤其是刚刚接触直播平台开发项目的朋友。目前两种主流的CDN计费方式,一种是按照峰值计费,另一种则是按照流量计费。在后期的直播平台运营过程中,当在线用户较多时,建议采用峰值计费方式会更加经济实惠一些。
2.直播平台搭建部署需要准备哪些内容?
针对手机直播APP的搭建部署需要准备的内容主要有:APP名字,APP应用进场图,观看页图等,开通CDN服务,三方接口信息资料,合理的服务器配置,苹果App Store上架和安卓相关应用市场上架需要的内容资料等。
3.苹果开发者账号相关问题
申请苹果开发者账号,主要的目的是用于将应用上架到App Store供用户安装下载。目前苹果开发者账号主要有以下三种:
(1)企业开发者账号:企业账号开发的应用不能上架App Store,通常用于企业内部分发测试应用。申请费用299美元,现阶段来讲企业账号很难申请。需要提供公司的邓白氏编码。
(2)公司开发者账号:申请时需要填写公司的邓白氏编码,可以用来进行应用上架App Store,有条件的话尽量申请。
(3)个人开发者账号:个人开发者账号也可以进行上架,如果用作签名分发时会有设备数量限制,从字面意思看更适用于个人开发者,如果做APP运营推广,还是要申请公司账号。
4.打开直播APP源码用什么开发工具?
安卓端的开发工具:Android studio 
iOS端开发工具:xcode
5.服务器的系统该如何选择?
建议使用Linux 服务系统, CentOS 7.2 64位操作系统。通常直播平台搭建部署环境是支持LNMP或LAMP配置环境的。
6.什么是苹果UDID?
UDID是由子母和数字组成的40个字符串的序号,主要用来区分每一个唯一的iOS设备的标识,当使用个人签名进行应用分发下载时,需要提供设备的UDID给开发者。如果是企业签名分发下载则不需要UDID,而且没有设备数量限制。
7.直播平台开发广泛使用的流媒体协议有哪些? 
比较常见的如UDP私有协议,使用最为广泛的是RTMP协议,在手机网页端观看视频直播则更多地采用HLS传输协议。这些协议各有优劣势,适用的场景也各不相同。
8.直播平台中的 定位功能,跟附近的人功能有何区别?
绝大多数直播平台都具有“定位”功能和“附近的人”功能,二者是不同的。定位功能主要用于直播的个人信息中,显示主播的位置;附近的人功能,则是在主播列表中,用来显示主播和用户之间的距离。
以上这些问题都是大家在直播平台开发搭建运营时经常遇到的,搞清楚这些问题后,会使得整个开发过程更加顺畅。
0
评论

同一个网站,手机端跟电脑端显示不同是怎么实现的? 网站建设

jiyulin 发表了文章 • 178 次浏览 • 2019-04-23 12:49 • 来自相关话题

同一个网站,手机端跟电脑端不同是怎么实现的?

常见的方式有三种:

1,自适应网站

同一套代码,自动实现手机端和电脑端的布局自动调整。例如:openGPS.cn 网站现在大部分页面已经支持自适应展示,手机端电脑端都可以访问本站内容,正常阅读。自适应站点,往往是对CSS布局的重点考虑,本站使用的是BootStrap这个前端样式组件实现的自适应布局。

2,网站二级目录

这种是早期网站比较喜欢的做法,因为其实这是一个网站。早期网站往往是使用虚拟主机(也叫空间)发布,一个空间只能放一个网站,所以这种做法在早期特别流行。这种结构本质还是一个网站,但是针对手机电脑客户端单独做了往往对应的一套目录,例如:

电脑站点地址一般是:www.domain.com/xxxxxxx

手机站点地址往往是:www.domain.com/m/xxxxxxx

3,手机站点使用二级域名,电脑手机各一套2套站点代码


这种做法,工作量跟二级目录基本相似,严格来说代码量稍微多点。由于是2套代码,所以发布时候也得配备2套域名,不过要求两套站点连接同一个数据库来实现数据统一。例如:

电脑端网站域名是:www.domain.com

手机端网站域名是:m.domain.com




原文地址: https://www.opengps.cn/Blog/View.aspx?id=302 文章的更新编辑依此链接为准。欢迎关注源站原创文章!
  查看全部
同一个网站,手机端跟电脑端不同是怎么实现的?

常见的方式有三种:

1,自适应网站

同一套代码,自动实现手机端和电脑端的布局自动调整。例如:openGPS.cn 网站现在大部分页面已经支持自适应展示,手机端电脑端都可以访问本站内容,正常阅读。自适应站点,往往是对CSS布局的重点考虑,本站使用的是BootStrap这个前端样式组件实现的自适应布局。

2,网站二级目录

这种是早期网站比较喜欢的做法,因为其实这是一个网站。早期网站往往是使用虚拟主机(也叫空间)发布,一个空间只能放一个网站,所以这种做法在早期特别流行。这种结构本质还是一个网站,但是针对手机电脑客户端单独做了往往对应的一套目录,例如:

电脑站点地址一般是:www.domain.com/xxxxxxx

手机站点地址往往是:www.domain.com/m/xxxxxxx

3,手机站点使用二级域名,电脑手机各一套2套站点代码


这种做法,工作量跟二级目录基本相似,严格来说代码量稍微多点。由于是2套代码,所以发布时候也得配备2套域名,不过要求两套站点连接同一个数据库来实现数据统一。例如:

电脑端网站域名是:www.domain.com

手机端网站域名是:m.domain.com




原文地址: https://www.opengps.cn/Blog/View.aspx?id=302 文章的更新编辑依此链接为准。欢迎关注源站原创文章!
 
1
回复

环信的百度地图只有定位,无法像微信这样导航 地图 环信_Android

lizg 回复了问题 • 2 人关注 • 379 次浏览 • 2019-04-22 17:19 • 来自相关话题

2
回复

求助,环信即时云通讯在华为mate20报java.lang.RuntimeException的错误。 环信_Android

lizg 回复了问题 • 2 人关注 • 1239 次浏览 • 2019-04-15 16:18 • 来自相关话题

1
回复

java如何将聊天信息保存至数据库,数据格式表字段是什么,如何接入到java后端? 环信 ios 商务问题 环信_Android

lizg 回复了问题 • 2 人关注 • 548 次浏览 • 2019-04-12 18:29 • 来自相关话题

1
回复

环信 小程序自定义消息发送 自定义消息 小程序

lizg 回复了问题 • 2 人关注 • 530 次浏览 • 2019-04-12 18:02 • 来自相关话题

4
最佳

JAVA服务端获取聊天记录,调用ChatMessageAPI的exportChatMessages方法出错 环信_管理后台 环信_RestAPI

su酥酥 回复了问题 • 2 人关注 • 1858 次浏览 • 2019-04-11 17:52 • 来自相关话题

1
回复

ios头像昵称通过从消息扩展中获取昵称和头像 环信 iOS集成 iOS环信聊天 iOS环信扩展 环信_iOS

kijieoeew 回复了问题 • 2 人关注 • 458 次浏览 • 2019-04-10 17:02 • 来自相关话题

1
回复
1
回复

安卓注册失败提示 环信_Android

lizg 回复了问题 • 2 人关注 • 479 次浏览 • 2019-04-09 17:29 • 来自相关话题

1
回复
0
评论

(客服云)iOS访客端集成常见问题(非报错) 客服云

kijieoeew 发表了文章 • 334 次浏览 • 2019-04-08 10:27 • 来自相关话题

1、UI上很多地方显示英文,比如聊天页面的工具栏




把客服demo中配置的国际化文件添加到您自己的工程中。拖之前要打开国际化文件,全部选中这三个,再进行拖入。




 
2、进入聊天页面没有加载聊天记录
这种情况一般出现在只使用了 HDMessageViewController 没有使用 HDChatViewController 的时候
在HDMessageViewController 的 viewDidLoad 方法中, 将 [self tableViewDidTriggerHeaderRefresh]; 的注释打开,再在这之前
加上 self.showRefreshHeader = YES; 这句代码
 
3、发送表情却显示字符串




把下面这段代码添加到appdelegate中就可以了
[[HDEmotionEscape sharedInstance] setEaseEmotionEscapePattern:@"\\[[^\\[\\]]{1,3}\\]"];
[[HDEmotionEscape sharedInstance] setEaseEmotionEscapeDictionary:[HDConvertToCommonEmoticonsHelper emotionsDictionary]];
 
4、客服能收到访客的消息,访客收不到客服的消息
(1)客服和im同时使用的话,初始化sdk、登录、登出用的是im的api会出现这种情况。必须使用客服的api。
(2)IM sdk升级为客服sdk,不兼容导致的,这种情况可以线上发起会话咨询。
     
5、发送的消息,出现在聊天页面的左侧
一般是由于当前访客没有登录或者登录失败,断点仔细检查下。 查看全部
1、UI上很多地方显示英文,比如聊天页面的工具栏
显示英文1.png

把客服demo中配置的国际化文件添加到您自己的工程中。拖之前要打开国际化文件,全部选中这三个,再进行拖入。
显示英文2.png

 
2、进入聊天页面没有加载聊天记录
这种情况一般出现在只使用了 HDMessageViewController 没有使用 HDChatViewController 的时候
在HDMessageViewController 的 viewDidLoad 方法中, 将 [self tableViewDidTriggerHeaderRefresh]; 的注释打开,再在这之前
加上 self.showRefreshHeader = YES; 这句代码
 
3、发送表情却显示字符串
访客端表情符号.png

把下面这段代码添加到appdelegate中就可以了
[[HDEmotionEscape sharedInstance] setEaseEmotionEscapePattern:@"\\[[^\\[\\]]{1,3}\\]"];
[[HDEmotionEscape sharedInstance] setEaseEmotionEscapeDictionary:[HDConvertToCommonEmoticonsHelper emotionsDictionary]];
 
4、客服能收到访客的消息,访客收不到客服的消息
(1)客服和im同时使用的话,初始化sdk、登录、登出用的是im的api会出现这种情况。必须使用客服的api。
(2)IM sdk升级为客服sdk,不兼容导致的,这种情况可以线上发起会话咨询。
     
5、发送的消息,出现在聊天页面的左侧
一般是由于当前访客没有登录或者登录失败,断点仔细检查下。
2
最佳

会话列表如何刷新。 环信 iOS集成 环信 ios iOS环信聊天 环信_iOS

kijieoeew 回复了问题 • 2 人关注 • 515 次浏览 • 2019-04-03 18:08 • 来自相关话题

22
回复

ld: library not found for -lopencore-amrnb 环信_iOS

123_f 回复了问题 • 4 人关注 • 775 次浏览 • 2019-04-03 15:09 • 来自相关话题

1
回复

环信小程序向陌生人发起聊天信息 陌生人聊天

lizg 回复了问题 • 2 人关注 • 609 次浏览 • 2019-04-02 18:29 • 来自相关话题

0
评论

(客服云)iOS访客端集成常见报错(总有一款适合你) iOS访客端 报错集锦 客服云

kijieoeew 发表了文章 • 484 次浏览 • 2019-04-02 17:02 • 来自相关话题

注意:向自己工程中添加环信SDK和UI文件的时候,不要直接向xcode中拖拽添加,先把SDK和UI文件粘贴到自己工程的finder目录中,再从finder中向xcode中拖拽添加,避免出现找不到SDK或者UI文件的情况。
 
1、如果工程中引入的是不带音视频版本的sdk:HyphenateLite.framework和HelpDeskLite.framework,#import <HelpDeskLite/HelpDeskLite.h> 头文件报错的话,那么把HDMessage.h中的#import <Hyphenate/Hyphenate.h>改成#import <HyphenateLite/HyphenateLite.h>即可(HDMessage.h 用xcode全局搜索不到,需要到sdk里面去找)。
 
2、很多同学在首次“导入SDK”或“更新SDK重新导入SDK”后,Xcode运行报以下的error:
dyld: Library not loaded: @rpath/Hyphenate.framework/Hyphenate
  Referenced from: /Users/shenchong/Library/Developer/CoreSimulator/Devices/C768FE68-6E79-40C8-8AD1-FFFC434D51A9/data/Containers/Bundle/Application/41EA9A48-4DD5-4AA4-AB3F-139CFE036532/CallBackTest.app/CallBackTest
  Reason: image not found
       这个原因是工程未加载到 framework,正确的处理方式是在TARGETS → General → Embedded Binaries 中添加HelpDesk.framework和Hyphenate.framework依赖库,且 Linked Frameworks and Libraries中依赖库的Status必须是Required。




 
3、运行之后,自变量为nil,这就有可能是因为上面所说的依赖库的status设置为了Optional,需要改成Required。




 
4、打包后上传到appstore报错
(1)ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/toy.app/HelpDeskUIResource.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."
方法:把HelpDeskUIResource.bundle里的Info.plist删掉就即可。




(2)This bundle is invalid. The value for key CFBundleShortVersionString ‘1.2.2.1’in the Info.plist must be a period-separated list of at most three non-negative integers. 




把sdk里的plist文件的版本号改成3位数即可




(3)Invalid Mach-O Format.The Mach-O in bundle “SMYG.app/Frameworks/Hyphenate.framework” isn’t consistent with the Mach-O in the main bundle.The main bundle Mach-O contains armv7(bitcode) and arm64(bitcode),while the nested bundle Mach-O contains armv7(machine code) and arm64(machine code).Verify that all of the targets for a platform have a consistent value for the ENABLE_BITCODE build setting.”




将TARGETS-Build Settings-Enable Bitcode改为NO




(4)还有很多同学打包失败,看不出什么原因




那么可以先看看有没有按照文档剔除x86_64 i386两个平台
文档链接:http://docs.easemob.com/cs/300visitoraccess/iossdk#%E4%B8%8A%E4%BC%A0appstore%E4%BB%A5%E5%8F%8A%E6%89%93%E5%8C%85ipa%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9
 
5、那么剔除x86_64 i386时会遇到can't open input file的错误,这是因为cd的路径错误,把“/HelpDesk.framework”删掉。是cd到framework所在的路径,不是cd到framework




 
6、下图中的报错,需要在pch文件添加如下判断,环信的和自己的头文件都引入到#ifdef内部
   #ifdef __OBJC__
   #endif








 
7、集成环信HelpDeskUI的时候,由于HelpDeskUI内部使用了第三方库,如果与开发者第三方库产生冲突,可将HelpDeskUI中冲突的第三方库删除,如果第三方库中的接口有升级的部分,请酌情进行升级。




 
8、集成1.2.2版本demo中的HelpDeskUI,Masonry报错:Passing ‘CGFloat’(aka ‘double’) to parameter of incompatible type ‘__strong id’
需要在pch中添加#define MAS_SHORTHAND_GLOBALS 查看全部
注意:向自己工程中添加环信SDK和UI文件的时候,不要直接向xcode中拖拽添加,先把SDK和UI文件粘贴到自己工程的finder目录中,再从finder中向xcode中拖拽添加,避免出现找不到SDK或者UI文件的情况。
 
1、如果工程中引入的是不带音视频版本的sdk:HyphenateLite.framework和HelpDeskLite.framework,#import <HelpDeskLite/HelpDeskLite.h> 头文件报错的话,那么把HDMessage.h中的#import <Hyphenate/Hyphenate.h>改成#import <HyphenateLite/HyphenateLite.h>即可(HDMessage.h 用xcode全局搜索不到,需要到sdk里面去找)。
 
2、很多同学在首次“导入SDK”或“更新SDK重新导入SDK”后,Xcode运行报以下的error:
dyld: Library not loaded: @rpath/Hyphenate.framework/Hyphenate
  Referenced from: /Users/shenchong/Library/Developer/CoreSimulator/Devices/C768FE68-6E79-40C8-8AD1-FFFC434D51A9/data/Containers/Bundle/Application/41EA9A48-4DD5-4AA4-AB3F-139CFE036532/CallBackTest.app/CallBackTest
  Reason: image not found
       这个原因是工程未加载到 framework,正确的处理方式是在TARGETS → General → Embedded Binaries 中添加HelpDesk.framework和Hyphenate.framework依赖库,且 Linked Frameworks and Libraries中依赖库的Status必须是Required。
1访客端_image_not_found.png

 
3、运行之后,自变量为nil,这就有可能是因为上面所说的依赖库的status设置为了Optional,需要改成Required。
2访客端自变量为nil.png

 
4、打包后上传到appstore报错
(1)ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/toy.app/HelpDeskUIResource.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."
方法:把HelpDeskUIResource.bundle里的Info.plist删掉就即可。
3访客端打包90535.png

(2)This bundle is invalid. The value for key CFBundleShortVersionString ‘1.2.2.1’in the Info.plist must be a period-separated list of at most three non-negative integers. 
4访客端打包90060.png

把sdk里的plist文件的版本号改成3位数即可
5访客端打包1.2_.2_.1位置_.png

(3)Invalid Mach-O Format.The Mach-O in bundle “SMYG.app/Frameworks/Hyphenate.framework” isn’t consistent with the Mach-O in the main bundle.The main bundle Mach-O contains armv7(bitcode) and arm64(bitcode),while the nested bundle Mach-O contains armv7(machine code) and arm64(machine code).Verify that all of the targets for a platform have a consistent value for the ENABLE_BITCODE build setting.”
6访客端打包90636.png

将TARGETS-Build Settings-Enable Bitcode改为NO
7访客端打包bitcode改为NO.png

(4)还有很多同学打包失败,看不出什么原因
8访客端打包需剔除.png

那么可以先看看有没有按照文档剔除x86_64 i386两个平台
文档链接:http://docs.easemob.com/cs/300visitoraccess/iossdk#%E4%B8%8A%E4%BC%A0appstore%E4%BB%A5%E5%8F%8A%E6%89%93%E5%8C%85ipa%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9
 
5、那么剔除x86_64 i386时会遇到can't open input file的错误,这是因为cd的路径错误,把“/HelpDesk.framework”删掉。是cd到framework所在的路径,不是cd到framework
9访客端剔除cd错误.png

 
6、下图中的报错,需要在pch文件添加如下判断,环信的和自己的头文件都引入到#ifdef内部
   #ifdef __OBJC__
   #endif
10pch加判断1.png

11pch加判断2.png

 
7、集成环信HelpDeskUI的时候,由于HelpDeskUI内部使用了第三方库,如果与开发者第三方库产生冲突,可将HelpDeskUI中冲突的第三方库删除,如果第三方库中的接口有升级的部分,请酌情进行升级。
12第三方库冲突.png

 
8、集成1.2.2版本demo中的HelpDeskUI,Masonry报错:Passing ‘CGFloat’(aka ‘double’) to parameter of incompatible type ‘__strong id’
需要在pch中添加#define MAS_SHORTHAND_GLOBALS
13访客端Masonry报错.png
0
评论

(客服云)iOS访客端怎么判断会话是否结束 客服云 会话是否结束

kijieoeew 发表了文章 • 293 次浏览 • 2019-04-02 15:47 • 来自相关话题

1、联系商务开通【会话创建、接起、结束】功能
2、在 cmdMessagesDidReceive 方法中做如下判断,返回ServiceSessionClosedEvent,则是会话已结束,如图:




代码:
if ([message.body isKindOfClass:[EMCmdMessageBody class]]) {
EMCmdMessageBody *_bb = (EMCmdMessageBody *)message.body;
if ([_bb.action isEqualToString:@"ServiceSessionCreatedEvent"]) {
NSLog(@"hhhhh--Creat");
} else if ([_bb.action isEqualToString:@"ServiceSessionOpenedEvent"]) {
NSLog(@"hhhhh--Open");
} else if ([_bb.action isEqualToString:@"ServiceSessionClosedEvent"]) {
NSLog(@"hhhhh--Close");
}
}
  查看全部
1、联系商务开通【会话创建、接起、结束】功能
2、在 cmdMessagesDidReceive 方法中做如下判断,返回ServiceSessionClosedEvent,则是会话已结束,如图:
判断会话是否结束.png

代码:
if ([message.body isKindOfClass:[EMCmdMessageBody class]]) {
EMCmdMessageBody *_bb = (EMCmdMessageBody *)message.body;
if ([_bb.action isEqualToString:@"ServiceSessionCreatedEvent"]) {
NSLog(@"hhhhh--Creat");
} else if ([_bb.action isEqualToString:@"ServiceSessionOpenedEvent"]) {
NSLog(@"hhhhh--Open");
} else if ([_bb.action isEqualToString:@"ServiceSessionClosedEvent"]) {
NSLog(@"hhhhh--Close");
}
}
 
0
评论

(客服云)iOS访客端点击订单消息 访客订单消息 客服云

kijieoeew 发表了文章 • 258 次浏览 • 2019-03-29 18:01 • 来自相关话题

1、在HDMessageCell.m 的
- (void)_setupSubviewsWithType:(EMMessageBodyType)messageType
                      isSender:(BOOL)isSender
                         model:(id<HDIMessageModel>)model
方法中给orderBgView 添加手势



UITapGestureRecognizer *tapRecognizer3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(orderImageViewTapAction:)];
[_bubbleView.orderBgView addGestureRecognizer:tapRecognizer3]; 
2、在HDMessageCell.m 中添加手势点击事件



- (void)orderImageViewTapAction:(UITapGestureRecognizer *)tapRecognizer
{
if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
[_delegate messageCellSelected:_model];
}

3、在HDMessageViewController的 
   - (void)messageCellSelected:(id<HDIMessageModel>)model 方法中添加订单消息的判断



代码:
if ([HDMessageHelper getMessageExtType:model.message] == HDExtOrderMsg) {
// 订单消息携带的扩展
NSDictionary *dic = model.message.ext;
NSLog(@"点击了订单消息");
} 查看全部
1、在HDMessageCell.m 的
- (void)_setupSubviewsWithType:(EMMessageBodyType)messageType
                      isSender:(BOOL)isSender
                         model:(id<HDIMessageModel>)model
方法中给orderBgView 添加手势
点击订单消息1.png
UITapGestureRecognizer *tapRecognizer3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(orderImageViewTapAction:)];
[_bubbleView.orderBgView addGestureRecognizer:tapRecognizer3];
 
2、在HDMessageCell.m 中添加手势点击事件
点击订单消息2.png
- (void)orderImageViewTapAction:(UITapGestureRecognizer *)tapRecognizer
{
if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
[_delegate messageCellSelected:_model];
}
}
 
3、在HDMessageViewController的 
   - (void)messageCellSelected:(id<HDIMessageModel>)model 方法中添加订单消息的判断
点击订单消息3.png
代码:
if ([HDMessageHelper getMessageExtType:model.message] == HDExtOrderMsg) {
// 订单消息携带的扩展
NSDictionary *dic = model.message.ext;
NSLog(@"点击了订单消息");
}
0
评论

(客服云)IOS访客端设置访客昵称头像 访客昵称头像 昵称头像 客服云

kijieoeew 发表了文章 • 319 次浏览 • 2019-03-29 18:01 • 来自相关话题

1.在HDMessageViewController.h 中添加访客昵称、头像的属性



// 访客昵称
@property (nonatomic, strong) NSString *sendName;
// 访客头像(url)
@property (nonatomic, strong) NSString *sendAvatarUrl;
// 访客头像(本地图片)
@property (nonatomic, strong) UIImage *sendAvatarImage; 
2.在HDMessageViewController.m   - (NSArray *)formatMessages:(NSArray *)messages 方法中添加判断



if (isSender) {
if (self.sendName) {
model.nickname = self.sendName;
}
// 加载网络头像
if (self.sendAvatarUrl) {
model.avatarURLPath = self.sendAvatarUrl;
}
// 加载本地头像
if (self.sendAvatarImage) {
model.avatarImage = self.sendAvatarImage;
model.avatarURLPath = nil;
}

3.在初始化聊天页面的时候,传入访客的昵称、头像即可。
(可选择url或者本地头像图片)



ctrl.sendName = @"访客昵称";
ctrl.sendAvatarImage = [UIImage imageNamed:@"测试图片"];
// chat.sendAvatarUrl = @""; 查看全部
1.在HDMessageViewController.h 中添加访客昵称、头像的属性
1.png
// 访客昵称
@property (nonatomic, strong) NSString *sendName;
// 访客头像(url)
@property (nonatomic, strong) NSString *sendAvatarUrl;
// 访客头像(本地图片)
@property (nonatomic, strong) UIImage *sendAvatarImage;
 
2.在HDMessageViewController.m   - (NSArray *)formatMessages:(NSArray *)messages 方法中添加判断
2.png
if (isSender) {
if (self.sendName) {
model.nickname = self.sendName;
}
// 加载网络头像
if (self.sendAvatarUrl) {
model.avatarURLPath = self.sendAvatarUrl;
}
// 加载本地头像
if (self.sendAvatarImage) {
model.avatarImage = self.sendAvatarImage;
model.avatarURLPath = nil;
}
}
 
3.在初始化聊天页面的时候,传入访客的昵称、头像即可。
(可选择url或者本地头像图片)
3.png
ctrl.sendName = @"访客昵称";
ctrl.sendAvatarImage = [UIImage imageNamed:@"测试图片"];
// chat.sendAvatarUrl = @"";
0
评论

(客服云)iOS访客端设置客服系统头像 昵称头像 客服系统头像 客服云

kijieoeew 发表了文章 • 294 次浏览 • 2019-03-29 18:01 • 来自相关话题

0、在客服系统内 管理员模式--设置--企业基本信息 处上传企业logo
   在 管理员模式--设置--系统开关--系统开关--访客端显示客服昵称 处打开开关









1、在HDIMessageModel.h 中添加客服系统头像url属性



@property (strong, nonatomic) NSString *officialAccountURL; 
2、在HDMessageModel.h 中添加客服系统头像url属性



@property (strong, nonatomic) NSString *officialAccountURL; 
3、在HDMessageModel.m类  - (instancetype)initWitMessage:(HDMessage *)message方法中添加  



NSDictionary *officialAccount = [NSDictionary dictionary];
if ([weichat objectForKey:@"official_account"]) {
officialAccount = [weichat valueForKey:@"official_account"];
if ([officialAccount objectForKey:@"img"]) {
self.officialAccountURL = [[@"https:" stringByAppendingString:[officialAccount objectForKey:@"img"]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

4、在HDBaseMessageCell.m类  - (void)setModel:(id<HDIMessageModel>)model方法中 修改代码 
(“系统消息”改成您自己客服系统中设置的调度员昵称)



if (model.avatarURLPath) {
if (model.nickname) {
if ([model.nickname isEqualToString:@"系统消息"]) {
if (model.officialAccountURL) {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.officialAccountURL] placeholderImage:model.avatarImage];
}
} else {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
}
}

} else {
self.avatarView.image = model.avatarImage;
} 查看全部
0、在客服系统内 管理员模式--设置--企业基本信息 处上传企业logo
   在 管理员模式--设置--系统开关--系统开关--访客端显示客服昵称 处打开开关
客服系统头像1.png

客服系统头像2.png


1、在HDIMessageModel.h 中添加客服系统头像url属性
客服系统头像3.png
@property (strong, nonatomic) NSString *officialAccountURL;
 
2、在HDMessageModel.h 中添加客服系统头像url属性
客服系统头像4.png
@property (strong, nonatomic) NSString *officialAccountURL;
 
3、在HDMessageModel.m类  - (instancetype)initWitMessage:(HDMessage *)message方法中添加  
客服系统头像5.png
NSDictionary *officialAccount = [NSDictionary dictionary];
if ([weichat objectForKey:@"official_account"]) {
officialAccount = [weichat valueForKey:@"official_account"];
if ([officialAccount objectForKey:@"img"]) {
self.officialAccountURL = [[@"https:" stringByAppendingString:[officialAccount objectForKey:@"img"]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
}
 
4、在HDBaseMessageCell.m类  - (void)setModel:(id<HDIMessageModel>)model方法中 修改代码 
(“系统消息”改成您自己客服系统中设置的调度员昵称)
客服系统头像6.png
if (model.avatarURLPath) {
if (model.nickname) {
if ([model.nickname isEqualToString:@"系统消息"]) {
if (model.officialAccountURL) {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.officialAccountURL] placeholderImage:model.avatarImage];
}
} else {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
}
}

} else {
self.avatarView.image = model.avatarImage;
}
1
评论

(客服云)iOS访客端获取机器人欢迎语 机器人欢迎语 客服云

kijieoeew 发表了文章 • 338 次浏览 • 2019-03-29 18:01 • 来自相关话题

注意:
0、代码中有两个拼接的url显示不全,我在评论有补充。
1、此文档只支持获取单机器人的欢迎语,多机器人会获取第一个机器人的欢迎语。
2、此文档暂不支持获取多媒体和图文消息类型的机器人欢迎语。
3、老版机器人与新版机器人集成方法不同,集成前需区分好。








 
一、先到客服系统配置机器人欢迎语
1、老版机器人设置方案:
管理员模式--智能机器人--机器人设置--自动回复--欢迎语,开启开关并添加欢迎语




2、新版(企业版)机器人设置方案:
(1)管理员模式--智能机器人--机器人设置--基础设置,点击“机器人管理”跳转到机器人管理页面
(2)机器人设置--自动回复--欢迎语,开启开关并添加欢迎语




 
二、iOS端获取、解析机器人欢迎语
在HDMessageViewController.m类的 -(void)viewDidLoad 方法最后调用robotWelcome或者newRobotWelcome 方法即可。其余客户端插入消息的逻辑自行处理//获取老版机器人欢迎语
- (void)robotWelcome
{
// kDefaultTenantId:租户id
// kDefaultCustomerName:IM服务号
NSString *urlStr = [NSString stringWithFormat:@"https://kefu.easemob.com/v1/Te ... ot%3B, kDefaultTenantId];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//异步链接(形式1,较少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 解析
NSString *result =[[ NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//同样的可以替换字符
NSLog(@"result-----%@", result);
NSString *str = [result stringByReplacingOccurrencesOfString:@"&quot;" withString:@"\""];
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"\"{" withString:@"{"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"}\"" withString:@"}"];
// JSON字符串转字典
NSDictionary *dic = [self dictionaryWithJsonString:str2];
// 取消息的ext
NSLog(@"dic---%@",dic);

NSString *robotText = nil;
NSDictionary *dicExt = [NSDictionary dictionary];
if ([[dic objectForKey:@"greetingText"] isKindOfClass:[NSString class]]) {

robotText = [dic objectForKey:@"greetingText"];
} else {
dicExt = [[dic objectForKey:@"greetingText"] objectForKey:@"ext"];
}

//构建消息
EMTextMessageBody *bdy = [[EMTextMessageBody alloc] initWithText:robotText];
NSString *from = [[HDClient sharedClient] currentUsername];
HDMessage *message = [[HDMessage alloc] initWithConversationID:kDefaultCustomerName from:from to:kDefaultCustomerName body:bdy];
message.ext = dicExt;
message.direction = 1;
message.status = HDMessageStatusSuccessed;
// 消息添加到UI
[self addMessageToDataSource:message progress:nil];
// 消息插入到会话
HDError *pError;
[self.conversation addMessage:message error:&pError];
}];
}


//获取新版(企业版)机器人欢迎语
- (void)newRobotWelcome
{
[[HDClient sharedClient] accessToken];
// 以下信息换成自己的
// kDefaultTenantId:租户id
// kDefaultOrgName:appkey中#的前半部分
// kDefaultAppName:appkey中#的后半部分
// kDefaultCustomerName:IM服务号
NSString *imToken = [HDClient sharedClient].accessToken;
NSString *urlStr = [NSString stringWithFormat:@"https://kefu.easemob.com/v1/we ... ot%3B,kDefaultTenantId, kDefaultOrgName, kDefaultAppName, kDefaultCustomerName, imToken];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"newStr---%@", newStr);
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//异步链接(形式1,较少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 解析
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//同样的可以替换字符
NSString *str = [result stringByReplacingOccurrencesOfString:@"&amp;quot;" withString:@"\""];
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"\"{" withString:@"{"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"}\"" withString:@"}"];
// JSON字符串转字典
NSDictionary *dic = [self dictionaryWithJsonString:str2];
// 取消息的ext
NSString *robotText = nil;
NSDictionary *dicExt = [NSDictionary dictionary];
if ([[[dic objectForKey:@"entity"] objectForKey:@"greetingText"] isKindOfClass:[NSString class]]) {
robotText = [[dic objectForKey:@"entity"] objectForKey:@"greetingText"];
} else {
dicExt = [[[dic objectForKey:@"entity"] objectForKey:@"greetingText"] objectForKey:@"ext"];
}
//构建消息
NSLog(@"dicExt---%@",dicExt);
EMTextMessageBody *bdy = [[EMTextMessageBody alloc] initWithText:robotText];
NSString *from = [[HDClient sharedClient] currentUsername];

HDMessage *message = [[HDMessage alloc] initWithConversationID:kDefaultCustomerName from:from to:kDefaultCustomerName body:bdy];
message.ext = dicExt;
message.direction = 1;
message.status = HDMessageStatusSuccessed;
// 消息添加到UI
[self addMessageToDataSource:message progress:nil];
// 消息插入到会话
HDError *pError;
[self.conversation addMessage:message error:&pError];
}];
}

// JSON字符串转化为字典
- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
{
if (jsonString == nil) {
return nil;
}
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err)
{
NSLog(@"json解析失败:%@",err);
return nil;
}
return dic;
} 查看全部
注意:
0、代码中有两个拼接的url显示不全,我在评论有补充。
1、此文档只支持获取单机器人的欢迎语,多机器人会获取第一个机器人的欢迎语。
2、此文档暂不支持获取多媒体和图文消息类型的机器人欢迎语。
3、老版机器人与新版机器人集成方法不同,集成前需区分好。
机器人欢迎语1.png

机器人欢迎语2.png

 
一、先到客服系统配置机器人欢迎语
1、老版机器人设置方案:
管理员模式--智能机器人--机器人设置--自动回复--欢迎语,开启开关并添加欢迎语
机器人欢迎语3.png

2、新版(企业版)机器人设置方案:
(1)管理员模式--智能机器人--机器人设置--基础设置,点击“机器人管理”跳转到机器人管理页面
(2)机器人设置--自动回复--欢迎语,开启开关并添加欢迎语
机器人欢迎语4.png

 
二、iOS端获取、解析机器人欢迎语
在HDMessageViewController.m类的 -(void)viewDidLoad 方法最后调用robotWelcome或者newRobotWelcome 方法即可。其余客户端插入消息的逻辑自行处理
//获取老版机器人欢迎语
- (void)robotWelcome
{
// kDefaultTenantId:租户id
// kDefaultCustomerName:IM服务号
NSString *urlStr = [NSString stringWithFormat:@"https://kefu.easemob.com/v1/Te ... ot%3B, kDefaultTenantId];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//异步链接(形式1,较少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 解析
NSString *result =[[ NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//同样的可以替换字符
NSLog(@"result-----%@", result);
NSString *str = [result stringByReplacingOccurrencesOfString:@"&quot;" withString:@"\""];
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"\"{" withString:@"{"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"}\"" withString:@"}"];
// JSON字符串转字典
NSDictionary *dic = [self dictionaryWithJsonString:str2];
// 取消息的ext
NSLog(@"dic---%@",dic);

NSString *robotText = nil;
NSDictionary *dicExt = [NSDictionary dictionary];
if ([[dic objectForKey:@"greetingText"] isKindOfClass:[NSString class]]) {

robotText = [dic objectForKey:@"greetingText"];
} else {
dicExt = [[dic objectForKey:@"greetingText"] objectForKey:@"ext"];
}

//构建消息
EMTextMessageBody *bdy = [[EMTextMessageBody alloc] initWithText:robotText];
NSString *from = [[HDClient sharedClient] currentUsername];
HDMessage *message = [[HDMessage alloc] initWithConversationID:kDefaultCustomerName from:from to:kDefaultCustomerName body:bdy];
message.ext = dicExt;
message.direction = 1;
message.status = HDMessageStatusSuccessed;
// 消息添加到UI
[self addMessageToDataSource:message progress:nil];
// 消息插入到会话
HDError *pError;
[self.conversation addMessage:message error:&pError];
}];
}


//获取新版(企业版)机器人欢迎语
- (void)newRobotWelcome
{
[[HDClient sharedClient] accessToken];
// 以下信息换成自己的
// kDefaultTenantId:租户id
// kDefaultOrgName:appkey中#的前半部分
// kDefaultAppName:appkey中#的后半部分
// kDefaultCustomerName:IM服务号
NSString *imToken = [HDClient sharedClient].accessToken;
NSString *urlStr = [NSString stringWithFormat:@"https://kefu.easemob.com/v1/we ... ot%3B,kDefaultTenantId, kDefaultOrgName, kDefaultAppName, kDefaultCustomerName, imToken];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"newStr---%@", newStr);
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//异步链接(形式1,较少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 解析
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//同样的可以替换字符
NSString *str = [result stringByReplacingOccurrencesOfString:@"&amp;quot;" withString:@"\""];
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"\"{" withString:@"{"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"}\"" withString:@"}"];
// JSON字符串转字典
NSDictionary *dic = [self dictionaryWithJsonString:str2];
// 取消息的ext
NSString *robotText = nil;
NSDictionary *dicExt = [NSDictionary dictionary];
if ([[[dic objectForKey:@"entity"] objectForKey:@"greetingText"] isKindOfClass:[NSString class]]) {
robotText = [[dic objectForKey:@"entity"] objectForKey:@"greetingText"];
} else {
dicExt = [[[dic objectForKey:@"entity"] objectForKey:@"greetingText"] objectForKey:@"ext"];
}
//构建消息
NSLog(@"dicExt---%@",dicExt);
EMTextMessageBody *bdy = [[EMTextMessageBody alloc] initWithText:robotText];
NSString *from = [[HDClient sharedClient] currentUsername];

HDMessage *message = [[HDMessage alloc] initWithConversationID:kDefaultCustomerName from:from to:kDefaultCustomerName body:bdy];
message.ext = dicExt;
message.direction = 1;
message.status = HDMessageStatusSuccessed;
// 消息添加到UI
[self addMessageToDataSource:message progress:nil];
// 消息插入到会话
HDError *pError;
[self.conversation addMessage:message error:&pError];
}];
}

// JSON字符串转化为字典
- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
{
if (jsonString == nil) {
return nil;
}
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err)
{
NSLog(@"json解析失败:%@",err);
return nil;
}
return dic;
}

0
评论

客服满意度评价设置 客服满意度评价设置

lizg 发表了文章 • 292 次浏览 • 2019-03-29 17:29 • 来自相关话题

1、怎么设置会话结束时自动发送评价邀请
    管理员模式­----­­设置­­­----满意度评价邀请设置 第一项:会话结束自动发送满意度评价邀请,勾选需要设置的访客渠道

2、访客是否能多次评价
   访客的评价次数是不限制的,但是可以设置客服后台统计的评为为第一次还是最后一次,可以在管理员模式­----­­设置­­­----  满意度评价邀请设置 第三项:多次满意度评价只取第一次
3、系统结束的会话是否自动发送满意度评价
  管理员模式­----­­设置­­­----满意度评价邀请设置  开关打开时,因访客超时未回复、不活跃超时而自动结束的会话,系统不会自动推送满意度评价

4、如何设置满意度邀请提示语
管理员模式­----­­设置­­­----满意度评价邀请设置  第6项

  查看全部

1、怎么设置会话结束时自动发送评价邀请
    管理员模式­----­­设置­­­----满意度评价邀请设置 第一项:会话结束自动发送满意度评价邀请,勾选需要设置的访客渠道

2、访客是否能多次评价
   访客的评价次数是不限制的,但是可以设置客服后台统计的评为为第一次还是最后一次,可以在管理员模式­----­­设置­­­----  满意度评价邀请设置 第三项:多次满意度评价只取第一次
3、系统结束的会话是否自动发送满意度评价
  管理员模式­----­­设置­­­----满意度评价邀请设置  开关打开时,因访客超时未回复、不活跃超时而自动结束的会话,系统不会自动推送满意度评价

4、如何设置满意度邀请提示语
管理员模式­----­­设置­­­----满意度评价邀请设置  第6项

 
0
评论

android客服云如何获取机器人欢迎语 环信机器人欢迎语

lizg 发表了文章 • 266 次浏览 • 2019-03-29 15:50 • 来自相关话题

1.APP端要想获取到机器人菜单欢迎语,首先在移动客服管理员模式下,智能机器人,机器人设置——自动回复——欢迎语配置菜单欢迎语或者是欢迎语消息。
2、在会话分配规则中,渠道指定一定要指定机器人,APP端才能获取到机器人欢迎语,否则获取不到
具体的代码如下附件
图1中的
MyApplication.tenantId记得替换为自己的tenantId
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        HttpClient httpClient = new DefaultHttpClient();
                        HttpGet httpGet = new HttpGet("http://kefu.easemob.com/v1/Ten ... 6quot;);
                        try {
                            HttpResponse response = httpClient.execute(httpGet);
                            int code = response.getStatusLine().getStatusCode();
                            if (code == 200) {
                                final String rev  = EntityUtils.toString(response.getEntity());

                                JSONObject obj = new JSONObject(rev);
                                int type = obj.getInt("greetingTextType");
                                final String rob_welcome = obj.getString("greetingText");
                                //type为0代表是文字消息的机器人欢迎语
                                //type为1代表是菜单消息的机器人欢迎语
                                if(type == 0){
                                    //把解析拿到的string保存在本地
                                    shareUtil.saveRobot(rob_welcome);
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(getApplicationContext(),"rob_welcome="+rob_welcome,Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                }else if(type == 1){
                                    final String str = rob_welcome.replaceAll("&quot;","\"");
                                    JSONObject json = new JSONObject(str);
                                    JSONObject ext = json.getJSONObject("ext");
                                    final JSONObject msgtype = ext.getJSONObject("msgtype");
                                    //把解析拿到的string保存在本地
                                    shareUtil.saveRobot(msgtype.toString());
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(getApplicationContext(),"rob_welcome="+msgtype,Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                }

                            }
                        }catch(final Exception e){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),"exception="+e.getMessage(),Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();


图2中的:
//创建消息插入本地
            Message message = Message.createReceiveMessage(Message.Type.TXT);
            //从本地获取保存的string
            String str = shareUtil.getRobot();
            EMTextMessageBody body = null;
            //判断是否是菜单消息的string,这是自己实现的一个方法
            if(!isRobotMenu(str)){
                //文字消息直接去设置给消息
            body = new EMTextMessageBody(str);
            }else{
                //菜单消息需要设置给消息扩展
                try{
                    body = new EMTextMessageBody("");
                    JSONObject msgtype = new JSONObject(str);
                    message.setAttribute("msgtype",msgtype);
                }catch (Exception e){
                    Toast.makeText(this,"exception="+e.getMessage(),Toast.LENGTH_SHORT).show();
                }
}

            message.setFrom(MyApplication.imService);
            message.addBody(body);
            message.setMsgTime(System.currentTimeMillis());
            message.setStatus(Message.Status.SUCCESS);
            message.setMsgId(UUID.randomUUID().toString());
ChatClient.getInstance().chatManager().saveMessage(message);



图3中的:
private boolean isRobotMenu(String str){
        try {
            JSONObject json = new JSONObject(str);
            JSONObject obj = json.getJSONObject("choice");
        }catch (Exception e){
            return false;
        }
        return true;
}
 
  查看全部
1.APP端要想获取到机器人菜单欢迎语,首先在移动客服管理员模式下,智能机器人,机器人设置——自动回复——欢迎语配置菜单欢迎语或者是欢迎语消息。
2、在会话分配规则中,渠道指定一定要指定机器人,APP端才能获取到机器人欢迎语,否则获取不到
具体的代码如下附件
图1中的
MyApplication.tenantId记得替换为自己的tenantId
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        HttpClient httpClient = new DefaultHttpClient();
                        HttpGet httpGet = new HttpGet("http://kefu.easemob.com/v1/Ten ... 6quot;);
                        try {
                            HttpResponse response = httpClient.execute(httpGet);
                            int code = response.getStatusLine().getStatusCode();
                            if (code == 200) {
                                final String rev  = EntityUtils.toString(response.getEntity());

                                JSONObject obj = new JSONObject(rev);
                                int type = obj.getInt("greetingTextType");
                                final String rob_welcome = obj.getString("greetingText");
                                //type为0代表是文字消息的机器人欢迎语
                                //type为1代表是菜单消息的机器人欢迎语
                                if(type == 0){
                                    //把解析拿到的string保存在本地
                                    shareUtil.saveRobot(rob_welcome);
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(getApplicationContext(),"rob_welcome="+rob_welcome,Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                }else if(type == 1){
                                    final String str = rob_welcome.replaceAll("&quot;","\"");
                                    JSONObject json = new JSONObject(str);
                                    JSONObject ext = json.getJSONObject("ext");
                                    final JSONObject msgtype = ext.getJSONObject("msgtype");
                                    //把解析拿到的string保存在本地
                                    shareUtil.saveRobot(msgtype.toString());
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(getApplicationContext(),"rob_welcome="+msgtype,Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                }

                            }
                        }catch(final Exception e){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),"exception="+e.getMessage(),Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();


图2中的:
//创建消息插入本地
            Message message = Message.createReceiveMessage(Message.Type.TXT);
            //从本地获取保存的string
            String str = shareUtil.getRobot();
            EMTextMessageBody body = null;
            //判断是否是菜单消息的string,这是自己实现的一个方法
            if(!isRobotMenu(str)){
                //文字消息直接去设置给消息
            body = new EMTextMessageBody(str);
            }else{
                //菜单消息需要设置给消息扩展
                try{
                    body = new EMTextMessageBody("");
                    JSONObject msgtype = new JSONObject(str);
                    message.setAttribute("msgtype",msgtype);
                }catch (Exception e){
                    Toast.makeText(this,"exception="+e.getMessage(),Toast.LENGTH_SHORT).show();
                }
}

            message.setFrom(MyApplication.imService);
            message.addBody(body);
            message.setMsgTime(System.currentTimeMillis());
            message.setStatus(Message.Status.SUCCESS);
            message.setMsgId(UUID.randomUUID().toString());
ChatClient.getInstance().chatManager().saveMessage(message);



图3中的:
private boolean isRobotMenu(String str){
        try {
            JSONObject json = new JSONObject(str);
            JSONObject obj = json.getJSONObject("choice");
        }catch (Exception e){
            return false;
        }
        return true;
}