【Flutter】友盟智能认证Android Flutter插件集成
目录
- 介绍
- 入手
- 问题:报错600017, 提示Appkey 密钥不对。
介绍
友盟官方的文档不齐全, 且文档和Demo均未与SDK版本同步。
目前SDK版本已经出到 umeng-common-9.1.3 (2020年9月8日), 而文档和Demo还停留在2.x版本。
另外, 友盟基础库9.x版本需要使用 umeng-crash-armeabi 库, 而该库使用了 .so 文件, 在某些版本或者平台上直接使用会报错。
本文基于官方Demo, 友盟基础库2.x版本, 集成为Flutter插件。
入手
- IDE: Android Studio 4.0.
首先创建Flutter插件项目, 在Flutter项目中 Open for Editing in Android Studio, 等待项目构建完毕, 先运行一次。
然后选择目录结构为 Project files, 可以看到好几个Android 模块, 选择非example目录下的模块。
在src同级目录创建libs, 将 fastjson-1.2.60.jar, umeng-common-2.2.1.jar, umeng-uverify-1.3.1.aar 复制进来。
umeng-uverify 的包是 arr 格式的, 看到其他教程引入arr都说的很复杂, 实际上跟 jar 包一样, 直接引入就行。
- 在上文所述的模块中的 build gradle文件下添加以下包就行。
dependencies {implementation "com.android.support:appcompat-v7:28.0.0"implementation files('libs/fastjson-1.2.60.jar')implementation files('libs/umeng-uverify-1.3.1.aar')implementation files('libs/umeng-common-2.2.1.jar')
}
- 然后在插件中初始化和调用一键登录,在插件 onAttachedToEngine 中初始化认证包,也可以通过MethodCall 在Flutter中手动调用。
@Override@CallSuperpublic void onAttachedToEngine() {Log.i(TAG, "onAttachedToEngine");UMConfigure.init(flutterPluginBinding.getApplicationContext(), "你的APP KEY","Umeng",UMConfigure.DEVICE_TYPE_PHONE,null);}
- 在自动创建的Plugin文件中, 正常调用一键登录就行。
调用需要 Context 对象, Flutter官方插件 SDK 说接口 ActivityAware 可以拿到Activity, 但实际上目前的Flutter版本, 插件入口实现的 FlutterPlugin 对象中, onAttachedToEngine 方法传入的 flutterPluginBinding 就可以拿到 Context 上下文对象。
@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {Log.i(TAG, "onAttachedToEngine");/*** 获取UMVerifyHelper实例, 设置秘钥信息*/mTokenListener = new UMTokenResultListener() {...};umVerifyHelper = UMVerifyHelper.getInstance(flutterPluginBinding.getApplicationContext(), mTokenListener);umVerifyHelper.setAuthSDKInfo("你的密钥");umVerifyHelper.setAuthListener(mTokenListener);//如果支持, 发起一键登录。if (umVerifyHelper.checkEnvAvailable()){umVerifyHelper.getLoginToken(flutterPluginBinding.getApplicationContext(), 5000);}}
- 返回消息到Flutter
因为调用友盟返回数据的形式是回调方法的原因,设计通过EventChannel返回数据到Flutter,但也因为这个原因,实际上回调并不在UI线程中执行,直接EventSink返回会报错。
解决方法:
- 使用广播机制传递消息到UI线程
// 暂无实现
- 使用Activity对象调用线程发送
// 该ACtivity通过实现ActivityAware接口拿到
activity.runOnUiThread(new Runnable() {@Overridepublic void run() {umVerifyHelper.hideLoginLoading();umVerifyHelper.quitLoginPage();UMRet umRet = null;try {umRet = JSON.parseObject(ret, UMRet.class);} catch (Exception e) {e.printStackTrace();return;}if (umRet == null){eventSink.success(FlutterResult.create(PluginConstant.FLUTTER.CODE_GET_TOKEN_ERROR, "获取Token失败,未知错误").toJsonStr());return;}eventSink.success(FlutterResult.create(PluginConstant.FLUTTER.CODE_GET_TOKEN_ERROR, msg.toString()).toJsonStr());}});}
- 配置签名
切换到 example 下的 app 模块, 在 android 中配置:
在测试时 flutter 插件本身是有自己的报名的,在正式环境中集成为 flutter 插件给 flutter 应用使用, 应使用 flutter 应用的签名。
android {signingConfigs {debug{keyAlias 'xxx'keyPassword 'xxx'storeFile file('xxx.jks')storePassword ''v1SigningEnabled truev2SigningEnabled true}release {keyAlias 'xxx'keyPassword 'xxx'storeFile file('xxx.jks')storePassword ''v1SigningEnabled truev2SigningEnabled true}}buildTypes {release {debuggable falseminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'zipAlignEnabled falsemultiDexEnabled truesigningConfig signingConfigs.release}debug{minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'zipAlignEnabled falsemultiDexEnabled true}}
}
问题:报错600017, 提示Appkey 密钥不对。
首先排除填写错误, 在填写正确的情况下, 友盟是需要验证包名和签名的正确性和一致性的.
根据项目包名, 也就是安装app后应用的唯一标识,在Flutter插件中,, 通过 Android Studio 进行签名,默认使用app module的就行,包名也在该module下(签名过程不再详述), 签名后, 使用 keytool 获取签名的Md5。
keytool -v -list -keystore 你的签名文件
输入命令后会要求输入密码, 输入签名的密码, 可以查看到签名和MD5(以下已打码)。
> keytool -v -list -keystore .\xxx.jks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN您的密钥库包含 1 个条目别名: xxx
创建日期: 2020-9-7
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
发布者: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
序列号: 1d7f10da
有效期为 Mon Sep 07 18:00:02 CST 2020 至 Fri Sep 01 18:00:02 CST 2045
证书指纹:MD5: xx:xx:FE:AB:6E:36:EA:xx:xx:xx:xx:xx:xx:64:5D:05SHA1: xx:xx:A0:6F:63:53:BC:B0:72:75:12:5E:63:27:3C:75:10:C0:DD:A8SHA256: xx:xx:xx:xx:xx:A0:1A:0D:4D:EA:EC:01:F4:2C:1B:88:6B:A1:5A:AF:87:97:96:7E:B3:60:D8:A8:C0:49:F7:E7
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3扩展:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 84 60 68 FB 16 xx xx xx 34 53 BB 02 C4 4C 12 BF .`h..+.64S...L..
0010: 1B 1C 16 16 ....
]
]*******************************************
*******************************************
使用获取到的MD5去友盟工作台, 智能认证, 创建Android应用, 创建方案。
- 要保证应用包名, 签名, Appkey, 密钥 四个数据都要对应,否则会报错。
- 注意SDK的错误码(坑),以及预取号成功返回的是运营商字符串而不是JSON字符串
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
