【從 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做个、獨(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睛竣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子求摇,更是在濱河造成了極大的恐慌射沟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件与境,死亡現(xiàn)場離奇詭異验夯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摔刁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門挥转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人共屈,你說我怎么就攤上這事绑谣。” “怎么了拗引?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵借宵,是天一觀的道長。 經(jīng)常有香客問我矾削,道長壤玫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任怔软,我火速辦了婚禮垦细,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挡逼。我一直安慰自己括改,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘱能,像睡著了一般吝梅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惹骂,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天苏携,我揣著相機(jī)與錄音,去河邊找鬼对粪。 笑死右冻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的著拭。 我是一名探鬼主播纱扭,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儡遮!你這毒婦竟也來了乳蛾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鄙币,失蹤者是張志新(化名)和其女友劉穎肃叶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體十嘿,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡因惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绩衷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛欢。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唇聘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柱搜,我是刑警寧澤迟郎,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站聪蘸,受9級特大地震影響宪肖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜健爬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一控乾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娜遵,春花似錦蜕衡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽久脯。三九已至,卻和暖如春镰吆,著一層夾襖步出監(jiān)牢的瞬間帘撰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工万皿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧找,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親易桃。 傳聞我的和親對象是個殘疾皇子忧饭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容