第1步:快速创建APP关联
移动客服系统的“APP关联”对应即时通讯云(IM)后台的应用。在移动客服系统创建关联后,可直接登录IM后台管理该关联对应的应用。
关于快速创建APP关联的分步骤演示,请参考:快速创建APP关联。
开发工具:Xcode。
集成移动客服iOS SDK时,可参考“商城”demo源码和EaseUI源码。
下载地址:https://github.com/easemob/helpdeskdemo-ios
KefuSDK基于IM SDK 3.x,如同时使用环信IM功能(非音视频),需使用此文档中的初始化、登录、登出操作,不需要添加IM的SDK,其IMSDK-API正常使用。
完成该步骤可以实现用户注册、登录、退出,向移动客服系统发送文本、语音、图片、文件消息功能。
1、在工程中导入 HelpDeskSDK 和 HelpDeskUI 文件夹。两种方式:
2、向Build Settings → Linking → Other Linker Flags 中增加-ObjC.
3、向Build Phases → Link Binary With Libraries 中添加依赖库
4、SDK 不支持 bitcode,在 Build Settings → Build Options → Enable Bitcode 中设置 NO。
5、在工程info.plist文件中 增加隐私权限
6、在pch文件或全局.h文件中添加如下代码
#ifdef __OBJC__
#import "helpdesk_sdk.h"
#import "HelpDeskUI.h"
#endif
注:如果工程中没有pch文件,需要新建一个,并在Build Settings中设置Prefix Header为该pch文件,例如:HelloiOS/PrefixHeader.pch。
8、初始化sdk
HOptions *option = [[HOptions alloc] init];
option.appkey = HXKF_APP_KEY; // 必填项,appkey获取地址:kefu.easemob.com,“管理员模式 > 渠道管理 > 手机APP”页面的关联的“AppKey”
option.tenantId = @"32583";// 必填项,tenantId获取地址:kefu.easemob.com,“管理员模式 > 设置 > 企业信息”页面的“租户ID”
//推送证书名字
option.apnsCertName = @"your apnsCerName";//(集成离线推送必填)
//Kefu SDK 初始化,初始化失败后将不能使用Kefu SDK
HError *initError = [[HChatClient sharedClient] initializeSDKWithOptions:option];
if (initError) { // 初始化错误
NSLog(@"DADADSADASDSAD");
}
9. 进入会话列表页面
// 进入会话页面
HDMessageViewController *chatVC = [[HDMessageViewController alloc] initWithConversationChatter:@"kefuchannelimid_750310"]; // 获取地址:kefu.easemob.com,“管理员模式 > 渠道管理 > 手机APP”页面的关联的“IM服务号”
[self.navigationController pushViewController:chatVC animated:YES];
#pragma mark - public
- (NSArray *)formatMessages:(NSArray *)messages
{
NSMutableArray *formattedArray = [[NSMutableArray alloc] init];
if ([messages count] == 0) {
return formattedArray;
}
for (HMessage *message in messages) {
//Calculate time interval
CGFloat interval = (self.messageTimeIntervalTag - message.timestamp) / 1000;
if (self.messageTimeIntervalTag < 0 || interval > 60 || interval < -60) {
NSDate *messageDate = [NSDate dateWithTimeIntervalInMilliSecondSince1970:(NSTimeInterval)message.timestamp];
NSString *timeStr = @"";
if (_dataSource && [_dataSource respondsToSelector:@selector(messageViewController:stringForDate:)]) {
timeStr = [_dataSource messageViewController:self stringForDate:messageDate];
}
else{
timeStr = [messageDate formattedTime];
}
[formattedArray addObject:timeStr];
self.messageTimeIntervalTag = message.timestamp;
}
//Construct message model
id model = nil;
//接收的消息不能设置头像
BOOL isSender = message.direction == HMessageDirectionSend;
if (isSender && _dataSource && [_dataSource respondsToSelector:@selector(messageViewController:modelForMessage:)]) {
model = [_dataSource messageViewController:self modelForMessage:message];
}
else{
model = [[HDMessageModel alloc] initWithMessage:message];
NSDictionary *weichat = [NSDictionary dictionary];
if ([message.ext objectForKey:@"weichat"]) {
weichat = [message.ext valueForKey:@"weichat"];
}
NSDictionary *agent = [NSDictionary dictionary];
if ([weichat objectForKey:@"agent"]) {
agent = [weichat valueForKey:@"agent"];
}
if ([[agent allKeys] containsObject:@"avatar"]) {
NSString *url = [agent valueForKey:@"avatar"];
if (![url isKindOfClass:[NSNull class]]) {
if ([url hasPrefix:@"http"]) {
model.avatarURLPath = [agent valueForKey:@"avatar"];
} else {
//设置客服头像
model.avatarURLPath = [[@"https:" stringByAppendingString:[agent valueForKey:@"avatar"]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
}
}
model.avatarImage = [UIImage imageNamed:@"HelpDeskUIResource.bundle/user"];
model.failImageName = @"imageDownloadFail";
}
if (model) {
[formattedArray addObject:model];
}
}
return formattedArray;
}
是在HDBaseMessageCell.m文件内进行赋值的 修改对方头像也可以在这里修改
#pragma mark - setter
- (void)setModel:(id)model
{
[super setModel:model];
if (model.avatarURLPath) {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
} else {
self.avatarView.image = model.avatarImage;
}
if (![model.nickname isKindOfClass:[NSNull class]]) {
_nameLabel.text = model.nickname;
}
if (self.model.isSender) {
_hasRead.hidden = YES;
switch (self.model.messageStatus) {
case HMessageStatusPending:
{
_statusButton.hidden = YES;
[_activity setHidden:NO];
[_activity startAnimating];
}
break;
case HMessageStatusDelivering:
{
_statusButton.hidden = YES;
[_activity setHidden:NO];
[_activity startAnimating];
}
break;
case HMessageStatusSuccessed:
{
_statusButton.hidden = YES;
[_activity stopAnimating];
if (self.model.isMessageRead) {
_hasRead.hidden = NO;
}
}
break;
case HMessageStatusFailed:
{
[_activity stopAnimating];
[_activity setHidden:YES];
_statusButton.hidden = NO;
}
break;
default:
break;
}
// 自己的 昵称 头像
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://pic35.nipic.com/20131121/2531170_145358633000_2.jpg"]] placeholderImage:[UIImage imageNamed:@""]];
self.nameLabel.text = @"我的名字";
}else{
// 对方的昵称 头像
}
}
#pragma mark - Hyphenate
#pragma mark - HChatDelegate
#pragma mark -- 获取客服的名字和头像
- (void)messagesDidReceive:(NSArray *)aMessages {
for (HMessage *message in aMessages) {
//获取客服的头像和名称
NSLog(@"%@",message.ext[@"weichat"][@"agent"]);
NSLog(@"头像 ----- url %@",message.ext[@"weichat"][@"agent"][@"avatar"]);
NSLog(@"昵称 ----- %@",message.ext[@"weichat"][@"agent"][@"userNickname"]);
self.title = message.ext[@"weichat"][@"agent"][@"userNickname"];
if ([self.conversation.conversationId isEqualToString:message.conversationId]) {
[self addMessageToDataSource:message progress:nil];
}
}
}
- (void)cmdMessagesDidReceive:(NSArray *)aCmdMessages {
for (HMessage *message in aCmdMessages) {
if ([self.conversation.conversationId isEqualToString:message.conversationId]) {
[self showHint:NSEaseLocalizedString(@"receiveCmd", @"receive cmd message")];
break;
}
}
}