因為我這里不集成服務器,所以我選擇托管模式,由騰訊服務器負責保存用戶信息和負責用戶數據的校驗工作(注意每個創(chuàng)建的應用只能選擇一次模式,如果需要修改賬號體系,只能重新創(chuàng)建應用)
快速集成登陸注冊功能:效果圖如下
騰訊登錄服務(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);;
}];