【從 0 開始開發一款直播 APP】11 IM 登錄實現

本文為菜鳥窩作者蔣志碧的連載。“從 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

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

推薦閱讀更多精彩內容