由于Flutter项目中用到umeng统计及手机号一键登录功能,但实际集成使用中遇到各种坑,文档及demo却都没有提及,因此写下这篇文章,有遇到同样问题的同学可以参考下。
集成之前,最好先查看一下文档:https://developer.umeng.com/docs/143070/detail/425282
集成步骤:
1.下载智能认证SDK:https://devs.umeng.com/
2.将下载的sdk.解压,删除其中的example:
然后将整个项目放进自己Flutter项目的跟目录(文档正好相反,是将flutter项目放在了sdk的根目录,这样非常不好,所以建议是将sdk放进Flutter项目的根目录,类似于安卓项目引入一个Module)
最后,修改flutter_verify中android下的gradle版本为你自己的gradle版本:
同样,build.gradle中修改com.android.tools.build:gradle为你自己的版本,以及远程仓库:
3.在pubspec.yaml中添加:
#umeng
umeng_common_sdk: 1.2.4
umeng_verify_sdk:
path: ../自己的项目根目录/flutter_verify
然后pub get一下,把sdk下载下来。
4.安卓端需要在Application中预初始化:
如果你的android目录中没有Application,需要自己创建一个,然后在onCreate中预初始化:
com.umeng.commonsdk.UMConfigure.preInit(this, "appkey", "channel");
preInit不会收集任何隐私信息,真正的初始化是在Flutter中,用户同意你自己的服务协议及隐私政策后,开始调用。
注意,如果没有调用preInit,umeng的功能实测将不可用!
5.在Flutter中初始化:
initUmeng() {
UmengCommonSdk.setPageCollectionModeManual();
UmengCommonSdk.initCommon(umengAppKey, umengAppKey, 'channel');
UmengVerifySdk.register_android();//安卓平台必须调用
UmengVerifySdk.setVerifySDKInfo(umengVerifySecret, umengVerifySecret);
}
setVerifySDKInfo可以通过then打印是否调用成功,如返回true,则表示成功!
6.一键登录:
umeng提供了两种方式,一种是弹框,一种是进入一个新的ui页面,我自己使用的是第二种,并封装了一个方法(由于目前只考虑安卓平台,所以以下方法属于安卓,ios的可以参考demo):
UMCustomModel uiConfig = UMCustomModel();
uiConfig.isAutorotate = false;
uiConfig.navIsHidden = true;
uiConfig.prefersStatusBarHidden = false;
uiConfig.backgroundImage = "page_background_color";
uiConfig.logoIsHidden = true;
uiConfig.sloganIsHidden = true;
uiConfig.numberColor = Colors.black.value;
uiConfig.numberFont = 20;
uiConfig.numberFrame = [10, 200, -1, -1];
uiConfig.loginBtnText = ["手机号一键登录", Colors.white.value, 20];
uiConfig.loginBtnBgImg_android = "login_btn_bg";
uiConfig.autoHideLoginLoading = false;
uiConfig.loginBtnFrame = [10, -1, -1, -1, -1];
uiConfig.checkBoxImages = ["unchecked", "checked"];
uiConfig.checkBoxIsChecked = false;
uiConfig.checkBoxIsHidden = false;
uiConfig.checkBoxWH = 15;
uiConfig.privacyOne = ["《服务协议》", agreementUrl];
uiConfig.privacyTwo = ["《隐私政策》", privacyUrl];
uiConfig.privacyConectTexts = ["& ", "、"];
uiConfig.privacyColors = [Colors.red.value, Colors.blue.value];
uiConfig.privacyAlignment = UMTextAlignment.Center;
uiConfig.privacyPreText = "";
uiConfig.privacySufText = "";
uiConfig.privacyOperatorPreText = "《";
uiConfig.privacyOperatorSufText = "》";
uiConfig.privacyOperatorIndex = 1;
uiConfig.privacyFont = 12;
uiConfig.privacyFrame = [10, -1, 10, -1];
uiConfig.changeBtnTitle = ["账号密码登录", Colors.blue.value, 14];
uiConfig.changeBtnIsHidden = false;
uiConfig.changeBtnFrame = [-1, 320, -1, -1];
uiConfig.protocolAction_android = "com.aliqin.mytel.protocolWeb";
uiConfig.privacyNavColor = Colors.red.value;
uiConfig.privacyNavTitleFont = 16;
uiConfig.privacyNavTitleColor = Colors.blue.value;
uiConfig.privacyNavBackImage = "icon_back";
UMCustomWidget customButton = UMCustomWidget("button1", UMCustomWidgetType.button);
customButton.title = "";
customButton.left = 0;
customButton.top = 0;
customButton.width = 0;
customButton.height = 0;
customButton.backgroundColor = Colors.red.value;
customButton.titleColor = Colors.black.value;
customButton.isClickEnable = false;
customButton.btnBackgroundResource_android = "btn_selector";
customButton.rootViewId = UMRootViewId.body;
UMCustomWidget customTextView = UMCustomWidget("textView", UMCustomWidgetType.textView);
customTextView.left = 0;
customTextView.top = 0;
customTextView.width = 0;
customTextView.height = 0;
customTextView.title = "";
customTextView.rootViewId = UMRootViewId.number;
uiConfig.customWidget = [customButton.toJsonMap(), customTextView.toJsonMap()];
UmengVerifySdk.getLoginTokenWithTimeout(3, uiConfig);
效果图:
UmengVerifySdk.checkEnvAvailable()方法,可检测当前是否支持一键登录!
协议的点击事件,可以通过设置回调监听:
UmengVerifySdk.setUIClickCallback_android((result) {
showLog("setUIClickCallback_android: ${jsonDecode(result["jsonString"])["url"]}");
});
需要注意的是,这里不能直接跳转到flutter的web页面,因为umeng的这个一键登录页面在整个应用的顶层,会覆盖你的flutter页面,这个只能编写原生WebActivity跳转。
一键登录按钮的点击事件:
UmengVerifySdk.setTokenResultCallback_android((result) {
showLog("setTokenResultCallback_android: $result");
if (result["code"] == "600000") {
UmengVerifySdk.quitLoginPage_android();
if (result["token"] != null) {
oneKeyLogin(result["token"]);
}
}
});
安卓端集成若干问题总结:
1.获取不到VerifyId?
首次按文档集成时,umeng_common_sdk版本是1.2.3,怎么都获取不到,最后升级到了1.2.4竟好了,所以这个问题,不清楚是版本问题,还是其它什么问题?如果获取不到,可以尝试清除一下缓存,卸载app再重装,升级版本等等。
2.打正式包报错:“Theme.AppCompat.Light.NoActionBar not found”
这个问题应该是sdk使用了appcompat的主题,但文档却没有任何提及,简直是坑。
解决方法,在flutter_verify下的build.gradle中添加依赖:
api 'androidx.appcompat:appcompat:1.4.1'
3.打正式包安装后报错:“SDK初始化失败,请检查是否集成umeng-asms-1.2x.aar库”
\由于Flutter打正式包默认开启混淆,这个原因是因为flutter把umeng的sdk给混淆了,所以自己在flutter_verify下创建一个proguard-rules.pro文件,并在build.gradle中配置:
-keep class com.umeng.** {*;}
这个问题,官方文档一样没有提及…
IOS端集成若干问题总结:
待续…