本文為菜鳥窩作者蔣志碧的連載懒鉴〖穑“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP躬拢,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目
【從 0 開始開發(fā)一款直播 APP】10 騰訊云通信及SDK集成
【從 0 開始開發(fā)一款直播 APP】11 IM 登錄實現(xiàn)
對上一篇文章中留下兩個問題沒有解決窿侈。
1做个、獨(dú)立模式和托管模式
賬號登錄集成說明
打開該文檔鸽心,先看看賬號集成的大致步驟,請讀者仔細(xì)閱讀上面的文字居暖,既然筆者都貼出來了顽频,就是經(jīng)過篩選并對開發(fā)有一定用處的。
step 3 創(chuàng)建應(yīng)用在上一章已經(jīng)講過太闺,這里不再講解糯景。
TLS 登錄支持三種模式:1、托管模式 3省骂、獨(dú)立模式 3蟀淮、游客模式
1、托管模式
1.1钞澳、用戶名密碼等賬號信息托管在騰訊后臺怠惶,這是我們在蘋果 AppStore 上的 APP 所采用的模式
1.2、調(diào)用 TLS(tencent login service) 獲取 TLSUserInfo略贮,內(nèi)部包含了短期有效的id和簽名甚疟,這段邏輯詳見 LoginActivity.java
1.3仗岖、使用 TLS 登錄返回的 id 和簽名,調(diào)用 TCLoginMgr 的 imLogin() 函數(shù)完成IM模塊的登錄览妖,之后就可以收發(fā)消息了
2轧拄、獨(dú)立模式
2.1、 如果您已有帳號體系且需要支持可靠的 C2C 消息讽膏,則需要使用此種方式檩电。
此模式的目標(biāo)是將騰訊云通訊模塊跟您的賬號體系結(jié)合起來實現(xiàn)安全可靠的消息通訊。
2.2府树、您先使用自己的登錄邏輯進(jìn)行登錄俐末,之后交給您的服務(wù)器驗證當(dāng)前用戶是不是一個合法的用戶。
2.3奄侠、如果當(dāng)前用戶通過驗證卓箫,您的登錄服務(wù)器要使用跟騰訊云協(xié)商的非對稱加密密鑰對用戶 ID 進(jìn)行簽名。
這就好比您的服務(wù)器給這個用戶 ID 做了擔(dān)保:“這是個好孩子垄潮,我給他擔(dān)保烹卒,有公章在此,請給他通過弯洗÷眉保”
2.4、APP在收到用戶 ID 和簽名后牡整,TCLoginMgr的imLogin() 函數(shù)完成IM模塊的登錄藐吮,之后就可以收發(fā)消息了
3、游客模式
3.1逃贝、 如果您已有帳號體系谣辞,適合使用這種模式,該模式下騰訊云通訊模塊會使用內(nèi)部的一些匿名賬號進(jìn)行消息的收發(fā)秋泳。
3.2潦闲、這種模式下,您只需要調(diào)用TCLoginMgr的guestLogin()函數(shù)即可實現(xiàn)迫皱,內(nèi)部流程跟托管模式類似歉闰,只是賬號換成了隨機(jī)生成的匿名賬號。
3.3卓起、 如果想要將IM模塊跟您的賬號體系進(jìn)行結(jié)合和敬,實現(xiàn)您的兩個賬號間的私信收發(fā),請看獨(dú)立模式戏阅。
2昼弟、sdkAppId 和 accountType。
sdkAppId:用于標(biāo)識接入SDK的應(yīng)用Id奕筐,由騰訊分配舱痘。
accountType:帳號類型变骡,由騰訊分配。
注意:
sdkAppId 和 accountType 這兩個參數(shù)在利用菜鳥窩賬號發(fā)起直播才會用到芭逝,現(xiàn)在登錄的時候返回的都是 null塌碌,在后面發(fā)起直播會詳細(xì)介紹。
從圖中可以看出旬盯,登錄需要使用到這兩個參數(shù)台妆,accountType 是 TIMUser 的一個成員變量。
登錄 SDK 簡介
打開 登錄 SDK 文檔胖翰,主要有以下幾個功能接剩。
1、登錄
查看登錄方法以及參數(shù)列表萨咳。
登錄官方示例
2懊缺、登出
暫時只用到這兩個功能,其它方法讀者自己查看培他。
IM 登錄功能封裝
登錄具體實現(xiàn)請查看 【從 0 開始開發(fā)一款直播 APP】5.1 MVP 完全解析 -- 實現(xiàn)直播登錄
1桐汤、創(chuàng)建 IMLogin 類
IMLogin 主要封裝 IM 登錄需要的相關(guān)方法和回調(diào)。
public class IMLogin {
public static final String TAG = IMLogin.class.getSimpleName();
private static IMLogin mInstace = null;
public IMLogin() {
}
public static IMLogin getInstace() {
if (mInstace == null) {
synchronized (IMLogin.class) {
mInstace = new IMLogin();
}
}
return mInstace;
}
}
2靶壮、IM 登錄方法
根據(jù)官方文檔中提供的 login() ,方法员萍,封裝我們自己的 IMLogin() 方法腾降,里面只需要實現(xiàn)登錄邏輯即可,具體調(diào)用在 presenter 中實現(xiàn)碎绎。
public void login(int sdkAppId,//用于標(biāo)識接入SDK的應(yīng)用Id螃壤,由騰訊分配。
//用戶帳號:
//accountType筋帖,帳號類型奸晴,由騰訊分配。
//appIdAt3rd日麸,使用自有帳號或騰訊開放帳號時寄啼,填寫為與sdkAppId相同的字符串。
//identifier代箭,用戶帳號墩划。
TIMUser user,
java.lang.String userSig,//userSig,用戶帳號簽名嗡综,由私鑰加密獲得乙帮,具體請參考帳號相關(guān)文檔。
TIMCallBack callback)//回調(diào)接口极景。
//-----------------------------------split line ------------------------------------
//云通信服務(wù)相關(guān)配置
//從之前創(chuàng)建的應(yīng)用中獲取 SdkAppId 和 accountType
public static int IMSDK_ACCOUNT_TYPE = 12242;
public static int IMSDK_APPID = 1400029483;
//-----------------------------------split line ------------------------------------
private IMLoginListener mIMLoginListener;
/**
* imsdk登錄接口察净,與tls登錄驗證成功后調(diào)用
* @param identify 用戶id驾茴,后臺生成的 user_sig 的用戶信息
* @param sigId 用戶簽名(托管模式下由TLSSDK生成,獨(dú)立模式下由開發(fā)者在IMSDK云通信后臺確定加密秘鑰)
*/
public void imLogin(String identify, String sigId) {
//用戶實體類
TIMUser user = new TIMUser();
user.setAccountType(String.valueOf(Constants.IMSDK_ACCOUNT_TYPE));
user.setAppIdAt3rd(String.valueOf(Constants.IMSDK_APPID));
user.setIdentifier(identify);
//發(fā)起登錄請求氢卡,調(diào)用騰訊的IMLogin
TIMManager.getInstance().login(Constants.IMSDK_APPID, user, sigId, new TIMCallBack() {
@Override
public void onError(int i, String s) {
Log.e(TAG, "imLogin onError i:" + i + ",info:" + s);
if (null != mIMLoginListener)
mIMLoginListener.onFailure(i, s);
}
@Override
public void onSuccess() {
Log.e(TAG, "imLogin onSuccess");
if (null != mIMLoginListener)
mIMLoginListener.onSuccess();
}
});
}
登錄中使用到接口回調(diào)锈至,具體如下:
/**
* 騰訊云登錄回調(diào)接口
* Login 回調(diào)
*/
public interface IMLoginListener {
/**
* 登錄成功
*/
void onSuccess();
/**
* 登錄失敗
* @param code 錯誤碼
* @param msg 錯誤信息
*/
void onFailure(int code, String msg);
}
3、IM 登出方法
// 登出
public void logout(TIMCallBack callback)//IM 登出
//-----------------------------------split line -----------------------------------
//IMSDK登出
public void imLoginOut() {
TIMManager.getInstance().logout(new TIMCallBack() {
@Override
public void onError(int i, String s) {
Log.e(TAG, "IMLogout failure :" + i + " msg " + s);
}
@Override
public void onSuccess() {
Log.e(TAG, "IMLogout success");
}
});
}
IM 登錄初始化
public class LiveApplication extends Application{
private static LiveApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
//初始化 IMSDK
IMInitMgr.init(getApplicationContext());
//初始化 IMLogin
IMLogin.getInstace();
Log.e("imLogin",TIMManager.getInstance().getVersion());
}
public static LiveApplication getInstance(){
return instance;
}
}
IM 登錄實現(xiàn)
在 LoginPresenter.java 類中定義 IMLogin异吻,并實現(xiàn) IMLogin.IMLoginListener 接口裹赴。
public class LoginPresenter extends ILoginPresenter implements IMLogin.IMLoginListener {
//IMLogin
private IMLogin mIMLogin = IMLogin.getInstace();
@Override
public void onSuccess() {
}
@Override
public void onFailure(int code, String msg) {
}
}
在用戶名登錄方法中調(diào)用 IM 登錄方法。只需要將原來的 login 方法替換即可诀浪。
@Override
public void userNameLogin(final String userName, final String password) {
if (checkUserNameLogin(userName, password)) {
LoginRequest request = new LoginRequest(RequestComm.loginUsername, userName, password);
AsyncHttp.instance().postJson(request, new AsyncHttp.IHttpListener() {
@Override
public void onStart(int requestId) {
mLoginView.showLoading();
}
@Override
public void onSuccess(int requestId, Response response) {
if (response.getStatus() == RequestComm.SUCCESS) {
UserInfo info = (UserInfo) response.getData();
UserInfoCache.saveCache(mLoginView.getContext(), info);
ACache.get(mLoginView.getContext()).put(CacheConstants.LOGIN_USERNAME, userName);
ACache.get(mLoginView.getContext()).put(CacheConstants.LOGIN_PASSWORD, password);
//設(shè)置監(jiān)聽回調(diào)
mIMLogin.setIMLoginListener(LoginPresenter.this);
//IM登錄
mIMLogin.imLogin(info.getUserId(), info.getSigId());
//將原來的 login 方法替換即可
//mLoginView.loginSuccess();
} else {
mLoginView.loginFailed(response.getStatus(), response.getMsg());
mLoginView.dismissLoading();
}
}
@Override
public void onFailure(int requestId, int httpStatus, Throwable error) {
mLoginView.loginFailed(httpStatus, error.getMessage());
mLoginView.dismissLoading();
}
});
}
}
實現(xiàn) onSuccess() 和 onFailure() 即可棋返。
@Override
public void onSuccess() {
Log.e(TAG, "onSuccess:login success");
//移除監(jiān)聽
mIMLogin.removeIMLoginListener();
//登錄成功提示
mLoginView.dismissLoading();
mLoginView.loginSuccess();
}
@Override
public void onFailure(int code, String msg) {
Log.e(TAG, "onFailure:login failed");
mLoginView.dismissLoading();
mLoginView.loginFailed(code,msg);
}
運(yùn)行程序
在控制臺過濾之后可以看到登錄成功并打印出登錄信息.。
每個程序猿必備的110本經(jīng)典編程書雷猪,免費(fèi)領(lǐng)取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA