iOS集成融云SDK即时通讯

相信大家在项目中会用到即时通讯功能,自己去写的话会需要前后台合作,会大大加大开发的周期,所以考虑使用第三方的即时通讯平台,比如现在有融云,环信....等等等!楼主在项目开发过程中使用到过环信和融云,今天就为大家写下IOS端集成环信的方法和可能会遇到的问题。(融云提供聊天会话列表和聊天界面并且允许我们自定义,所以很方便的)。

一:准备工作
1.首先打开融云官网http://www.rongcloud.cn/,注册自己的账户,并登陆。
2.点击左边创建应用,在打开的小窗口填写你的项目的一些信息(如果正在开发阶段可以选择未运营商务用户,如果项目上线后是需要提交申请审核,后面再讲)。

Paste_Image.png

3.创建好项目过后点击刚刚创建好的项目,并点击左边的"App Key",里面包含开发环境和生产环境,不同环境下的App Key是不一样的,融云基本是免费的,但是他会提供给你一些付费的服务(视自己项目而定)。记录好App Key,因为在后面工程中需要。融云开发环境允许100个测试用户,如果超过了100个测试用户,需要在后台手动添加用户,一次只能添加20个。
4.导入SDK到项目(需要什么功能就导入哪一个sdk模块,楼主只需要简单的聊天功能加聊天界面,所以导入融云 IM 通讯能力库 - RongCloudIM/IMLib
融云 IM 界面组件 - RongCloudIM/IMKit),融云支持下载到本地手动导入,还有一种方式就是使用cocoapods导入,个人觉得使用cocapods导入是最方便的。cocoapods的简介和使用方法转自:http://www.jianshu.com/p/b64b4fd08d3c
5.添加依赖库,Xcode点击左侧项目名 - Build Phases - Link Binary With Libraies 点击下面的加号添加下图的依赖库(Xcode7.0以上版本,相信没人还会用Xcode7.0以下的版本做开发吧!)。
融云依赖库:
Paste_Image.png

系统依赖库:

AssetsLibrary.framework
AudioToolbox.framework
AVFoundation.framework
CFNetwork.framework
CoreAudio.framework
CoreGraphics.framework
CoreLocation.framework
CoreMedia.framework
CoreTelephony.framework
CoreVideo.framework
ImageIO.framework
libc++.tbd
libc++abi.tbd
libsqlite3.tbd
libstdc++.tbd
libxml2.tbd
libz.tbd
MapKit.framework
OpenGLES.framework
QuartzCore.framework
SystemConfiguration.framework
UIKit.framework
Photos.framework
SafariServices.framework

添加完成依赖库后记得需要在 Xcode 项目 Build Settings - Other Linker Flags 中,点击下方加号,增加 "-ObjC"。
如果上面的步骤都已经做完了,可以试着编译以下自己项目,看会不会报错(如果有报错记得留言,我也会为尽我的努力为大家解答),准备工作就到这里了,下面我们开始集成。

二:开始集成回话列表
1.打开工程在Appdelegate里面连接融云服务器,使用融云开发者控制台注册得到的 App Key,通过 RCIM 的单例,传入 initWithAppKey:方法,初始化 SDK。在使用融云 SDK 所有功能(包括显示 SDK 中的 View 或者显示继承于 SDK 的 View )之前,您必须先调用此方法初始化 SDK。 在 App 的整个生命周期中,您只需要将 SDK 初始化一次。

[[RCIM sharedRCIM] initWithAppKey:@"后台应用的AppKey"];

2.连接融云服务器。

[[RCIM sharedRCIM] connectWithToken:@"YourTestUserToken"     success:^(NSString *userId) {
    NSLog(@"登陆成功。当前登录的用户ID:%@", userId);
} error:^(RCConnectErrorCode status) {
    NSLog(@"登陆的错误码为:%ld", status);
} tokenIncorrect:^{
    //token过期或者不正确。
    //如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token
    //如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。
    NSLog(@"token错误");
}];

连接融云服务器的时候需要传给融云服务器一个token,相当于登录融云的一个"用户名",这个"用户名"是你们后台服务器集成的事情,所以你不用管,到时候后台会在你需要的地方返回给你这个token。在测试的时候需要我们在融云控制台获取一个测试的token,用来登录。方法如下

image.png

将token后面的复制下来。
贴上Appdelegate代码

#import "AppDelegate.h"
#import <RongIMLib/RongIMLib.h>
#import <RongIMKit/RongIMKit.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //初始化融云SDK
    [[RCIM sharedRCIM] initWithAppKey:@"6tnym1br65di7"];
    
    //登录融云服务器
    [[RCIM sharedRCIM] connectWithToken:@"0ABt7ILPEShS9stGR+AJgN3bHoP4ztV1ORxxRULm/FLmvyxeqth6/QrQGCuRGPBUkOFQ2cmYVi9C+B2yuDZfcA=="     success:^(NSString *userId) {
        NSLog(@"登陆成功。当前登录的用户ID:%@", userId);
    } error:^(RCConnectErrorCode status) {
        NSLog(@"登陆的错误码为:%ld", (long)status);
    } tokenIncorrect:^{
        //token过期或者不正确。
        //如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token
        //如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。
        NSLog(@"token错误");
    }];
    
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


@end

当登录成功后,控制台会打印出

...
登陆成功。当前登录的用户ID:123
...

这是代表你的用户ID为123的账号已经登录到融云服务器成功,现在可以使用融云的服务了。
3.融云 IMKit 已经实现了一个默认的会话列表视图控制器,您直接使用或继承 RCConversationListViewController,即可快速启动和使用会话列表界面。意思是融云已经给你写好了一个回话列表的界面,我们如果对界面的要求不是很高的话,可以直接继承这个ViewController,并且这个ViewController是可以支持界面的一些修改,所以是不是很方便呢。
首先,新建一个类继承自RCConversationListViewController。

image.png

并在.m文件的- (void)viewDidLoad方法中设置需要显示哪些类型的会话以及哪些类型的会话可以在会话列表页面聚合显示。附上.m文件代码

#import "MyselfListViewController.h"

@interface MyselfListViewController ()

@end

@implementation MyselfListViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //设置需要显示哪些类型的会话,由于楼主只需要单聊功能,所以只设置ConversationType_PRIVATE
    [self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),
                                        ]];
    
    //设置需要将哪些类型的会话在会话列表中聚合显示
    [self setCollectionConversationType:@[@(ConversationType_PRIVATE),
                                          ]];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

这样一个回话列表界面就已经集成完成,我们可以在融云控制着后台发送一条测试消息,看一下回话列表能不能收到消息。

image.png

这样你的会话列表就会收到一条消息。

image.png

这时候你会好奇了,为什么只有消息内容,而没有用户名以及头像呢,这就是融云即时通讯的一个模式,他只负责做消息的转发者,而不会负责管理好友的信息,融云这样说:融云认为,每一个设计良好且功能健全的 App 都应该能够在本地获取、缓存并在合适的时机更新 App 中的用户信息。所以,融云不维护和管理用户基本信息(用户ID、昵称、头像)的获取、缓存、变更和同步。意思是用户的头像用户的名称,全都是保存在自己的服务器,融云只负责管理聊天内容有关的业务,所以现在就有一个问题,如何通过自己的服务器的用户名和头像对应到融云管理的相应的聊天信息呢,我们在后面用到时候在说。

三:开始集成聊天界面
下面我们开始集成聊天界面,融云为我们也准备了一个聊天界面RCConversationViewController,如果项目没有特殊要求,这个聊天界面也能满足我们很项目的需求,当然,融云也是给我们提供进行页面的修改的接口的。
首先新建一个类继承自RCConversationViewController。

image.png

创建好了之后我们需要在继承自RCConversationListViewController的控制器中重写一个方法:- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
conversationModel:(RCConversationModel *)model
atIndexPath:(NSIndexPath *)indexPath方法,来点击会话列表进入相应的聊天界面,再次贴上继承自RCConversationListViewController的会话列表界面.m实现代码

#import "MyselfListViewController.h"
#import "MyselfConversationController.h"

@interface MyselfListViewController ()

@end

@implementation MyselfListViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //设置需要显示哪些类型的会话,由于楼主只需要单聊功能,所以只设置ConversationType_PRIVATE
    [self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),
                                        ]];
    
}

//重写RCConversationListViewController的onSelectedTableRow事件
- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
         conversationModel:(RCConversationModel *)model
               atIndexPath:(NSIndexPath *)indexPath {
    MyselfConversationController *conversationVC = [[MyselfConversationController alloc]init];

//聊天界面的聊天类型
    conversationVC.conversationType = model.conversationType;
//需要打开和谁聊天的会话界面,和谁聊天其实是通过TargetId来联系的。
    conversationVC.targetId = model.targetId;
    conversationVC.title = @"想显示的会话标题";
    [self presentViewController:conversationVC animated:YES completion:NULL];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

这样再次运行项目,点击屏幕的一个会话列表,查看聊天界面效果。

image.png

我一直用的[self presentViewController:conversationVC animated:YES completion:NULL];来打开新的页面,所以没有导航栏,也就没有标题栏。

到了这里大致的融云就已经完成。是不是很简单呢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,336评论 0 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • 关注一下让你成就自己! 做推广,最怕啥? "预算花光光,大家心慌慌。" 微信、网站、论坛、...
    也很幸运阅读 319评论 0 0
  • 《那时》 那时你还小 不谙世故且年少// 那时你还小 嘴角时常有微笑// 那时你还小 不懂父母多辛劳// 那时你还...
    红尘红尘阅读 157评论 0 1
  • 我的人生轨迹可以用岁月静好来形容,日子过得波澜不惊,却少了一点乐趣,自从邂逅简书,短短4个月里,我的生活发生惊人变...
    冷月花魂烘焙阅读 382评论 3 11