騰訊云通訊IMSDK

詳細功能介紹文檔中心
集成SDK下載

1.gif

2.gif

因為我這里不集成服務器,所以我選擇托管模式,由騰訊服務器負責保存用戶信息和負責用戶數據的校驗工作(注意每個創(chuàng)建的應用只能選擇一次模式,如果需要修改賬號體系,只能重新創(chuàng)建應用)


快速集成登陸注冊功能:效果圖如下

4.gif

騰訊登錄服務(Tencent Login Service,TLS)是騰訊為開發(fā)者快速完成帳號集成接入音視頻或即時通信云服務(后面簡稱云服務)而提供的一套通用帳號登錄組件。實現包括QQ、微信、新浪微博、人人在內的多種帳號類型登錄使用云服務。開發(fā)者可以通過簡單的SDK集成,便捷的接口調用,即可實現原本復雜的登錄驗證服務,使代碼量急劇減少。
TLS SDK 開發(fā)手冊集成
TLS SDK 不需要用戶每次都手動登錄,通過調用[[TLSLoginHelper getInstance] needlogin:@"用戶賬號"],如果返回結果為 false, 即可以直接調用換票接口登錄,拿到最新票據。否則完成完整的登錄流程。

//請求刷新票據
NSString * userAccount = [[TLSLoginHelper getInstance] getLastUserInfo].identifier;
if (![[TLSLoginHelper getInstance] needLogin:userAccount ])
{
// userAccount 用戶最近一次使用的帳號
// self 刷新票據回調,需要實現TLSPwdLoginListener協(xié)議,不能為nil
    [[TLSLoginHelper getInstance] TLSRefreshTicket:userAccount andTLSRefreshTicketListener:self];
}
成功回調....
失敗或超時回調如下,此時可以重新走登錄流程

獲取UserSig:
https://www.qcloud.com/doc/product/269/1508
https://www.qcloud.com/doc/product/269/1509


初始化:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化IMSDk
   TIMManager *manager =  [TIMManager sharedInstance];
    [manager setLogLevel:(TIM_LOG_NONE)];
    [manager disableCrashReport];
    [manager initSdk:1400014178 accountType:@"7221"];
    [manager setUserStatusListener:self];//設置用戶狀態(tài)通知回調

 //初始化QalSDK--網絡接入服務
   [[QalSDKProxy sharedInstance]initWithAppid:1400014178 andSDKAppid:1400014178 andAccType:7221];
 //初始化TLSAccountHelper 實例
 //強烈注意:TLSSDK依賴QALSDK,因此需要先初始化QALSDK。
   [[TLSAccountHelper getInstance]init:1400014178 andAccountType:7221 andAppVer:@"1.0"];
   [[TLSLoginHelper getInstance]init:1400014178 andAccountType:7221 andAppVer: @"1.0"];


    TLSLoginHelper *helper = [[TLSLoginHelper getInstance];
    //獲取最后一些登錄的用戶
    TLSUserInfo *user = [helper getLastUserInfo];
    //判斷用戶是否需要自動登錄
    BOOL login = [helper needLogin:user.identifier];
    if (login == YES) {
        //重新登錄
        self.window.rootViewController = [[LoginViewController alloc]init];
    }else
    {//TLS 不需要登錄后,登錄TIMSDK
        TIMLoginParam *login = [[TIMLoginParam alloc]init];
        login.accountType = @"7221";
        login.identifier = user.identifier;
        login.userSig = [[TLSHelper getInstance] getTLSUserSig:user.identifier];
        login.sdkAppId = 1400014178;
        login.appidAt3rd = @"1400014178";
        [[TIMManager sharedInstance] login:login succ:^{
            aleraView(@"登陸成功");
        } fail:^(int code, NSString *msg) {
            aleraView(@"登陸失敗");
           if (code == 6208) {
            aleraView(msg);
        }
        }];
    return YES;
}

#pragma - TIMUserStatusListener
/**
 *  踢下線通知
 */
-(void)onForceOffline{
    aleraView(@"用戶被踢");
}

/**
 *  斷線重連失敗
 */
-(void)onReConnFailed:(int)code err:(NSString *)err{
    aleraView(@"斷線重連失敗");
}

/**
 *  用戶登錄的userSig過期(用戶需要重新獲取userSig后登錄)
 */
- (void)onUserSigExpired{
    aleraView(@"用戶登錄的userSig過期");
}

注冊

/**
 *  字符串賬號+密碼注冊接口
 *  @param account - 用戶輸入的賬號名,最長不得超過24字節(jié)
 *  @param password - 用戶輸入的密碼,密碼最短8字節(jié),最長16字節(jié)
 *  @param listener - 回調接口 需要實現TLSStrAccountRegProtocol協(xié)議
 *  @return 0表示調用成功;其他表示調用失敗,返回碼見:_TLS_RETURN_VALUES
 */
    [[TLSAccountHelper getInstance]TLSStrAccountReg:self.nameTextField.text andPassword:self.passWordTextField.text andTLSStrAccountRegListener:self];
//遵守TLSStrAccountRegListener 協(xié)議
#pragma mark - TLSStrAccountRegListener

- (void)OnStrAccountRegSuccess:(TLSUserInfo *)userInfo
{
    NSLog(@"TLS注冊成功---userInfo = %@",userInfo);
    aleraView(@"注冊成功");
}

-(void)OnStrAccountRegFail:(TLSErrInfo *)errInfo
{
    NSLog(@"TLS注冊失敗---errInfo = %@",errInfo);
    aleraView(@"注冊失敗");
}

-(void)OnStrAccountRegTimeout:(TLSErrInfo *)errInfo
{
    NSLog(@"TLS注冊超時---errInfo = %@",errInfo);
}

在多數情況下,用戶需要感知新消息的通知,這時只需注冊新消息通知回調 TIMMessageListener,在用戶登錄狀態(tài)下,會拉取離線消息,為了不漏掉消息通知,需要在登錄之前注冊新消息通知。

 [[TIMManager sharedInstance] setMessageListener:(self)];
   //遵守TIMMessageListener 協(xié)議

- (void) onNewMessage:(NSArray *)msgs{
    aleraView([msgs objectAtIndex:0]);
}

登陸視頻:https://www.qcloud.com/course/detail/96
需要再TLS登錄成功后,繼續(xù)登錄IMSDK

 //輸入用戶名和密碼,調用密碼登錄接口
[[TLSAccountHelper getInstance]TLSStrAccountReg:_name.text andPassword:_password.text andTLSStrAccountRegListener:self];
 //遵守TLSPwdLoginListener 協(xié)議
#pragma mark -TLSPwdLoginListener
/**
 *  密碼登陸要求驗證圖片驗證碼
 *
 *  @param picData 圖片驗證碼
 *  @param errInfo 錯誤信息
 */
-(void)OnPwdLoginNeedImgcode:(NSData *)picData andErrInfo:(TLSErrInfo *)errInfo
{
    NSLog(@"登錄異常請輸入圖片驗證碼----errInfo = %@", errInfo);
}

/**
 *  密碼登陸請求圖片驗證成功
 *
 *  @param picData 圖片驗證碼
 */
-(void)OnPwdLoginReaskImgcodeSuccess:(NSData *)picData
{
    NSLog(@"圖片驗證碼驗證成功---%@",picData);
}

/**
 *  密碼登陸成功
 *
 *  @param userInfo 用戶信息
 */
-(void)OnPwdLoginSuccess:(TLSUserInfo *)userInfo
{
  NSLog(@"TLS 密碼登錄成功----errInfo = %@",userInfo);
    //登錄
    TIMLoginParam *login = [[TIMLoginParam alloc]init];
    login.accountType = @"7221";
    login.identifier = _name.text;
    login.userSig = [[TLSHelper getInstance] getTLSUserSig:userInfo.identifier];
    login.sdkAppId = 1400014178;
    login.appidAt3rd = @"1400014178";
    
    [[TIMManager sharedInstance] login:login succ:^{
        aleraView(@"登陸成功");
    } fail:^(int code, NSString *msg) {
        aleraView(@"登陸失敗");
         if (code == 6208) {
            aleraView(msg);
        }
    }];
}
/**
 *  密碼登陸失敗
 *
 *  @param errInfo 錯誤信息
 */
-(void)OnPwdLoginFail:(TLSErrInfo *)errInfo
{
    NSLog(@"密碼登錄失敗----errInfo = %@",errInfo);
}

/**
 *  密碼登陸超時
 *
 *  @param errInfo 錯誤信息
 */
-(void)OnPwdLoginTimeout:(TLSErrInfo *)errInfo
{
    NSLog(@"密碼登錄超時----errInfo = %@",errInfo);
}

登出

    [[TIMManager sharedInstance] logout:^{
        aleraView(@"登出成功");
    } fail:^(int code, NSString *msg) {
        aleraView(@"登出失敗");
    }];

用戶在線狀態(tài)通知

[manager setUserStatusListener:self];//設置用戶狀態(tài)通知回調
//遵守TIMUserStatusListener 協(xié)議
/**
 *  踢下線通知
 */
-(void)onForceOffline{
    aleraView(@"用戶被踢");
}

/**
 *  斷線重連失敗
 */
-(void)onReConnFailed:(int)code err:(NSString *)err{
    aleraView(@"斷線重連失敗");
}

/**
 *  用戶登錄的userSig過期(用戶需要重新獲取userSig后登錄)
 */
- (void)onUserSigExpired{
    aleraView(@"用戶登錄的userSig過期");
}

發(fā)送一條消息

    TIMMessage * msg = [[TIMMessage alloc]init];
    TIMTextElem * elem = [[TIMTextElem alloc]init];
    [elem setText:@"我發(fā)了一條消息"];
    [msg addElem:elem];
    TIMConversation * sess = [[TIMManager sharedInstance ]getConversation:TIM_C2C receiver:@"tom1"];
    [sess sendMessage:msg succ:^{
        aleraView(@"發(fā)送成功");
    } fail:^(int code, NSString *msg) {
        aleraView(@"發(fā)送失敗");
    }];

獲取消息

    TIMConversation * sess = [[TIMManager sharedInstance]getConversation:TIM_C2C receiver:@"tom1"];
    [sess getMessage:2 last:nil succ:^(NSArray *msgs) {
        aleraView(@"獲取消息成功");
    } fail:^(int code, NSString *msg) {
        aleraView(@"獲取消息失敗");
    }];

消息通知

 [[TIMManager sharedInstance]setMessageListener:(self)];//消息通知回調
//遵守TIMMessageListener 協(xié)議

-(void)onNewMessage:(NSArray *)msgs{
    aleraView([msgs objectAtIndex:0]);
}

刷新會話未讀記數

[[TIMManager sharedInstance] setRefreshListener:(self)];
//遵守TIMRefreshListener 協(xié)議

-(void)onRefresh{
    //重新獲取會話列表 刷新會話未讀記數
    NSArray * lis = [[TIMManager sharedInstance]getConversationList];
    int unread = 0;
    for (TIMConversation * sess in lis) {
        unread += [sess getUnReadMessageNum];
    }
    NSString * unRead = [NSString stringWithFormat:@"未讀計數%d",unread];
    aleraView(unRead);
}

用戶資料與關系鏈

//設置自己的昵稱
    NSString * nick = @"123";
   [[TIMFriendshipManager sharedInstance] SetNickname:nick succ:^() {
        NSLog(@"SetNickname Succ");
    } fail:^(int code, NSString * err) {
        NSLog(@"SetNickname fail: code=%d err=%@", code, err);
    }];

//好友驗證方式
TIMFriendAllowType allowType = TIM_FRIEND_NEED_CONFIRM;
[[TIMFriendshipManager sharedInstance] SetAllowType:allowType succ:^() {
    NSLog(@"SetAllowType Succ");
} fail:^(int code, NSString * err) {
    NSLog(@"SetAllowType fail: code=%d err=%@", code, err);
}];

//設置自己的頭像
NSString * faceUrl = @"http://faceurl";

[[TIMFriendshipManager sharedInstance] SetFaceURL:faceUrl succ:^() {
    NSLog(@"SetFaceURL Succ");
} fail:^(int code, NSString * err) {
    NSLog(@"SetFaceURL fail: code=%d err=%@", code, err);
}];

//獲取自己的資料
[[TIMFriendshipManager sharedInstance] GetSelfProfile:^(TIMUserProfile * profile) {
    NSLog(@"GetSelfProfile identifier=%@ nickname=%@ allowType=%d", profile.identifier, profile.nickname, profile.allowType);
} fail:^(int code, NSString * err) {
    NSLog(@"GetSelfProfile fail: code=%d err=%@", code, err);
}];

//獲取好友的資料
NSMutableArray * arr = [[NSMutableArray alloc] init];

[arr addObject:@"iOS_002"];
[arr addObject:@"iOS_003"];

[[TIMFriendshipManager sharedInstance] GetFriendsProfile:arr succ:^(NSArray * arr) {
    for (TIMUserProfile * profile in arr) {
        NSLog(@"user=%@", profile);
    }
}fail:^(int code, NSString * err) {
    NSLog(@"GetFriendsProfile fail: code=%d err=%@", code, err);
}];


//添加好友
NSMutableArray * users = [[NSMutableArray alloc] init];

TIMAddFriendRequest* req = [[TIMAddFriendRequestalloc] init];

// 添加好友 iOS_002
req.identifier = [NSString stringWithUTF8String:"iOS_002"];
// 添加備注 002Remark
req.remark = [NSString stringWithUTF8String:"002Remark"];
// 添加理由
req.addWording = [NSString stringWithUTF8String:"i am 002"];

[users addObject:req];

[[TIMFriendshipManager sharedInstance] AddFriend:users succ:^(NSArray * arr) {
    for (TIMFriendResult * res in arr) {
        if (res.status != TIM_FRIEND_STATUS_SUCC) {
            NSLog(@"AddFriend failed: user=%@ status=%d", res.identifier, res.status);
        }
        else {
            NSLog(@"AddFriend succ: user=%@ status=%d", res.identifier, res.status);
        }
    }
} fail:^(int code, NSString * err) {
    NSLog(@"add friend fail: code=%d err=%@", code, err);
}];


//同意/拒絕 好友申請
/**
 *  響應對方好友邀請
 *
 *  @param users     響應的用戶列表,TIMFriendResponse列表
 *  @param succ      成功回調,返回 TIMFriendResult* 列表
 *  @param fail      失敗回調
 *
 *  @return 0 發(fā)送請求成功
 */
-(int) DoResponse:(NSArray*)users succ:(TIMFriendSucc)succ fail:(TIMFail)fail;


// 獲取所有好友
[[TIMFriendshipManager sharedInstance] GetFriendList:^(NSArray * arr) {
    for (TIMUserProfile * profile in arr) {
        NSLog(@"friend: %@", profile.identifier);
    }
}fail:^(int code, NSString * err) {
    NSLog(@"GetFriendList fail: code=%d err=%@", code, err);;
}];

ImSDK離線推送視頻

離線推送

3.gif

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,831評論 0 15
  • 云通訊簡介 騰訊是國內最大也是最早的即時通信開發(fā)商,QQ和微信已經成為每個互聯網用戶必不可少的應用。現在,騰訊將高...
    captain_Lu閱讀 20,806評論 12 10
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,618評論 25 708
  • 中國古代有一對夫婦,因為家庭的階級差異,在婚后被迫分離,每年只有七月初七這天可以見上一面。 后來他們的故事變成民間...
    瀾潤她世界閱讀 281評論 0 0