DevStore首页 > DEV资源 > 服务评测下载 > 环信即时通讯云iOS版V2.0.9.1服务评测

环信即时通讯云iOS版V2.0.9.1服务评测

查看服务>>
DevStore编辑 刘艳丽 | 2014-10-09 11:00    浏览量(20758)    纠错    评论(4)    环信即时通讯云服务详情>>

服务评测作者

  • 32 能力值
  • 2 源码
  • 14 评测
  • 0 资料

评测目录

集成测试

评测环境

2G/3G/WiFi网络下:

测评环境

MAC OS(10.9.2)+ XCode(5.1) + iPhone

测试对象

环信即时通讯云 IOS SDK Version 2.0.9.1

测试设备

iPhone  

系统版本

IOS SDK 7.1

设备网络

2G/3G/WIFI

测试难度

一般

测试方法

客户端运行环信即时通讯云IOS SDK实例

测试时间

2014-10-01 17:10:00

测试时长

6个小时


基本参数:

是否免费

注册用户300万以下或日活30万以下终身免费

离线存储空间

每个用户100MB

平台支持

IOS、Android

实时语音、视频

即将支持

单聊

支持

群聊

支持

发送文字

支持

发送表情

支持

发送语音

支持

发送地理位置

支持

发送照片

支持

发送视频

支持

离线消息

支持

存储用户信息

不支持,由用户业务服务器负责

流量数据统计

支持

消息发送数量

无限制

注:具体参数详见: http://www.easemob.com/price/

集成过程

客户端集成

环信即时通讯云IOS SDK的大体开发流程如下:

注册成为开发者=》服务端配置=》创建应用=》下载SDK=》集成开发=》测试应用

1、注册环信账号

登录环信官方首页:http://www.easemob.com/

注册环信账号

点击登录,如果没有环信账号需要进行注册,填写用户相关详细信息,如下图所示:

登陆环信

注:企业ID只限于数字、字母、横线,且不能以横线开头和结尾。企业ID会存在于生成的APPKEY中,如:测试demo中 APPKEY为DevStore#chatdemo,则DevStore为填写的企业ID。

如果是个人应用开发的话,企业ID直接写成自己定义的ID就可以。

2、激活账号

注册成功后,会向你填写的邮箱中发送验证信息,请前往邮箱进行账号激活。

激活账号

3、登录

进行登录:https://console.easemob.com/index.html

登陆

4、创建应用

账号成功激活后,登录到环信管理后台的页面,在我的应用中,点击创建应用按钮,如下图:

创建应用

点击创建应用,填写应用的相关信息。

填写应用的相关信息

注: 注册模式中,开放注册:允许在该应用下自由注册新用户,授权注册:只有企业管理员或者应用管理员才能注册用户。

建议在开发测试阶段选择开放注册,这样便于程序的测试。

app创建成功

显示创建应用成功。

5、获取应用的配置信息

保存好应用的基本信息:API KEY以及client_id、client_secret。

获取应用的配置信息

注: AppKey作为客户端应用程序的标识,在进行客户端开发的时候会用到。

client_id和client_secret在客户端与服务器进行数据交换时进行鉴权使用,它就是拥有超级权限的一个token,可以调REST接口,来处理管理员做的事情,使用它的人应有最高的权限,所以一般情况下对于普通的客户端来说是用不到的。

6、下载SDK

下载IOS SDK  http://www.easemob.com/sdk/

下载IOS SDK

注:目前的最新版本为2.0.9.1

7、SDK集成

    1)新建工程

新建工程

    2)添加环信 SDK 

直接将环信 SDK拖入到工程中 

添加环信 SDK

选择复制

选择复制

    3)添加系统链接库

添加 SystemConfigureation.framework

添加系统链接库

除此之外,还应依次添加如下库文件:

添加库文件

    4)编译环境的设置

设置Linker

向Other Linker Flags 中添加 -ObjC。(如果已有,则不需要再添加)

设置Linker

注:-ObjC就是会加载静态库文件中实现一个类或者分类的所有成员

设置Architectures

设置Architectures

    5)设置AppKey

设置APNS和AppKey,如下图所示:

设置AppKey

注:极力推荐开发者在环信提供的Demo之上进行应用开发,该Demo已经实现了聊天所需的大部分功能,这样可以提高开发效率。

EaseMob作为客户端基本工具类(单例)负责与服务器端交互。

    6)注册功能 

实现注册功能,添加如下代码:

- (IBAction)doRegister:(id)sender 
{
    if (![self isEmpty]) 
    {
        [self.view endEditing:YES];
        if ([self.usernameTextField.text isChinese]) 
         {
            UIAlertView *alert = [[UIAlertView alloc]
                                  initWithTitle:@"用户名不支持中文"
                                  message:nil
                                  delegate:nil
                                  cancelButtonTitle:@"确定"
                                  otherButtonTitles:nil];
            
            [alert show];
            
            return;
        }
        [self showHudInView:self.view hint:@"正在注册..."];
        [[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:_usernameTextField.text
                                                             password:_passwordTextField.text
                                                       withCompletion:                    case EMErrorServerNotReachable:
                         TTAlertNoTitle(@"连接服务器失败!");
                         break;
                     case EMErrorServerDuplicatedAccount:
                         TTAlertNoTitle(@"您注册的用户已存在!");
                         break;
                     case EMErrorServerTimeout:
                         TTAlertNoTitle(@"连接服务器超时!");
                         break;
                     default:
                         TTAlertNoTitle(@"注册失败");
                         break;
                 }
             }
         } onQueue:nil];
    }
}

IChatManager接口类,它是一个聊天管理器,获取该对象后,可以做登录、聊天、加好友等操作。

在这里使用异步的方法asyncRegisterNewAccount在聊天服务器上创建账号。

注册

注册成功 登录

进入环信服务管理的后台,查看IM用户

查看IM用户

现在已有devstore_test用户,说明注册成功。

    7)登录功能

实现登录功能,添加如下代码:

- (void) loginWithUsername:(NSString *)username password:(NSString *)password
{
    NSLog(@"正在登录......");
    [self showHudInView:self.view hint:@"正在登录..."];
    [[EaseMob sharedInstance].chatManager asyncLoginWithUsername:username
                                                        password:password
                                                      completion:
     ^(NSDictionary *loginInfo, EMError *error) {
         [self hideHud];
         if (loginInfo && !error) {
             [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_LOGINCHANGE object:@YES];
         }else {
             switch (error.errorCode) {
                 case EMErrorServerNotReachable:
                     TTAlertNoTitle(@"连接服务器失败!");
                     break;
                 case EMErrorServerAuthenticationFailure:
                     TTAlertNoTitle(@"用户名或密码错误");
                     break;
                 case EMErrorServerTimeout:
                     TTAlertNoTitle(@"连接服务器超时!");
                     break;
                 default:
                     TTAlertNoTitle(@"登录失败");
                     break;
             }
         }
     } onQueue:nil];
}

IChatManager 接口类,它是一个聊天管理器,获取该对象后,可以做登录、聊天、加好友等操作。

在这里使用异步的方法asyncLoginWithUsername登录聊天服务器。

验证登录功能

验证登录功能

日志

    8)发送消息功能

发送文字,实现消息发送功能,添加如下代码: 

+(EMMessage *)sendTextMessageWithString:(NSString *)str toUsername:(NSString *)username   isChatGroup:(BOOL)isChatGroup
requireEncryption:(BOOL)requireEncryption
{
    //表情映射
    NSString *willSendText = [ConvertToCommonEmoticonsHelper convertToCommonEmoticons:str];
    EMChatText *text = [[EMChatText alloc] initWithText:willSendText];
    EMTextMessageBody *body = [[EMTextMessageBody alloc] initWithChatObject:text];
   
    EMMessage *retureMsg = [[EMMessage alloc] initWithReceiver:username bodies:[NSArray arrayWithObject:body]];
    retureMsg.requireEncryption = requireEncryption;
    retureMsg.isGroup = isChatGroup;
    EMMessage *message = [[EaseMob sharedInstance].chatManager asyncSendMessage:retureMsg progress:nil];
   
    return message;
  
}

EMChatText 用于封装要发送消息的具体内容

EMTextMessageBody  对消息内容进行封装的消息体

EMMessage  封装消息,创建EMessage时需要指定消息的接受者和要发送的消息列表。

客户的工具类EaseMob中的聊天管器chatManager中的asyncSendMessage负责发送消息。

验证发送消息功能:

验证发送消息功能

日志

    9)接收消息功能

接收文字,实现消息接收功能,添加如下代码: 

- (void)showNotificationWithMessage:(EMMessage *)message
{
         
    EMPushNotificationOptions *options = [[EaseMob sharedInstance].chatManager pushNotificationOptions];
    //发送本地推送
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.fireDate = [NSDate date]; //触发通知的时间
   
    if (options.displayStyle == ePushNotificationDisplayStyle_messageSummary) {
        id<IEMMessageBody> messageBody = [message.messageBodies firstObject];
        NSString *messageStr = nil;
        switch (messageBody.messageBodyType) {
            case eMessageBodyType_Text:
            {
                messageStr =           ((EMTextMessageBody *)messageBody).text;
            }
                break;
            case eMessageBodyType_Image:
            {
                messageStr = @"[图片]";
            }
                break;
            case eMessageBodyType_Location:
            {
                messageStr = @"[位置]";
            }
                break;
            case eMessageBodyType_Voice:
            {
                messageStr = @"[音频]";
            }
                break;
            case eMessageBodyType_Video:{
                messageStr = @"[视频]";
            }
                break;
            default:
                break;
        }
       
        NSString *title = message.from;
        if (message.isGroup) {
            NSArray *groupArray = [[EaseMob sharedInstance].chatManager groupList];
            for (EMGroup *group in groupArray) {
                if ([group.groupId isEqualToString:message.conversation.chatter]) {
                    title = [NSString stringWithFormat:@"%@(%@)", message.groupSenderName, group.groupSubject];
                    break;
                }
            }
        }
       
        notification.alertBody = [NSString stringWithFormat:@"%@:%@", title, messageStr];
    }
    else{
        notification.alertBody = @"您有一条新消息";
    }
    notification.alertAction = @"打开";
    notification.timeZone = [NSTimeZone defaultTimeZone];
    //发送通知
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    UIApplication *application = [UIApplication sharedApplication];
    application.applicationIconBadgeNumber += 1;
}

IEMMessageBody中的messageBodyType用来指定消息的类型

验证接收消息功能:

验证接收消息功能

日志

除此之外,还可以通过网页在环信管理后台进行用户的管理和消息的发送。

后台管理消息发送

主要功能

用户登录

用户登录

用户注册

在客户端进行注册的时候需要将应用的注册方式改为开发注册。

用户注册

消息发送与接收

环信客户端支持许多媒体,包括文字、图片、视频、地理位置等。

消息发送与接收

发送图片、视频、地理位置等

查找与添加好友

查找与添加好友

群组管理

群组管理

删除用户或组

删除用户或组

功能特色

1、数据流量统计

环信即时通讯云可以按照IM用户、消息、GET请求次数、POST请求次数、DELETE请求次数、PUT请求次数进行数据统计。同时也支持按照时间段对以上统计项进行查询。

用户数量的统计

用户数量统计

消息数量的统计

消息数量统计

2、用户信息管理

在环信管理后台可以对当前的用户(环信ID标识)进行管理,包括为用户添加好友、创建组、注册用户、发送消息、批量删除等。

用户信息管理

3、客户端设置

环信IOS客户端已经实现了聊天所具有的大部分功能,另外用户也可以根据自己的需要进行相应的设置,包括自动登录、消息推送设置、黑名单以及日志上传等。

客户端设置

DEMO展示

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    apnsCertName = @"devstorehuanxin";
#endif
    [[EaseMob sharedInstance] registerSDKWithAppKey:@"devstore#devstorehuanxin" apnsCertName:apnsCertName];
    NSLog(@"注册AppKey......");
   
#if DEBUG
    [[EaseMob sharedInstance] enableUncaughtExceptionHandler];
#endif
    //以下一行代码的方法里实现了自动登录,异步登录,需要监听[didLoginWithInfo: error:]
    //demo中此监听方法在MainViewController中
    [[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
   
#warning 注册为SDK的ChatManager的delegate (及时监听到申请和通知)
    [[EaseMob sharedInstance].chatManager removeDelegate:self];
    [[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
   
#warning 如果使用MagicalRecord, 要加上这句初始化MagicalRecord
    //demo coredata, .pch中有相关头文件引用
    [MagicalRecord setupCoreDataStackWithStoreNamed:[NSString stringWithFormat:@"%@.sqlite", @"UIDemo"]];
   
    [self loginStateChange:nil];
    [self.window makeKeyAndVisible];
    return YES;
}

注册用户

- (IBAction)doRegister:(id)sender 
{
    if (![self isEmpty]) 
    {
        [self.view endEditing:YES];
        if ([self.usernameTextField.text isChinese]) 
         {
            UIAlertView *alert = [[UIAlertView alloc]
                                  initWithTitle:@"用户名不支持中文"
                                  message:nil
                                  delegate:nil
                                  cancelButtonTitle:@"确定"
                                  otherButtonTitles:nil];
            
            [alert show];
            
            return;
        }
        [self showHudInView:self.view hint:@"正在注册..."];
        [[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:_usernameTextField.text
                                                             password:_passwordTextField.text
                                                       withCompletion:                    case EMErrorServerNotReachable:
                         TTAlertNoTitle(@"连接服务器失败!");
                         break;
                     case EMErrorServerDuplicatedAccount:
                         TTAlertNoTitle(@"您注册的用户已存在!");
                         break;
                     case EMErrorServerTimeout:
                         TTAlertNoTitle(@"连接服务器超时!");
                         break;
                     default:
                         TTAlertNoTitle(@"注册失败");
                         break;
                 }
             }
         } onQueue:nil];
    }
}

LoginViewController.m

用户登录

- (IBAction)doRegister:(id)sender 
{
    if (![self isEmpty]) 
    {
        [self.view endEditing:YES];
        if ([self.usernameTextField.text isChinese]) 
         {
            UIAlertView *alert = [[UIAlertView alloc]
                                  initWithTitle:@"用户名不支持中文"
                                  message:nil
                                  delegate:nil
                                  cancelButtonTitle:@"确定"
                                  otherButtonTitles:nil];
            
            [alert show];
            
            return;
        }
        [self showHudInView:self.view hint:@"正在注册..."];
        [[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:_usernameTextField.text
                                                             password:_passwordTextField.text
                                                       withCompletion:                    case EMErrorServerNotReachable:
                         TTAlertNoTitle(@"连接服务器失败!");
                         break;
                     case EMErrorServerDuplicatedAccount:
                         TTAlertNoTitle(@"您注册的用户已存在!");
                         break;
                     case EMErrorServerTimeout:
                         TTAlertNoTitle(@"连接服务器超时!");
                         break;
                     default:
                         TTAlertNoTitle(@"注册失败");
                         break;
                 }
             }
         } onQueue:nil];
    }
}

发送文字

+(EMMessage *)sendTextMessageWithString:(NSString *)str
                             toUsername:(NSString *)username
                            isChatGroup:(BOOL)isChatGroup
                      requireEncryption:(BOOL)requireEncryption
{
    //表情映射
    NSString *willSendText = [ConvertToCommonEmoticonsHelper convertToCommonEmoticons:str];
    EMChatText *text = [[EMChatText alloc] initWithText:willSendText];
    EMTextMessageBody *body = [[EMTextMessageBody alloc] initWithChatObject:text];
   
    EMMessage *retureMsg = [[EMMessage alloc] initWithReceiver:username bodies:[NSArray arrayWithObject:body]];
    retureMsg.requireEncryption = requireEncryption;
    retureMsg.isGroup = isChatGroup;
    EMMessage *message = [[EaseMob sharedInstance].chatManager asyncSendMessage:retureMsg progress:nil];
   
    return message;
  
}

接收消息

- (void)showNotificationWithMessage:(EMMessage *)message
{
         
    EMPushNotificationOptions *options = [[EaseMob sharedInstance].chatManager pushNotificationOptions];
    //发送本地推送
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.fireDate = [NSDate date]; //触发通知的时间
   
    if (options.displayStyle == ePushNotificationDisplayStyle_messageSummary) {
        id<IEMMessageBody> messageBody = [message.messageBodies firstObject];
        NSString *messageStr = nil;
        switch (messageBody.messageBodyType) {
            case eMessageBodyType_Text:
            {
                messageStr = ((EMTextMessageBody *)messageBody).text;
            }
                break;
            case eMessageBodyType_Image:
            {
                messageStr = @"[图片]";
            }
                break;
            case eMessageBodyType_Location:
            {
                messageStr = @"[位置]";
            }
                break;
            case eMessageBodyType_Voice:
            {
                messageStr = @"[音频]";
            }
                break;
            case eMessageBodyType_Video:{
                messageStr = @"[视频]";
            }
                break;
            default:
                break;
        }
       
        NSString *title = message.from;
        if (message.isGroup) {
            NSArray *groupArray = [[EaseMob sharedInstance].chatManager groupList];
            for (EMGroup *group in groupArray) {
                if ([group.groupId isEqualToString:message.conversation.chatter]) {
                    title = [NSString stringWithFormat:@"%@(%@)", message.groupSenderName, group.groupSubject];
                    break;
                }
            }
        }
       
        notification.alertBody = [NSString stringWithFormat:@"%@:%@", title, messageStr];
    }
    else{
        notification.alertBody = @"您有一条新消息";
    }
    notification.alertAction = @"打开";
    notification.timeZone = [NSTimeZone defaultTimeZone];
    //发送通知
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    UIApplication *application = [UIApplication sharedApplication];
    application.applicationIconBadgeNumber += 1;
}

详细实现代码参见环信SDK中的UI实例,里面有详细的说明。

测试日志

测试日志截图:

测试日志截图

遇到问题

总体来说使用环信SDK进行客户端集成的难度是比较低的。环信官方提供的IOS 客户端已经实现了聊天的大部分功能,而且客户端的代码是开源的,开发者可以根据自己的需求在此之上进行相应的修改,这样极大的简化了客户端的开发负担。

开发过程中遇到的问题主要集中在配置方面,下面笔者对集成过程中几个重点地方进行一下说明:

1、编译环境配置

设置Linker

在Other Linker Flags 中添加 –ObjC,如下图所示:

设置Linker

设置Architectures

设置Architectures

2、AppKey设置

需要注意的是,registerSDKWithAppKey的参数一定要与创建应用时给定的AppKey相一致。

AppKey设置

注: AppKey作为客户端应用程序的标识,在进行客户端开发的时候会用到。

client_id和client_secret在客户端与服务器进行数据交换时进行鉴权使用,它就是拥有超级权限的一个token,可以调REST接口,来处理管理员做的事情,使用它的人应有最高的权限,所以一般情况下对于普通的客户端来说是用不到的。

3、环信管理后台的使用

在进行测试开发的时候建议将用户注册模式改为开放注册,这样便于客户端的测试,笔者刚开始未注意到这个问题,导致注册失败。

使用环信管理后台

上手难易

总的来说,笔者认为使用环信IOS SDK进行集成开发是比较容易的,环信官方提供的IOS 客户端已经实现了聊天的大部分功能,主要包括:好友管理、发送接收消息、群组管理以及各种自定义配置选项。而且客户端的代码是开源的,开发者可以根据自己的需求在此之上进行相应的修改,在此强烈建议开发者在官方提供的客户端之上进行相应的开发,这样极大的简化了客户端的开发负担,提高开发效率。

环信即时通讯云服务使用标准的Auth 2.0协议进行身份鉴权,数据访问使用REST API方式。在进行开发之前希望开发者可以学习一下相关的内容,有助于你对环信IOS SDK的使用。

开发文档

1、开发中关于IOS SDK的问题参见IOS 在stack overflow的主页:      

http://stackoverflow.com/questions/tagged/ios

关于IOS SDK的问题

2、对于Autho2.0 的原理说明可以参考官方提供的地址  http://www.ruanyifeng.com/blog/2014/05/restful_api.html或者

http://blog.csdn.net/zhangzhebjut/article/details/26006905

RES API介绍参见环信官网:http://www.easemob.com/docs/rest/#rest

3、关于环信IOS SDK集成过程介绍,开发者可以参考官方提供的文档说明: 

http://www.easemob.com/docs/ios/

文档说明

除此之外,开发者也可以参考官方提供的实例以提高开发效率。

4、环信IOS SDK使用的类接口文档说明可以参见:

http://www.easemob.com/apidoc/ios/chat/

类接口文档说明

此服务评测版权归DevStore所有,禁止转载,申请升级为 特约评测员 才可进行测评立即申请

声明:DevStore评测内容都是基于专业评测人员/开发者通过真实的测试之后得出的数据,服务版本实时都在更新,所以评测并不一定是此服务的最新版本,但我们会秉承公正专业精准的态度,对开发者负责,同时欢迎大家监督和建议,如对评测内容有异议,请提交纠错,由专业的评测团队再次评测,我们会尽最大努力为大家提供更贴心的服务。

DevStore_全球首家第三方开发者服务商店,最精准的服务对比、最专业的服务评测、最及时的行业动态,为开发者挑选服务提供最全面的参考和专业分析,加入DevStore,从此告别熬夜加班,你也可以这么帅!搜索微信号:DevStore

评论(4)
Julian

Julian 2015-12-07 15:38:39

很好很强大,特地注册来评论~
回复(0) 赞(1) 赞(2)
killerdark

killerdark 2014-10-28 11:15:31

不错 很详细~学习了
回复(0) 赞(0) 赞(1)
飞翔之星

飞翔之星 2014-10-09 16:30:07

ios的sdk包有多大?这个对于app很重要的
回复(0) 赞(0) 赞(1)
wwwwwww

wwwwwww 2014-10-09 15:44:57

这个评测写的好详细~~
回复(0) 赞(1) 赞(2)