【從 0 開始開發(fā)一款直播 APP】11 IM 登錄實現(xiàn)

本文為菜鳥窩作者蔣志碧的連載。“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目


【從 0 開始開發(fā)一款直播 APP】10 騰訊云通信及SDK集成
【從 0 開始開發(fā)一款直播 APP】11 IM 登錄實現(xiàn)


對上一篇文章中留下兩個問題沒有解決。

1、獨立模式和托管模式

賬號登錄集成說明
打開該文檔,先看看賬號集成的大致步驟,請讀者仔細閱讀上面的文字,既然筆者都貼出來了,就是經(jīng)過篩選并對開發(fā)有一定用處的。
step 3 創(chuàng)建應(yīng)用在上一章已經(jīng)講過,這里不再講解。


TLS 登錄支持三種模式:1、托管模式 3、獨立模式 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、獨立模式

2.1、 如果您已有帳號體系且需要支持可靠的 C2C 消息,則需要使用此種方式。
此模式的目標(biāo)是將騰訊云通訊模塊跟您的賬號體系結(jié)合起來實現(xiàn)安全可靠的消息通訊。
2.2、您先使用自己的登錄邏輯進行登錄,之后交給您的服務(wù)器驗證當(dāng)前用戶是不是一個合法的用戶。
2.3、如果當(dāng)前用戶通過驗證,您的登錄服務(wù)器要使用跟騰訊云協(xié)商的非對稱加密密鑰對用戶 ID 進行簽名。
這就好比您的服務(wù)器給這個用戶 ID 做了擔(dān)保:“這是個好孩子,我給他擔(dān)保,有公章在此,請給他通過?!?br> 2.4、APP在收到用戶 ID 和簽名后,TCLoginMgr的imLogin() 函數(shù)完成IM模塊的登錄,之后就可以收發(fā)消息了

3、游客模式

3.1、 如果您已有帳號體系,適合使用這種模式,該模式下騰訊云通訊模塊會使用內(nèi)部的一些匿名賬號進行消息的收發(fā)。
3.2、這種模式下,您只需要調(diào)用TCLoginMgr的guestLogin()函數(shù)即可實現(xiàn),內(nèi)部流程跟托管模式類似,只是賬號換成了隨機生成的匿名賬號。
3.3、 如果想要將IM模塊跟您的賬號體系進行結(jié)合,實現(xiàn)您的兩個賬號間的私信收發(fā),請看獨立模式。


2、sdkAppId 和 accountType。

sdkAppId:用于標(biāo)識接入SDK的應(yīng)用Id,由騰訊分配。
accountType:帳號類型,由騰訊分配。

注意:

sdkAppId 和 accountType 這兩個參數(shù)在利用菜鳥窩賬號發(fā)起直播才會用到,現(xiàn)在登錄的時候返回的都是 null,在后面發(fā)起直播會詳細介紹。

從圖中可以看出,登錄需要使用到這兩個參數(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生成,獨立模式下由開發(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);
}

運行程序

在控制臺過濾之后可以看到登錄成功并打印出登錄信息.。


每個程序猿必備的110本經(jīng)典編程書,免費領(lǐng)取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容