本文為菜鳥窩作者蔣志碧的連載。“從 0 開始開發一款直播 APP ”系列來聊聊時下最火的直播 APP,如何完整的實現一個類"騰訊直播"的商業化項目
【從 0 開始開發一款直播 APP】10 騰訊云通信及SDK集成
【從 0 開始開發一款直播 APP】11 IM 登錄實現
對上一篇文章中留下兩個問題沒有解決。
1、獨立模式和托管模式
賬號登錄集成說明
打開該文檔,先看看賬號集成的大致步驟,請讀者仔細閱讀上面的文字,既然筆者都貼出來了,就是經過篩選并對開發有一定用處的。
step 3 創建應用在上一章已經講過,這里不再講解。
TLS 登錄支持三種模式:1、托管模式 3、獨立模式 3、游客模式
1、托管模式
1.1、用戶名密碼等賬號信息托管在騰訊后臺,這是我們在蘋果 AppStore 上的 APP 所采用的模式
1.2、調用 TLS(tencent login service) 獲取 TLSUserInfo,內部包含了短期有效的id和簽名,這段邏輯詳見 LoginActivity.java
1.3、使用 TLS 登錄返回的 id 和簽名,調用 TCLoginMgr 的 imLogin() 函數完成IM模塊的登錄,之后就可以收發消息了
2、獨立模式
2.1、 如果您已有帳號體系且需要支持可靠的 C2C 消息,則需要使用此種方式。
此模式的目標是將騰訊云通訊模塊跟您的賬號體系結合起來實現安全可靠的消息通訊。
2.2、您先使用自己的登錄邏輯進行登錄,之后交給您的服務器驗證當前用戶是不是一個合法的用戶。
2.3、如果當前用戶通過驗證,您的登錄服務器要使用跟騰訊云協商的非對稱加密密鑰對用戶 ID 進行簽名。
這就好比您的服務器給這個用戶 ID 做了擔保:“這是個好孩子,我給他擔保,有公章在此,請給他通過?!?br>
2.4、APP在收到用戶 ID 和簽名后,TCLoginMgr的imLogin() 函數完成IM模塊的登錄,之后就可以收發消息了
3、游客模式
3.1、 如果您已有帳號體系,適合使用這種模式,該模式下騰訊云通訊模塊會使用內部的一些匿名賬號進行消息的收發。
3.2、這種模式下,您只需要調用TCLoginMgr的guestLogin()函數即可實現,內部流程跟托管模式類似,只是賬號換成了隨機生成的匿名賬號。
3.3、 如果想要將IM模塊跟您的賬號體系進行結合,實現您的兩個賬號間的私信收發,請看獨立模式。
2、sdkAppId 和 accountType。
sdkAppId:用于標識接入SDK的應用Id,由騰訊分配。
accountType:帳號類型,由騰訊分配。
注意:
sdkAppId 和 accountType 這兩個參數在利用菜鳥窩賬號發起直播才會用到,現在登錄的時候返回的都是 null,在后面發起直播會詳細介紹。
從圖中可以看出,登錄需要使用到這兩個參數,accountType 是 TIMUser 的一個成員變量。
登錄 SDK 簡介
打開 登錄 SDK 文檔,主要有以下幾個功能。
1、登錄
查看登錄方法以及參數列表。
登錄官方示例
2、登出
暫時只用到這兩個功能,其它方法讀者自己查看。
IM 登錄功能封裝
登錄具體實現請查看 【從 0 開始開發一款直播 APP】5.1 MVP 完全解析 -- 實現直播登錄
1、創建 IMLogin 類
IMLogin 主要封裝 IM 登錄需要的相關方法和回調。
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 登錄方法
根據官方文檔中提供的 login() ,方法,封裝我們自己的 IMLogin() 方法,里面只需要實現登錄邏輯即可,具體調用在 presenter 中實現。
public void login(int sdkAppId,//用于標識接入SDK的應用Id,由騰訊分配。
//用戶帳號:
//accountType,帳號類型,由騰訊分配。
//appIdAt3rd,使用自有帳號或騰訊開放帳號時,填寫為與sdkAppId相同的字符串。
//identifier,用戶帳號。
TIMUser user,
java.lang.String userSig,//userSig,用戶帳號簽名,由私鑰加密獲得,具體請參考帳號相關文檔。
TIMCallBack callback)//回調接口。
//-----------------------------------split line ------------------------------------
//云通信服務相關配置
//從之前創建的應用中獲取 SdkAppId 和 accountType
public static int IMSDK_ACCOUNT_TYPE = 12242;
public static int IMSDK_APPID = 1400029483;
//-----------------------------------split line ------------------------------------
private IMLoginListener mIMLoginListener;
/**
* imsdk登錄接口,與tls登錄驗證成功后調用
* @param identify 用戶id,后臺生成的 user_sig 的用戶信息
* @param sigId 用戶簽名(托管模式下由TLSSDK生成,獨立模式下由開發者在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);
//發起登錄請求,調用騰訊的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();
}
});
}
登錄中使用到接口回調,具體如下:
/**
* 騰訊云登錄回調接口
* Login 回調
*/
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 登錄實現
在 LoginPresenter.java 類中定義 IMLogin,并實現 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) {
}
}
在用戶名登錄方法中調用 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);
//設置監聽回調
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();
}
});
}
}
實現 onSuccess() 和 onFailure() 即可。
@Override
public void onSuccess() {
Log.e(TAG, "onSuccess:login success");
//移除監聽
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);
}
運行程序
在控制臺過濾之后可以看到登錄成功并打印出登錄信息.。
每個程序猿必備的110本經典編程書,免費領取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA