1.融雲即時通訊iOS SDK下載地址 http://rongcloud.cn/downloads 選擇iOS SDK下載
2.進行應用開發之前,需要先在融雲開發者平台創建應用,如果您已經注冊了融雲開發者帳號,請前往 融雲開發者平台 創建應用;如果您還沒有注冊融雲開發者帳號,請前往 融雲官方網站 首先注冊開發者帳號,注冊后創建應用。注冊地址 https://developer.rongcloud.cn/signup
3.登陸融雲開發者平台 https://developer.rongcloud.cn/signin 創建應用
4.進入后台之后點擊創建應用,進入這樣一個創建界面
圖1
5.最后點擊創建 點擊我的應用 然后在左邊點擊我的應用名稱
圖2
6.點擊AppKey進入
圖3
7.手動安裝融雲即時通訊SDK
7.1將下載好的最新的融雲SDK導入到自己的項目中
7.2添加依賴庫 在Build Phases中第三個選項link中點擊左下角+號添加依賴庫
所需的依賴庫
圖4
8.獲取Token
和第五步一樣,進入融雲后台點擊我的應用—>自己的應用名稱—>IM服務—>API調試
右邊會進入一個界面,在這里獲取調試Token
圖5
填的時候可以按照這個參數填,就是個案例
用戶 Id:
userId = "1" // 用戶在融雲系統中唯一的身份 Id,可為任意數字或字符串,但必須保證全局唯一。
用戶名稱:
name = "韓梅梅" // 用戶的顯示名稱,用來在 Push 推送時,或者客戶端沒有提供用戶信息時,顯示用戶的名稱。
用戶頭像圖片:
portraitUri = "http://rongcloud-web.qiniudn.com/docs_demo_rongcloud_logo.png"
現在我們獲得了AppKey和Token了 這是假數據,后面token會發送請求獲取
當然在我們的真實項目中,我們的Token是通過發送網絡請求獲取的,具體怎么發看后台給你的數據
在AppDelegate.m文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}方法里鏈接融雲服務器,到下面步驟中我會演示在這個方法里的獲取token ,一般是在用戶登陸成功之后發送請求獲取token,在.m文件這個方法里先鏈接融雲服務器,
然后在登陸成功之后斷開融雲服務器,然后再連接上
9.下面就開始快速集成了
9.1
在自己的項目中AppDelegate.h文件中導入頭文件
#import <RongIMLib/RongIMLib.h>
#import <RongIMKit/RongIMKit.h>
然后遵守RCIMConnectionStatusDelegate這個代理方法
即變成這樣@interface AppDelegate : UIResponder <UIApplicationDelegate,RCIMConnectionStatusDelegate>
9.2在AppDelegate.m文件中導入頭文件
//融雲即時通訊
#import <RongIMKit/RongIMKit.h>
#import <RongIMLib/RongIMLib.h>
#import <UIKit/UIKit.h>
然后將獲得的融雲的AppKey 寫成一個宏 如下 將自己的AppKey 替換即可\
k51hidwq1bbcdds4b將這個換成自己的即可
//融雲即時通訊AppKey
#define RONGCLOUD_IM_APPKEY @"k51hidwq1bbcdds4b"
10.在AppDelegate.m的文件中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}
方法中加入以下代碼
//融雲即時通訊
//初始化融雲SDK。
[[RCIM sharedRCIM] initWithAppKey:RONGCLOUD_IM_APPKEY];
//從本地獲取token
NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
//判斷是否存在token連接融雲
if (token) {
[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
// [[RCIM sharedRCIM] setUserInfoDataSource:self];
} error:^(RCConnectErrorCode status) {
NSLog(@"login error status: %ld.", (long)status);
} tokenIncorrect:^{
NSLog(@"token 無效 ,請確保生成token 使用的appkey 和初始化時的appkey 一致");
}];
}
/**
* 推送處理1
*/
if ([application
respondsToSelector:@selector(registerUserNotificationSettings:)]) {
//注冊推送, iOS 8
UIUserNotificationSettings *settings = [UIUserNotificationSettings
settingsForTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
//融雲即時通訊
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didReceiveMessageNotification:)
name:RCKitDispatchMessageNotification
object:nil];
[[RCIM sharedRCIM] setConnectionStatusDelegate:self];
加入到方法中的代碼到這里
下面是單獨的方法 直接加在AppDelegate.m的文件中即可
/**
* 將得到的devicetoken 傳給融雲用於離線狀態接收push ,您的app后台要上傳推送證書
*
* @param application <#application description#>
* @param deviceToken <#deviceToken description#>
*/
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token =
[[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"
withString:@""]
stringByReplacingOccurrencesOfString:@">"
withString:@""]
stringByReplacingOccurrencesOfString:@" "
withString:@""];
[[RCIMClient sharedRCIMClient] setDeviceToken:token];
}
/**
* 網絡狀態變化。
*
* @param status 網絡狀態。
*/
- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status {
if (status == ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"提示"
message:@"您"
@"的帳號在別的設備上登錄,您被迫下線!"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles:nil, nil];
[alert show];
//注意這里下面的4行,根據自己需要修改 也可以注釋了,但是只能注釋這4行,網絡狀態變化這個方法一定要實現
ViewController *loginVC = [[ViewController alloc] init];
UINavigationController *_navi =
[[UINavigationController alloc] initWithRootViewController:loginVC];
self.window.rootViewController = _navi;
}
}
- (void)didReceiveMessageNotification:(NSNotification *)notification {
[UIApplication sharedApplication].applicationIconBadgeNumber =
[UIApplication sharedApplication].applicationIconBadgeNumber + 1;
}
獲取token
在你的登陸控制器 ,登陸成功之后
一般后台會返回你一個用來裝個人信息的字典
你將這個字典寫入沙盒保存起來,以方便后面的使用
不懂的可以參考:http://www.cnblogs.com/ithongjie/p/5320489.html
下面繼續,在你登陸成功之后,根據你需要發送的參數來從沙盒中獲取看這個值存不存在,然后再根據存不存在發送請求
//獲取用戶信息賬號模型 我這是一個工具類,不懂的參考:http://www.cnblogs.com/ithongjie/p/5320489.html
YYCAccount *account=[YYCAccountTool account];
if (account.name) { //因為我發送請求的時候需要發name這個字段,所以取出來用來判斷存不存在
int did=account.uid;
NSString *url=YYCUrl(@"/rongcloudToken/"); //獲取token需要的請求鏈接 后台給你,還有下面的參數后台會給你
NSMutableDictionary *params=[NSMutableDictionary dictionary];
//根據后台給你的參數來發參數
params[@"userId"]=[NSNumber numberWithInt:did];
params[@"userName"]=account.name;
if (account.filename) { //這個一般是融雲聊天時用戶的頭像 ,一般是必傳,沒有可以選個默認的
params[@"avartUrl"]=YYCHomeImageUrl(2, account.filename);
}else{
params[@"avartUrl"]=YYCHomeImageUrl(2, @"avartar.png");
}
//發送get請求獲取token
[YYCHttpTool GET:url params:params success:^(id json) {
NSDictionary *dict=json;
YYCLog(@"%@",dict);
//獲取融雲Token
NSString *token=dict[@"token"];
//將token存到本地
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
[defaults setObject:token forKey:@"token"];
[defaults synchronize];
//斷開融雲鏈接
[[RCIM sharedRCIM] disconnect];
//鏈接融雲
[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
// [[RCIM sharedRCIM] setUserInfoDataSource:self];
} error:^(RCConnectErrorCode status) {
NSLog(@"login error status: %ld.", (long)status);
} tokenIncorrect:^{
NSLog(@"token 無效 ,請確保生成token 使用的appkey 和初始化時的appkey 一致");
}];
11.開始創建會話
先創建一個繼承RCConversationListViewController名為ChatListViewController的控制器
創建之后的控制器.h文件即為
#import <UIKit/UIKit.h>
#import <RongIMKit/RongIMKit.h>
@interface ChatListViewController : RCConversationListViewController
@end
這樣的樣式
在你要創建即時會話的界面的控制器的.h文件中導入頭文件
//融雲即時通訊
#import <RongIMKit/RongIMKit.h>
並遵守數據源方法RCIMUserInfoDataSource
即變成了
#import <RongIMKit/RongIMKit.h>
@interface ViewController : UIViewController<RCIMUserInfoDataSource>
在.m文件中導入頭文件
//融雲即時通訊
#import "ChatListViewController.h"
#import <RongIMKit/RCConversationViewController.h>
現在在我們界面的右上角有一個會話列表按鈕,點擊會話列表進入會話列表界面
/**
* 點擊了會話列表
*/
-(void)chatList
{
[[RCIM sharedRCIM] setUserInfoDataSource:self];
dispatch_async(dispatch_get_main_queue(), ^{
//跳轉到會話列表界面
ChatListViewController *chatListViewController = [[ChatListViewController alloc]init];
[self.navigationController pushViewController:chatListViewController animated:YES];
});
}
如果在這個界面都是你的聯系人,一個tableView,每行一個聯系人,如果你想點擊每一個人的時候直接進入聊天界面也可以,在
/**
* 點擊cell跳轉界面執行的方法
*
* @param tableView <#tableView description#>
* @param indexPath <#indexPath description#>
*/
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//這個就是你這個tableView的數據模型和數組 一個模型裝一個聯系人的信息
YYCMainDoctorStatus *status=self.status[indexPath.row];
//數據源方法,要傳遞數據必須加上
[[RCIM sharedRCIM] setUserInfoDataSource:self];
//直接跳到聊天界面
RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];
conversationVC.conversationType =ConversationType_PRIVATE;
//一般在這個數據模型里會有每一個聯系人的UserId,姓名,然后title一般和用戶名一樣即可
conversationVC.targetId =[NSString stringWithFormat:@"%d",status.did]; //這里模擬自己給自己發消息,您可以替換成其他登錄的用戶的UserId
conversationVC.userName = status.doctorName;
conversationVC.title = status.doctorName;
//跳轉到控制器,直接會話聊天界面
[self.navigationController pushViewController:conversationVC animated:YES];
}
/**
*此方法中要提供給融雲用戶的信息,建議緩存到本地,然后改方法每次從您的緩存返回
*/
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void(^)(RCUserInfo* userInfo))completion
{
//獲取用戶賬戶信息
YYCAccount *account=[YYCAccountTool account];
//獲取用戶id
int did=account.uid;
//自己的信息
if (did==[userId intValue]) {
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId =[NSString stringWithFormat:@"%d",did];
user.name = account.name;
if (![account.filename isEqualToString:@""]) {
user.portraitUri = YYCHomeImageUrl(1, account.filename);
}else{
user.portraitUri = YYCHomeImageUrl(2, @"avartar.png");
// YYCHomeImageUrl(2, @"avartar.png")
}
return completion(user);
}
//聊天對象的信息 和誰聊天的信息
YYCMainDoctorStatus *statusUser;
//遍歷數據模型 取用戶id和userId想對應的取出來
for (YYCMainDoctorStatus *status in self.status) {
if (status.did == [userId intValue]) {
statusUser = status;
break;
}
}
//傳遞聊天對象的信息 id 名字 頭像鏈接 注意,這里一定要傳一個鏈接
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId = userId;
user.name = statusUser.doctorName;
//如果聊天對象的頭像不為空用網絡的
if (![statusUser.doctorIcon isEqualToString:@""]) {
user.portraitUri = YYCHomeImageUrl(1, statusUser.doctorIcon);
}else{//如果為空,用個替代的鏈接圖片
user.portraitUri = YYCHomeImageUrl(2, @"avartar.png");
}
return completion(user);
}
下面代碼都一樣
下面就是在我們的ChatListViewController.h文件中
#import <RongIMKit/RongIMKit.h>
#import <RongIMKit/RongIMKit.h>
@interface ChatListViewController : RCConversationListViewController
@end
在.m文件中 這是會話列表界面 一般都是默認,不用改什么東西,你可以將退出和單聊去掉,根據自己需要
現在時界面搭建 這樣界面就搭建好了
// 會話聊天界面
#import "ChatListViewController.h"
@interface ChatListViewController ()
@end
@implementation ChatListViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),@(ConversationType_DISCUSSION)]];
//自定義導航左右按鈕
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc]initWithTitle:@"單聊" style:UIBarButtonItemStylePlain target:self action:@selector(rightBarButtonItemPressed:)];
[rightButton setTintColor:[UIColor whiteColor]];
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
backBtn.frame = CGRectMake(0, 6, 67, 23);
UIImageView *backImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navigator_btn_back"]];
backImg.frame = CGRectMake(-10, 0, 22, 22);
[backBtn addSubview:backImg];
UILabel *backText = [[UILabel alloc] initWithFrame:CGRectMake(12, 0, 65, 22)];
backText.text = @"退出";
backText.font = [UIFont systemFontOfSize:15];
[backText setBackgroundColor:[UIColor clearColor]];
[backText setTextColor:[UIColor whiteColor]];
[backBtn addSubview:backText];
[backBtn addTarget:self action:@selector(leftBarButtonItemPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithCustomView:backBtn];
[self.navigationItem setLeftBarButtonItem:leftButton];
self.navigationItem.rightBarButtonItem = rightButton;
self.conversationListTableView.tableFooterView = [UIView new];
}
/**
*重寫RCConversationListViewController的onSelectedTableRow事件
*
* @param conversationModelType 數據模型類型
* @param model 數據模型
* @param indexPath 索引
*/
-(void)onSelectedTableRow:(RCConversationModelType)conversationModelType conversationModel:(RCConversationModel *)model atIndexPath:(NSIndexPath *)indexPath
{
RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];
conversationVC.conversationType =model.conversationType;
conversationVC.targetId = model.targetId;
conversationVC.userName =model.conversationTitle;
conversationVC.title = model.conversationTitle;
[self.navigationController pushViewController:conversationVC animated:YES];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tabBarController.navigationItem.title = @"會話";
}
/**
* 退出登錄
*
* @param sender <#sender description#>
*/
- (void)leftBarButtonItemPressed:(id)sender {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"確定要退出?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"退出", nil];
[alertView show];
}
/**
* 重載右邊導航按鈕的事件 zheli
*
* @param sender <#sender description#>
*/
-(void)rightBarButtonItemPressed:(id)sender
{
RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];
conversationVC.conversationType =ConversationType_PRIVATE;
conversationVC.targetId = @"user"; //這里模擬自己給自己發消息,您可以替換成其他登錄的用戶的UserId
conversationVC.userName = @"測試1";
conversationVC.title = @"自問自答";
[self.navigationController pushViewController:conversationVC animated:YES];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
[[RCIM sharedRCIM]disconnect];
[self.navigationController popViewControllerAnimated:YES];
}
}
@end
這樣就集成好了
更多進階請參考一下官方文檔
官方網站集成文檔地址:http://www.rongcloud.cn/docs/ios.html