DevStore首页 > DEV资源 > 服务评测下载 > 融云即时通讯云iOS版V1.2.9服务评测

融云即时通讯云iOS版V1.2.9服务评测

查看服务>>
DevStore编辑 刘艳丽 | 2015-01-30 11:00    浏览量(10928)    纠错    评论(1)    融云即时通讯云服务详情>>

服务评测作者

  • 18 能力值
  • 0 源码
  • 8 评测
  • 0 资料

评测目录

集成测试

评测环境

3G网络下:

    测试对象

  RCIM iOS SDK v1.2.9

    测试环境

  Mac OS X(10.10) + Xcode (6.1)

    测试设备

  iPhone 5S

    系统版本

  iOS 8.1

    设备网络

  3G

    测试方法

  测试IM功能的及时性,集成复杂度

    测试时间

  2015-1-14 21:30


WiFi网络下:

   测试设备

  iPhone 5S

   系统版本

  iOS 8.1

   设备网络

  wifi

   测试方法

  测试IM功能的及时性,集成复杂度

   测试时间

  2015-1-14 22:00


基本参数:

   如何收费

  基础功能免费,定制功能收费

   稳定性

  稳定

   及时性

  及时

 提供服务端API

  提供

   集成难度

  一般

   差异化服务

  支持

对应用运行的影响

  视情况而定

集成过程

客户端集成

客户端集成过程与一般的sdk相比较为复杂,因为SDK中包含较多的接口,而且需要开发者在使用之前能对其功能和相关术语有一定的了解。整体过程分为 注册帐号->创建应用->配置推送证书->SDK下载->集成SDK->调试、发布。在这里笔者要强调一下,要想真正的用好,用的顺利,建议开发者事先做好功课--阅读快速入门指南http://docs.rongcloud.cn。

1、注册融云账号

融云开发者账号的注册地址:https://developer.rongcloud.cn/signup

2、创建新应用

说到即时通信,在iOS端无论采用什么架构的应用都需要使用APNS推送来唤醒用户,融云SDK也不例外,开发者在创建完应用之后需要上传APNS推送证书。证书分为两种,生产证书—用于应用上线后的推送服务;开发证书—用于测试状态下的推送服务。由于本篇评测的评测重点不在于推送,对于证书配置不熟悉的开发者朋友可以自行补习,在此不再赘述。

创建新应用

在这里简单介绍一下SDK中涉及的基础概念。

单聊----单聊的对象是一个在融云存在的用户,也可以是自己(用户信息已经上报融云)。如果是聊天中只有自己一个用户,那么发送信息之后能够立即收到回复,初始化需要传入聊天对象的id。

讨论组----初始化时传入一组用户id,融云负责保持这个讨论组,用户关闭讨论组聊天窗口会收到融云服务器的推送。

聊天室----进入即可聊天,退出不再接收消息,会话关系信息同样由融云服务器负责维护。

群组----由应用服务器提供一个用户成员列表,形式类似讨论组,但是服务器并不负责保持这个群组,而只负责向群组内的成员发送消息。

VOIP----通过网络建立一对一的音频通话,不能拨打电话而只能在用户之间发起。

关于基础概念和业务介绍,融云提供了详细的文档支持,希望开发者在使用SDK之前能够详细的阅读并掌握概念,避免在开发中混淆概念,而耽误开发时间。附上连接:http://docs.rongcloud.cn

集成步骤

在用户创建完成应用之后会提示下载SDK,开发者可以点选,或者通过导航菜单的下载中找到更详细的SDK列表。

http://www.rongcloud.cn/download

下载SDK

在这里建议开发者选择稳定版的SDK,因为融云SDK是每周都会有更新,而较开发版相比,稳定版的未知错误可能会更少,开发遇到问题也能够得到很好的技术支持。

1、下载iOS SDK

下载并解压SDK之后内容如下:

解压sdk

一个是更新文档,包含所有历史版本和更新内容;一个是IMKit,这也正是我们需要往项目中集成的;另外一个是IMLib,一般我们不使用。

准备工作完成,我们开始集成SDK的介绍。

2、集成开发

    1)新建一个工程

新建工程

由于Demo中也要用到推送功能,因而在这里强调,Identifer一定要是已经在苹果开发者中心创建过的AppId,并且此AppId带有PushNotification功能。

PushNotification功能

    2)添加融云SDK(IMKit)

创建项目之后,需要想工程中添加IMKit和它需要的系统依赖。

添加工程包

·AudioToolbox.framework

·AVFoundation.framework

·CFNetwork.framework

·CoreAudio.framework

·CoreGraphics.framework

·CoreImage.framework

·CoreLocation.framework

·CoreMedia.framework

·CoreTelephony.framework

·CoreVideo.framework

·Foundation.framework

·libc++.dylib

·libsqlite3.dylib

·libstdc++.dylib

·libz.dylib

·MapKit.framework

·OpenGLES.framework

·QuartzCore.framework

·SystemConfiguration.framework

·UIKit.framework

由于需要添加的系统依赖比较多,希望开发者仔细核查,少添加任何一个都会造成编译错误。此外,关于IMKit和IMLib,融云文档也特别强调,IMLib是包含在IMKit之内的,如果重复添加会造成编译错误。

    3)基本功能集成

与其他SDK类似,融云SDK也会在创建应用的时候分配应用的APPKey和App Secret。

基本功能集成

大家一定要清楚各个字段的作用,之后我们还会用到deviceToken、和userToken,这些字段从一个层面来说都是由某个服务器下发给我们应用的一个标识,在这里解释AppKey和AppSecret的作用,后者将在使用到的时候解释。

AppKey:由融云服务器提供给开发者,表明应用是经过注册和申请的,可以使用融云SDK,每个应用对应一个唯一给AppKey。

AppSecret:同样有融云服务器提供,但是这个字段是给应用的服务器使用的,用来验证应用服务器的合法性。

1.初始化SDK

[RCIM initWithAppKey:APPKEY deviceToken:nil];

开发者可以看到,这里有一个deviceToken参数,如果在应用启动的代理方法

application didFinishLaunchingWithOptions:

中初始化SDK我们是不能得到deviceToken的所以需要在得到deviceToken的回调中再次调用这个初始化方法。(或者聪明的你,是不是可以只在注册成功的时候一并传入两个字段?)

2.添加推送相关的注册代码

在应用中我们使用到了推送功能,需要添加相关的方法。

#ifdef __IPHONE_8_0
    // 在 iOS 8 下注册苹果推送,申请推送权限。
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
                                                                                         |UIUserNotificationTypeSound
                                                                                         |UIUserNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
    // 其他版本下注册苹果推送,申请推送权限。
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
#endif

在iOS8以后如果有通知中心交互的需求的朋友,可以在这里添加相应的Action设置。

在这里需要解释一下上文提到的deviceToken。

DeviceToken:由APNS服务器发送给应用,有了deviceToken,应用服务器就可以向APNS服务器发起推送请求,所以也是给服务器用的,在这里我们把它上报给了融云服务器,因为推送请求是融云帮我们完成的。

服务端集成

即时聊天应用是需要有一套完整的用户系统的,包括用户的信息以及用户间的关系。而这些信息应该是有应用服务器提供的,但是没有条件的开发者也可以通过融云提供的API调试接口来添加用户。

这里就要提到了userToken,(融云并不这么叫,而是token)。

UserToken:由应用服务器(在这里是有融云的API调试模块代替的)提供的一个包含用户信息的字段,这个字段中包含了一个用户的基本信息,可以唯一标识一个用户。

API调试模块截图:

API调试模块截图

我们填入userId、userName、portraitUrl之后点击获取身份认证token就能生成一个Token。

生成Token

主要功能

主要功能即IM功能,提供了多重聊天方式,包括单聊,群聊,讨论组,聊天室等功能。

而且支持语音消息、图片、和VoIP通话功能。

除此之外,网站也提供了调试接口必须的功能模块。如果开发者有集成客服系统的需求,融云SDK也可以完成。

功能特色

1、单聊

由一个用户发起,聊天对象只能是一个用户的聊天。

a.连接服务器

/*参数的含义1.聊天对象id 2.聊天页面标题 3.回调*/
        MyChatViewController *singleChatVC = [[MyChatViewController alloc] init];
        singleChatVC.conversationType = ConversationType_PRIVATE;
        singleChatVC.currentTarget = theTarget;
        [self.navigationController pushViewController:singleChatVC animated:YES];

在这个接口中,我们需要传入一个发起人的target即聊天对象的userId。

b.配置聊天视图控制器

//允许发送位置信息
  singleChatVC.enablePOI = YES;
//允许对页面进行设置
  singleChatVC.enableSettings = YES;
//允许语音消息
  singleChatVC.enableVoIP = YES;
//导航栏按钮上的badgeNumber
  singleChatVC.enableUnreadBadge = YES;

这些设置都是针对聊天页面的视图控制器的,如果在自定义的页面设置这些属性那么在使用了自定义视图控制器的地方这些属性都会生效。

单聊

2、群聊 

群聊中群的信息由融云服务器保管,因而,在实例化一个群聊界面的时候需要传入群的相关信息,而聊天界面我们使用的同单聊的界面是一样的,只不过我们传入不同的参数就会变成需要的聊天方式。

RCGroup *group = groupList_[1];
        MyChatViewController *temp = [[MyChatViewController alloc]init];
        temp.currentTarget = group.groupId;
        temp.conversationType = ConversationType_GROUP;
        temp.currentTargetName = group.groupName;
        temp.enableUnreadBadge = NO;
        temp.enableVoIP = NO;
        temp.portraitStyle = RCUserAvatarCycle;
        [[RCIM sharedRCIM] syncGroups:groupList_ completion:^{
            NSLog(@"同步群组信息成功");
        } error:^(RCErrorCode status) {
            NSLog(@"同步群组信息失败  status - %d",status);
        }];
        [self.navigationController pushViewController:temp animated:YES];

提醒开发者注意,在生成群聊界面的时候是需要同步群信息的,也就是SDK中带的同步方法需要被调用。关于群聊还有一个加入群和退出群的接口,开发者可以通过这些接口来完善体验。

[[RCIM sharedRCIM] joinGroup:@"102" groupName:@"朋友群" completion:^{
            NSLog(@"加入朋友群成功");
        } error:^(RCErrorCode status) {
            NSLog(@"加入朋友群失败");
        }];

RCIM.h文件中包含了大多数我们常用到的属性设置和方法,值得引起开发者的注意。

3、聊天室

在融云的开发者群中(397963068),常常会看到有开发者询问聊天室、群聊、讨论组之间的区别,而这点笔者也在前面提到过。业务逻辑不同,当然功能、使用方法就有区别,再次强调,希望开发者能先熟悉文档,然后才着手开发。聊天室的初始化方法较为简单。

RCChatViewController *chatRoom = [[RCChatViewController alloc] init];
        chatRoom.currentTarget = @"1001";
        chatRoom.conversationType = ConversationType_CHATROOM;
        chatRoom.enableSettings = NO;
        chatRoom.currentTargetName = @"聊天室界面";
        [self.navigationController pushViewController:chatRoom animated:YES];

与加群、退群类似,针对聊天室也有加入和退出的方法,但是与群聊不同的地方就在于其设置稍微不同—可以设置获取历史消息的条数。

/*
         1.聊天室ID
         2.获取历史消息的条数
         3.加入成功的bolck
         4.加入失败的block
         */
        [[RCIM sharedRCIM] joinChatRoom:@"1001" messageCount:20 completion:^{
            NSLog(@"加入聊天室成功");
        } error:^(RCErrorCode status) {
            {
                NSLog(@"加入聊天室失败");
            }
            
        }];

4、客服系统

在创建客服页面之前我们首先需要在网页的应用控制台里面开通客服功能。

客服系统

开通客服的过程是这样的。

1.在控制台中开通客服功能模块,2.填写相关信息3.获得customerID4.使用customerID初始化客服聊天界面

开通客服需要填入的信息

开通客服需要填入的信息

注意:在这里输入的客服域名只需要填入一个单词即可,不用带http和www,否则无法注册该域名。

开启客服

创建成功之后需要得到CustomerID来初始化客服聊天界面。

代码如下:

RCChatViewController *severChatVC = [[RCIM sharedRCIM] createCustomerService:CustomerSeverID
                                                                               title:@"在线客服"
                                                                          completion:^{                            
//创建客服聊天控制器之后的回调方法;
NSLog(@"生成客服聊天对象");
             }];
        [[RCIM sharedRCIM] launchCustomerServiceChat:severChatVC customerServiceUserId:@"1"  title:@"客服小美" completion:^{
            NSLog(@"启动客服聊天成功");}];

DEMO展示

在通常情况下,又SDK生成的页面不一定能很好的满足我们项目的需求,这时候就需要开发者对一些界面进行定制。而在这方面,SDK也开放了相关的接口去自定义界面。此外开发者也可以子类化SDK中的类,使用子类化的对象,会有更大的改变空间。

笔者也试着去子类化一些常用的界面的类,给笔者留下的印象就是坑太多----子类化的时候有些方法是必须要重载的,SDK系统带有的方法是无法使用的。

具体的例子请参看Demo

/**
 *  重载选择表格事件
 *
 *  @param conversation
 */
-(void)onSelectedTableRow:(RCConversation*)conversation{
    
    
    if(conversation.conversationType == ConversationType_GROUP)
    {
        RCGroupListViewController* groupVC = [[RCGroupListViewController alloc] init];
        self.currentGroupListView = groupVC;
        groupVC.portraitStyle = RCUserAvatarCycle;
        [self.navigationController pushViewController:groupVC animated:YES];
        return;
    }
    //该方法目的延长会话聊天UI的生命周期
    MyChatViewController* chat = [self getChatController:conversation.targetId conversationType:conversation.conversationType];
    if (nil == chat) {
        chat =[[MyChatViewController alloc]init];
        chat.portraitStyle = RCUserAvatarCycle;
        [self addChatController:chat];
    }
    chat.currentTarget = conversation.targetId;
    chat.conversationType = conversation.conversationType;
    //chat.currentTargetName = curCell.userNameLabel.text;
    chat.currentTargetName = conversation.conversationTitle;
    [self.navigationController pushViewController:chat animated:YES];
}
#pragma mark Delegate
- (void)getGroupInfoWithGroupId:(NSString *)groupId completion:(void (^)(RCGroup *))completion
{
    if ([@"101" isEqualToString:groupId]) {
        RCGroup *theGroup = [[RCGroup alloc] init];
        theGroup.groupId = @"101";
        theGroup.groupName = @"好友群";
        completion(theGroup);
    }
    if ([@"102" isEqualToString:groupId]) {
        RCGroup *theGroup = [[RCGroup alloc] init];
        theGroup.groupId = @"102";
        theGroup.groupName = @"家人群";
        completion(theGroup);
    }
    if ([@"103" isEqualToString:groupId]) {
        RCGroup *group3 = [[RCGroup alloc] init];
        group3.groupId = @"103";
        group3.groupName = @"交友群";
        completion(group3);
    }
    if ([@"104" isEqualToString:groupId]) {
        RCGroup *group4 = [[RCGroup alloc] init];
        group4.groupId = @"104";
        group4.groupName = @"本地群";
        completion(group4);
    }
}
- (NSArray *)getFriends
{
    //获得朋友列表的代理方法
    NSMutableArray *array = [[NSMutableArray alloc]init];
    
    RCUserInfo *user1 = [[RCUserInfo alloc]init];
    user1.userId = @"1";
    user1.name = @"小明";
    user1.portraitUri = @"http://ww2.sinaimg.cn/large/005yyi5Jjw1eo7znywduaj30e609g0tx.jpg";
    [array addObject:user1];
    
    RCUserInfo *user2 = [[RCUserInfo alloc]init];
    user2.userId = @"2";
    user2.name = @"小红";
    user2.portraitUri = @"http://ww2.sinaimg.cn/large/005yyi5Jjw1eo7znye2ckj30by0g1q41.jpg";
    [array addObject:user2];
    
    return array;
    
}

测试日志

推送服务注册成功及进入相关界面的log信息

测试日志截图

遇到问题

1.进入聊天界面失败需要对聊天界面的一些属性在初始化的时候设置好,并且保证已经连接服务器才能正常打开聊天界面。 

2.自定义界面。在自定义界面的时候需要除了要继承相关父类之外还需要重载父类一些必要的方法,否则即使继承了父类也无法使用父类实例的相关功能。

3.由于SDK更新非常迅速,遇到问题之后开发者也应该在充分了解文档之后在开发者社区提问以解决自己遇到的问题。

上手难易

IM功能是当下应用的一个大的趋势,因为产品社交化是目前的一个潮流,而集成了IM功能以后能很大程度上促进用户的活跃度和使用率,这是开发商喜闻乐见的。但是如果使用webSocket或者相对成熟的XMPP框架开发,除了需要搭建服务器以外还需要大量的时间花费在界面定制和调试上,所以IM的开发强度可想而知。使用了融云IMSDK以后,这些问题就迎刃而解了。尽管相对简单,但是开发者一定不能忽视一些细节,因为做好用户体验并不是一件简单的事情,融云SDK的使用也是有一定的门槛的。

开发文档

融云对于文档支持的力度很大,有专门的API文档和入门指南,除此之外还有关于SDK基本概念讲解的视频,这些文档可以帮助开发者快速入门,少走弯路,这也恰恰体现了阅读文档的重要性。

http://docs.rongcloud.cn/ios.html

此外融云还列出了开发者经常遇到的问题的解决方法,遇到问题时首先查看这些文档或许比等待技术支持更有效。

http://support.rongcloud.cn/category/Mw

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

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

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

评论(1)
anyetianxiao

anyetianxiao 2015-02-26 11:25:30

之前还没看到评测,速速下来demo看看
回复(0) 赞(0) 赞(1)