第一次启动APP获取不到clientId,第二次打开可以,首次启动也正常初始化了

莫语 10天前 74

第一次启动APP获取不到clientId,第二次打开可以,首次启动也正常初始化了

最新回复 (7)
  • HeavyRain 9天前
    引用 2
    debug看一下ChatManager里的getClientId方法,看看为啥没有获取到
  • 莫语 9天前
    引用 3
    又测试了一下,没办法稳定复现
  • 莫语 9天前
    引用 4
    clientId的生成会获取到手机的imei或者设备ID什么的涉及到用户敏感信息的数据吗?如果不涉及的话,我在Application中获取试一下,现在主要是在Activity中当用户同意用户隐私政策之后调用的
  • 莫语 9天前
    引用 5

    问题描述

    初始化代码

    private fun initImSdk(application: Application) {
                UserManager.init()
                // 只在主进程初始化,否则会导致重复收到消息
                if (getCurProcessName(application) == BuildConfig.APPLICATION_ID) {
                    // 如果uikit是以aar的方式引入 ,那么需要在此对Config里面的属性进行配置,如:
                    Config.IM_SERVER_HOST = AppConfig.getIMHostUrl()
                    val wfcUIKit = WfcUIKit.getWfcUIKit()
                    wfcUIKit.init(application)
                    wfcUIKit.appServiceProvider = AppService.Instance()
                    MessageViewHolderManager.getInstance().registerMessageViewHolder(
                        LocationMessageContentViewHolder::class.java,
                        R.layout.conversation_item_location_send,
                        R.layout.conversation_item_location_send
                    )
                    setupWFCDirs(application)
    //            val sp: SharedPreferences =
    //                getSharedPreferences(Config.SP_CONFIG_FILE_NAME, MODE_PRIVATE)
    //            val id = sp.getString("id", null)
    //            val token = sp.getString("token", null)
    //            if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(token)) {
    //                //需要注意token跟clientId是强依赖的,一定要调用getClientId获取到clientId,然后用这个clientId获取token,这样connect才能成功,如果随便使用一个clientId获取到的token将无法链接成功。
    //                //另外不能多次connect,如果需要切换用户请先disconnect,然后3秒钟之后再connect(如果是用户手动登录可以不用等,因为用户操作很难3秒完成,如果程序自动切换请等3秒)
                    EasyConfig.getInstance()
                        .addHeader("clientId", ChatManagerHolder.gChatManager?.clientId)
                        .addHeader("platform", "2")
                    if (UserManager.tokenResult != null) {
                        EasyConfig.getInstance()
                            .addHeader("token", UserManager.tokenResult?.getToken())
                        refreshToken()
                    }
    //            }
                }
            }

    第一次启动时,控制台没有任何打印,

    同时,也获取不到clientId,第二次启动时就正常了,控制台也能正常打印出检查日志,看起来像是第一次sdk哪里报错了

  • x86 8天前
    引用 6
    你应当先查下,为什么没有打印出 init api.youquan.dxmwl.com 这行日志来
  • 莫语 7天前
    引用 7

    似乎找到了为什么没有初始化,但是不知道是什么情况造成的

    原因:判断进程时获取当前运行进程name为null,所以没有走初始化

    获取进程名的方法(IM项目demo中的)

    private fun getCurProcessName(context: Context): String? {
                val pid = Process.myPid()
                val activityManager = context
                    .getSystemService(ACTIVITY_SERVICE) as android.app.ActivityManager
                for (appProcess in activityManager
                    .runningAppProcesses) {
                    if (appProcess.pid == pid) {
                        return appProcess.processName
                    }
                }
                return null
            }

    第一次启动 第二次启动

    虽然找到了问题所在,但是不明白造成这样的原因是什么,而且不是每次都是这样,有时候打的包会出现这种情况,有时候是正常的

  • 莫语 7天前
    引用 8
    而且比较奇怪的是,第一次似乎只启动了一个进程,由于获取的进程名为null,不知道是哪个进程,项目中只有主进程和marservice两个进程,猜测是主进程启动了,因为APP页面可以正常打开
返回