iOS開發融雲即時通訊集成詳細步驟


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM