Android極光認證配置


更新日期:2020.07.02
依賴版本:
'cn.jiguang.sdk:jcore:2.3.4'
'cn.jiguang.sdk:jverification:2.6.2'
新版本對認證activity內容進行了包裝,導致原本對反射調用失效,新的實現如下:

@SuppressLint("ResourceType")
override fun onActivityStarted(activity: Activity) {
    if (activity::class.java == CtLoginActivity::class.java) {
        val phoneNumber = activity.intent.getStringExtra("mobile")
        val operatorType = activity.intent.getStringExtra("operator")
        if (TextUtils.isEmpty(phoneNumber)) {
            activity.onBackPressed()
        } else {
            val jsonObject = JSONObject()
            jsonObject.putOpt("mobile", phoneNumber)
            jsonObject.putOpt("operator", operatorType)
            EventManagerImpl.get().post(null, SimpleEvent(AppConstant.EVENT_JPUSH_VERIFY, jsonObject))
            try {
                val realFiled = BaseActivity::class.java.getDeclaredField("ctLoginActivity")
                realFiled.isAccessible = true
                val realValue = realFiled.get(activity)
                val p = cn.jiguang.verifysdk.activity.a::class.java.getDeclaredMethod("onClick", View::class.java)
                val view = View(AppContext.get())
                view.id = 1007
                p.invoke(realValue, view)
            } catch (e: Exception) {
                LogUtil.e(e.toString())
                activity.onBackPressed()
            }
        }
    } else if (activity::class.java == LoginAuthActivity::class.java) {
        val phoneNumber = activity.intent.getStringExtra("securityphone")
        val type = activity.intent.getStringExtra("operatorType")
        val operatorType = when (type) {
            "1" -> {
                "CM"
            }
            "3" -> {
                "CT"
            }
            else -> {
                "CU"
            }
        }
        if (TextUtils.isEmpty(phoneNumber)) {
            JVerificationInterface.dismissLoginAuthActivity()
        } else {
            val jsonObject = JSONObject()
            jsonObject.putOpt("mobile", phoneNumber)
            jsonObject.putOpt("operator", operatorType)
            EventManagerImpl.get().post(null, SimpleEvent(AppConstant.EVENT_JPUSH_VERIFY, jsonObject))
            try {
                val realFiled = BaseActivity::class.java.getDeclaredField("ctLoginActivity")
                realFiled.isAccessible = true
                val realValue = realFiled.get(activity)
                val p = cn.jiguang.verifysdk.l.a::class.java.getDeclaredMethod("p")
                p.isAccessible = true
                p.invoke(realValue)
            } catch (e: Exception) {
                LogUtil.e(e.toString())
                JVerificationInterface.dismissLoginAuthActivity()
            }
        }
    }
}

依賴版本:
'cn.jiguang.sdk:jcore:2.3.0'
'cn.jiguang.sdk:jverification:2.5.5'

基本流程:

  1. SDK初始化:api-->JPushInterface.init;注意一定必須要在主線程初始化,否則即使初始化成功,也會導致后面到步驟出錯;報錯是因為只有3大運營商的認證SDK初始化全部成功,極光認證的相關功能才可以使用,極光官方給出到說法是會在2.6.0版本修復。
  2. 提前獲取預登錄信息:api-->JPushInterface.preLogin;提前調用可以減少獲取認證token的時間,這一步可以省略;調用時機可以在退出登錄時,啟動后發現未登錄的時候,或者在打開登錄頁面時候(這個時候略微有點晚,可能會卡住頁面)。
  3. 獲取一鍵登錄token:api-->JVerificationInterface.loginAuth;這個api會喚起極光的認證頁面CtLoginActivity(電信和聯通的認證頁面)和LoginAuthActivity(移動的認證頁面),所以首先需要在AndroidManifest中注冊這兩個activity;這兩個activity中包含的主要信息有脫敏后手機號,對應運營協議,以及認證按鈕等。由於獲取認證token的api沒有公開,默認只支持通過點擊認證頁面上的認證按鈕,然后在loginAuth的回調中獲取。雖然認證頁面Activity的樣式可以通過AndroidManifest設置style或者在api中配置對應setting來改變,但頁面內容顯示只能通過api的配置參數來調整,所以當公司設計的UI與極光默認UI相差較多時,改起來非常痛苦。
    繞過極光認證頁面實現完全自定義視圖但方法如下:
    1)設置activity生命監聽registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback),在onActivityStarted回調中對CtLoginActivity和LoginAuthActivity進行處理;(之所以不在onActivityCreated方法處理,是因為有幾次未能拿到Intent內對數據)
    2)如果監聽到CtLoginActivity,從intent內拿取基本信息:手機號(加密過的,中間4位*),運營商類型( "CU" :聯通,"CT":電信,"CM" :移動);通過反射獲取onClick方法,然后模擬點擊頁面上的認證按鈕,調用SDK內部的獲取認證token的方法,結果將在在loginAuth方法回調中返回。
val phoneNumber = activity.intent.getStringExtra("mobile")
val operatorType = activity.intent.getStringExtra("operator")
if (TextUtils.isEmpty(phoneNumber)) {
    activity.onBackPressed()
} else {
    //將基本信息傳遞到頁面上
    val jsonObject = JSONObject()
    jsonObject.putOpt("mobile", phoneNumber)
    jsonObject.putOpt("operator", operatorType)
    EventManagerImpl.get().post(null, SimpleEvent(AppConstant.EVENT_JPUSH_VERIFY, jsonObject))
    try {
        //模擬認證按鈕點擊
        val p = activity.javaClass.getDeclaredMethod("onClick", View::class.java)
        val view = View(AppContext.get())
        view.id = 1007
        p.invoke(activity, view)
    } catch (e: Exception) {
        activity.onBackPressed()
    }
}

3)如果監聽到LoginAuthActivity,從intent內拿取基本信息:手機號(加密過的,中間4位*),運營商類型( "3":電信,"1" :移動,其他:聯通);通過反射獲取類中的p方法,調用SDK內部的獲取認證token的方法,結果將在在loginAuth方法回調中返回。

val phoneNumber = activity.intent.getStringExtra("securityphone")
val type = activity.intent.getStringExtra("operatorType")
//統一運營商標識
val operatorType = when (type) {
    "1" -> {
        "CM"
    }
    "3" -> {
        "CT"
    }
    else -> {
        "CU"
    }
}
if (TextUtils.isEmpty(phoneNumber)) {
    JVerificationInterface.dismissLoginAuthActivity()
} else {
    //將基本信息傳遞到頁面上
    val jsonObject = JSONObject()
    jsonObject.putOpt("mobile", phoneNumber)
    jsonObject.putOpt("operator", operatorType)
    EventManagerImpl.get().post(null, SimpleEvent(AppConstant.EVENT_JPUSH_VERIFY, jsonObject))
    try {
        //反射調用認證方法
        val p = activity.javaClass.getDeclaredMethod("p")
        p.isAccessible = true
        p.invoke(activity)
    } catch (e: Exception) {
        JVerificationInterface.dismissLoginAuthActivity()
    }
}

4)調用loginAuth方法,設置彈出極光認證頁面不可見(我是將頁面模式設置為彈窗模式,長寬均為0),通過VerifyListener監聽方法結果(由認證頁面返回);方法成功后會創建2)或3)中的Activity,經過上面幾步的處理,可以拿到基本信息(手機號,運營商),認證token(返回到VerifyListener內),然后關閉了極光的認證頁面。
另外,使用運營商認證必須要在頁面上顯示對應運營商的協議:

{
  "運營商": "聯通",
  "協議名稱": "《聯通統一認證服務條款》",
  "協議地址": "https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true"
}, {
  "運營商": "電信"
  "協議名稱": "《天翼賬號服務與隱私協議》"
  "協議地址": "https://ctaccount.21cn.com/agreementList.html?hidetop=true"
}, {
  "運營商": "移動",
  "協議名稱": "《中國移動認證服務條款》"
  "協議地址": "https://wap.cmpassport.com/resources/html/contract.html"
}
  1. 現在應該已經拿到了頁面需要的全部信息,可以自定義繪圖了。
  1. 將第3步獲取的token傳遞到后台驗證;需要注意token是有有效時間的,如果token失效,可重復第3步,重新獲取token。

2020-04-21


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM