logo
logo
请输入关键词搜索产品或者文档
中国

中国站

创蓝云智

国际站

Innopaas

flutter 插件集成文档

更新时间:2026-07-07 09:47:36

注:「插件示例代码地址

注:如上述地址传输速度慢,可以使用「码云」.

概述

本文是闪验 SDK_flutter 版本的接入文档,用于指导 SDK 的使用方法。

升级指南

注意:升级一定要核对升级指南

1.修改依赖中的版本号

2.删除AndroidManifest中CmccLoginActivity、GenLoginAuthActivity相关注册配置

3.Android 端按照文档核对混淆规则

4.三网运营商卡内部执行逻辑不同,请务必用三网运营商卡分别测试,防止单网取号报错

5.鸿蒙版本flutter官方暂无版本,目前参照OpenHarmony-TPC/flutter_flutter开发

创建应用

注意:如果应用有多个包名或签名不同的马甲包,须创建多个对应包名和签名的应用,否则马甲包将报包名或签名校验不通过。

安装

在工程 pubspec.yaml 中加入 dependencies,以2.3.4.8版本为例:

  • gitee 集成
dependencies:
  shanyan:
    git:
      url: https://gitee.com/chuanglan253/CLShanYan_Flutter.git
      path: shanyan
      ref: v2.3.4.8
  • github 集成
dependencies:
  shanyan:
    git:
      url: git://github.com/253CL/CLShanYan_Flutter.git
      path: shanyan
      ref: v2.3.4.8
  • 支持鸿蒙版本的集成
dependencies:
  shanyan:
    git:
      url: git://github.com/253CL/CLShanYan_Flutter.git
      path: shanyan
      ref: 2.3.5.0_harmony

注:实际使用时将版本号替换成需要使用的版本,建议使用最新版。

使用

import 'package:shanyan/shanyan.dart';
OneKeyLoginManager oneKeyLoginManager = new OneKeyLoginManager();

Android 集成配置

demo 示例里面都有相关配置示例,可以参考。

权限配置

必要权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

建议的权限:如果选用该权限,需要在预取号步骤前提前动态申请。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

配置权限说明

权限名称权限说明使用说明
INTERNET允许应用程序联网用于访问网关和认证服务器
ACCESS_WIFI_STATE允许访问 WiFi 网络状态信息允许程序访问 WiFi 网络状态信息
ACCESS_NETWORK_STATE允许访问网络状态区分移动网络或 WiFi 网络
CHANGE_NETWORK_STATE允许改变网络连接状态设备在 WiFi 跟数据双开时,强行切换使用数据网络
CHANGE_WIFI_STATE允许改变 WiFi 网络连接状态设备在 WiFi 跟数据双开时,强行切换使用
READ_PHONE_STATE允许读取手机状态(可选)获取 IMSI 用于判断双卡和换卡

注册授权页 activity

在 application 标签内配置授权登录 activity,screenOrientation 和 theme 可以根据项目需求自行修改

<!-- *******************************授权页*********************************** -->
<activity
   android:name="com.chuanglan.shanyan_sdk.view.ShanYanOneKeyActivity"
   android:configChanges="keyboardHidden|orientation|screenSize"
   android:launchMode="singleTop"
   android:screenOrientation="behind"
    />
<!-- *******************************协议页*********************************** -->
<activity
   android:name="com.chuanglan.shanyan_sdk.view.CTCCPrivacyProtocolActivity"
   android:configChanges="keyboardHidden|orientation|screenSize"
   android:launchMode="singleTop"
   android:screenOrientation="behind"
    />

配置对 http 协议的支持

两种方式(任选其一):

方式一:在 application 标签中配置 usesCleartextTraffic,示例如下

<application
    android:name=".view.MyApplication"
    ***
    android:usesCleartextTraffic="true"
    ></application>

方式二:将联通取号域名 10010.com 设置为白名单,示例如下

<application
    android:name=".view.MyApplication"
    ***
    android:networkSecurityConfig="@xml/network_security_config"
    ></application>

?network_security_config.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">10010.com</domain>
    </domain-config>
</network-security-config>

混淆规则

-dontwarn com.cmic.gen.sdk.**
-keep class com.cmic.gen.sdk.**{*;}
-dontwarn com.sdk.**
-keep class com.sdk.** { *;}
-dontwarn com.unikuwei.mianmi.account.shield.**
-keep class com.unikuwei.mianmi.account.shield.** {*;}
-keep class cn.com.chinatelecom.account.api.**{*;}

资源压缩过滤

如果使用 AndResGuard 资源压缩,需添加过滤,参考 demo 示例:

"R.anim.umcsdk*",
"R.drawable.umcsdk*",
"R.layout.layout_shanyan*",
"R.id.shanyan_view*",

如果使用系统 shrinkResources true,需要在 raw/keep 里面配置资源过滤?keep.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="R.anim.umcsdk*,
  R.drawable.umcsdk*,
  R.layout.layout_shanyan*,
  R.id.shanyan_view*" />

添加示例:

img

通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用闪验 SDK 进行开发了。

一、免密登录 API 使用说明

1.初始化(init)

使用一键登录功能前,必须先进行初始化操作。

调用示例

 oneKeyLoginManager.init(appId: appId).then((shanYanResult) {
      setState(() {
        _code = shanYanResult.code;
        _result = shanYanResult.message;
        _content = shanYanResult.toJson().toString();
      });

参数描述

参数类型说明
appIdString闪验平台获取到的 appId

返回为 ShanYanResult 对象属性如下:

字段类型含义
codeIntcode 为 1000:成功;其他:失败
messageString描述
innerCodeInt内层返回码
innerDescString内层事件描述
tokenStringtoken

2.预取号(getPhoneInfo)

  • 建议在执行拉取授权登录页的方法前,提前一段时间调用预取号方法,中间最好有 2-3 秒的缓冲(因为预取号方法需要 1~3s 的时间取得临时凭证)
  • 请勿频繁的多次调用、请勿与拉起授权登录页同时和之后调用。
  • 避免大量资源下载时调用,例如游戏中加载资源或者更新补丁的时候要顺序执行

调用示例:

oneKeyLoginManager.getPhoneInfo().then((ShanYanResult shanYanResult) {
      setState(() {
        _code = shanYanResult.code;
        _result = shanYanResult.message;
        _content = shanYanResult.toJson().toString();
      });

返回为 ShanYanResult 对象属性如下:

字段类型含义
codeIntcode 为 1000:成功;其他:失败
messageString描述
innerCodeInt内层返回码
innerDescString内层事件描述
tokenStringtoken

3.拉起授权页(openLoginAuth)

  • 调用拉起授权页方法后将会调起运营商授权页面。已登录状态请勿调用 。
  • 每次调用拉起授权页方法前均需先调用授权页配置方法,否则授权页可能会展示异常。

调用示例:

oneKeyLoginManager.openLoginAuth().then((ShanYanResult shanYanResult) {
      setState(() {
        _code = shanYanResult.code;
        _result = shanYanResult.message;
        _content = shanYanResult.toJson().toString();
      });

      if (1000 == shanYanResult.code) {
        //拉起授权页成功
      } else {
        //拉起授权页失败
      }
    });

返回为 ShanYanResult 对象属性如下:

字段类型含义
codeIntcode 为 1000:成功;其他:失败
messageString描述
innerCodeInt内层返回码
innerDescString内层事件描述
tokenStringtoken(成功情况下返回)用来后台置换手机号。一次有效。

授权页点击一键登录监听,需要在拉起授权页方法之前调用

oneKeyLoginManager.setOneKeyLoginListener((ShanYanResult shanYanResult) {
      setState(() {
        _code = shanYanResult.code;
        _result = shanYanResult.message;
        _content = shanYanResult.toJson().toString();
      });

      if (1000 == shanYanResult.code) {
        ///一键登录获取token成功
      } else if (1011 == shanYanResult.code){
        ///点击返回/取消 (强制自动销毁)
      }else{
        ///一键登录获取token失败
        //关闭授权页
        oneKeyLoginManager.finishAuthControllerCompletion();
      }
    });

返回为 ShanYanResult 对象属性如下:

字段类型含义
codeIntcode 为 1000:成功;其他:失败
messageString描述
innerCodeInt内层返回码
innerDescString内层事件描述
tokenStringtoken

4.置换手机号

当一键登录外层 code 为 1000 时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现获取手机号码的步骤。

5.其他 API

a.开启 SDK 内部日志开关(setDebug)

调用示例

oneKeyLoginManager.setDebug(true);//true:开启;false:关闭;默认:false

注:Android 端需要放到 SDK 初始化之前调用,用 ProcessShanYanLogger 可以过滤方法调用及回调

b.设置授权页 loading 显示隐藏(setLoadingVisibility)

调用示例

oneKeyLoginManager.setLoadingVisibility(true);//true:显示;false:隐藏

注:Android 端点击登录按钮 loading 显示后可以调用此方法隐藏,此方法不能控制点登录按钮时是否显示 loading,如需控制请看常见问题

c.设置授权页协议复选框状态

本方法仅在授权页拉起后想改变 CheckBox 状态时使用,设置进入授权页时的默认状态,请使用授权页配置 ShanYanUIConfig 里面的 setPrivacyState 方法

调用示例

oneKeyLoginManager.setCheckBoxValue(true);//true:勾选;false:不勾选

d.清理预取号缓存

调用示例

oneKeyLoginManager.clearScripCache(true);//true:勾选;false:不勾选

e.获取运营商类型

调用示例

oneKeyLoginManager.getOperatorType();

返回值 4 种:CMCC、CUCC、CTCC、UNKNOWN_OPERATOR;

释义:CMCC(移动);CUCC(联通);CTCC(电信);UNKNOWN_OPERATOR(无 SIM 卡或非三网运营商)

f.设置预取号超时时间

调用示例

oneKeyLoginManager.setTimeOutForPreLogin(8);//单位秒,默认4

g.获取运营商信息

调用示例

    oneKeyLoginManager
        .getOperatorInfo()
        .then((value) => print("getOperatorInfo===" + value));

返回示例:

{"telecom":"CTCC",
 "protocolName":"天翼服务及隐私协议",
 "protocolUrl":"https:\/\/e.189.cn\/sdk\/agreement\/detail.do?hidetop=true"}

h.授权页协议点击事件回调

调用示例

    oneKeyLoginManager
        .setPrivacyOnClickListener((PrivacyOnClickEvent privacyOnclickEvent) {
      Map map = privacyOnclickEvent.toMap();
      print("setPrivacyOnClickListener===" + map.toString());
    });

返回示例:

{"telecom":"CTCC",
 "protocolName":"天翼服务及隐私协议",
 "protocolUrl":"https:\/\/e.189.cn\/sdk\/agreement\/detail.do?hidetop=true"}

i.设置初始化、预取号、获取 token 是否只在主进程可以调用

调用示例

oneKeyLoginManager.checkProcessesEnable(true);//默认true

j.授权页点击事件监听(setAuthPageActionListener)

调用示例

 oneKeyLoginManager.setAuthPageActionListener((AuthPageActionEvent authPageActionEvent) {
        Map map = authPageActionEvent.toMap();
        print("setActionListener" + map.toString());
      });

返回参数含义如下:

字段类型含义
typeinttype=1 ,隐私协议点击事件 type=2 ,checkbox 点击事件 type=3 ,"一键登录"按钮点击事件
codeinttype=1 ,隐私协议点击事件,code 分为 0,1,2,3(协议页序号)type=2 ,checkbox 点击事件,code 分为 0,1(0 为未选中,1 为选中)type=3 ,"一键登录"按钮点击事件,code 分为 0,1(0 为协议勾选框未选中,1 为选中)
messageString点击事件的详细信息

k.销毁授权页(finishAuthControllerCompletion)

调用示例

oneKeyLoginManager.finishAuthControllerCompletion();

6.授权页界面配置

Android部分

调用该方法可实现对三网运营商授权页面个性化设计,每次调用拉起授权页方法前必须先调用该方法,否则授权界面会展示异常。(三网界面配置内部实现逻辑不同,请务必使用移动、联通、电信卡分别测试三网界面

调用示例

     ShanYanUIConfig shanYanUIConfig = ShanYanUIConfig();
     shanYanUIConfig.androidPortrait.isFinish = false;
      shanYanUIConfig.androidPortrait.setAuthBGImgPath = "sy_login_test_bg";
      shanYanUIConfig.androidPortrait.setLogoImgPath = "shanyan_logo";
      shanYanUIConfig.androidPortrait.setAppPrivacyOne = ["协议1", "https://baidu.com/"];
      shanYanUIConfig.androidPortrait.setAppPrivacyTwo = ["协议2", "https://baidu.com/"];
      shanYanUIConfig.androidPortrait.setAppPrivacyThree = ["协议3", "https://baidu.com/"];
      shanYanUIConfig.androidPortrait.setPrivacyText = ["登录即同意", "、", "、", "和", "授权"];
      shanYanUIConfig.androidPortrait.setDialogTheme = ["120", "150", "0", "0", "false"];
      shanYanUIConfig.androidPortrait.setLogoWidth = 108;
      shanYanUIConfig.androidPortrait.setLogoHeight = 45;
      shanYanUIConfig.androidPortrait.setLogoHidden = false;
      shanYanUIConfig.androidPortrait.setLogoOffsetY = 10;
      shanYanUIConfig.androidPortrait.setNumFieldOffsetY = 60;
      shanYanUIConfig.androidPortrait.setNumberSize = 18;
      shanYanUIConfig.androidPortrait.setLogBtnOffsetY = 120;
      shanYanUIConfig.androidPortrait.setLogBtnTextSize = 15;
      shanYanUIConfig.androidPortrait.setLogBtnWidth = 250;
      shanYanUIConfig.androidPortrait.setLogoHeight = 40;
      shanYanUIConfig.androidPortrait.setLogBtnOffsetY = 130;
      shanYanUIConfig.androidPortrait.setSloganHidden = true;
      shanYanUIConfig.androidPortrait.setBackPressedAvailable = false;
      shanYanUIConfig.androidPortrait.setActivityTranslateAnim = [
      "activity_anim_bottom_in",
      "activity_anim_bottom_out"
    ];
    OneKeyLoginManager oneKeyLoginManager = new OneKeyLoginManager();
    oneKeyLoginManager.setAuthThemeConfig(uiConfig: shanYanUIConfig);

ShanYanUIConfig.java 配置说明

注意:界面用到的所有图片、视频、布局、动画等资源文件,都需要放到对应的 Android 原生目录下,如:图片需要放到 res/drawable 目录下

是否自动销毁

bool isFinish; //是否自动销毁 true:是 false:不是

是否屏蔽物理返回键(屏蔽后还会执行回调,只是不销毁授权页)

bool? setBackPressedAvailable = true; //设置物理返回键是否有效(true:有效;false:无效)

授权页拉起和销毁时进出场动画

List<String>?
 setActivityTranslateAnim; //设置授权页进出场动画,包含两个参数:1.进场动画传xml文件名即可 2.退场动画传xml文件名即可

授权页背景配置三选一,支持图片,gif 图,视频

  String setAuthBGImgPath; //普通图片
  String setAuthBgGifPath; //GIF图片(只支持本地gif图)
  String setAuthBgVideoPath; //视频背景

授权页状态栏

  bool setStatusBarHidden; //授权页状态栏 设置状态栏是否隐藏
  String setStatusBarColor; //设置状态栏背景颜色
  bool setLightColor; //设置状态栏字体颜色是否为白色
  bool setVirtualKeyTransparent; //设置虚拟键是否透明

授权页导航栏

  bool setFullScreen; //设置是否全屏显示(true:全屏;false:不全屏)默认不全屏
  String setNavColor; //设置导航栏背景颜色
  String setNavText; //设置导航栏标题文字
  String setNavTextColor; //设置导航栏标题文字颜色
  int setNavTextSize; //设置导航栏标题文字大小
  String setNavReturnImgPath; //设置导航栏返回按钮图标
  bool setNavReturnImgHidden = false; //设置导航栏返回按钮是否隐藏(true:隐藏;false:不隐藏)
  int setNavReturnBtnWidth; //设置导航栏返回按钮宽度
  int setNavReturnBtnHeight; //设置导航栏返回按钮高度
  int setNavReturnBtnOffsetRightX; //设置导航栏返回按钮距离屏幕右侧X偏移
  int setNavReturnBtnOffsetX; //设置导航栏返回按钮距离屏幕左侧X偏移
  int setNavReturnBtnOffsetY; //设置导航栏返回按钮距离屏幕上侧Y偏移
  bool setAuthNavHidden; //设置导航栏是否隐藏(true:隐藏;false:不隐藏)
  bool setAuthNavTransparent; //设置导航栏是否透明(true:透明;false:不透明)
  bool setNavTextBold; //设置导航栏字体是否加粗(true:加粗;false:不加粗)

授权页 logo

  String setLogoImgPath; //设置logo图片
  int setLogoWidth; //设置logo宽度
  int setLogoHeight; //设置logo高度
  int setLogoOffsetY; //设置logo相对于标题栏下边缘y偏移
  int setLogoOffsetBottomY; //设置logo相对于屏幕底部y偏移
  bool setLogoHidden; //设置logo是否隐藏(true:隐藏;false:不隐藏)
  int setLogoOffsetX; //设置logo相对屏幕左侧X偏移

授权页号码栏

  String setNumberColor; //设置号码栏字体颜色
  int setNumFieldOffsetY; //设置号码栏相对于标题栏下边缘y偏移
  int setNumFieldOffsetBottomY; //设置号码栏相对于屏幕底部y偏移
  int setNumFieldWidth; //设置号码栏宽度
  int setNumFieldHeight; //设置号码栏高度
  int setNumberSize; //设置号码栏字体大小
  int setNumFieldOffsetX; //设置号码栏相对屏幕左侧X偏移
  bool setNumberBold; //设置号码栏字体是否加粗(true:加粗;false:不加粗)

授权页登录按钮

  String setLogBtnText; //设置登录按钮文字
  String setLogBtnTextColor; //设置登录按钮文字颜色
  String setLogBtnImgPath; //设置授权登录按钮图片
  String setLogBtnBackgroundColor;//设置授权登录按钮背景色
  int setLogBtnOffsetY; //设置登录按钮相对于标题栏下边缘Y偏移
  int setLogBtnOffsetBottomY; //设置登录按钮相对于屏幕底部Y偏移
  int setLogBtnTextSize; //设置登录按钮字体大小
  int setLogBtnHeight; //设置登录按钮高度
  int setLogBtnWidth; //设置登录按钮宽度
  int setLogBtnOffsetX; //设置登录按钮相对屏幕左侧X偏移
  bool setLogBtnTextBold; //设置登录按钮字体是否加粗(true:加粗;false:不加粗)

授权页隐私栏

  List<String> setAppPrivacyOne; //设置开发者隐私条款1,包含两个参数:1.名称 2.URL
  List<String> setAppPrivacyTwo; //设置开发者隐私条款2,包含两个参数:1.名称 2.URL
  List<String> setAppPrivacyThree; //设置开发者隐私条款3,包含两个参数:1.名称 2.URL
  bool setPrivacySmhHidden; //设置协议名称是否显示书名号《》,默认显示书名号(true:不显示;false:显示)
  int setPrivacyTextSize; //设置隐私栏字体大小
  List<String> setAppPrivacyColor; //设置隐私条款文字颜色,包含两个参数:1.基础文字颜色 2.协议文字颜色
  int setPrivacyOffsetBottomY; //设置隐私条款相对于授权页面底部下边缘y偏移
  int setPrivacyOffsetY; //设置隐私条款相对于授权页面标题栏下边缘y偏移
  int setPrivacyOffsetX; //设置隐私条款相对屏幕左侧X偏移
  bool setPrivacyOffsetGravityLeft; //设置隐私条款文字左对齐(true:左对齐;false:居中)
  bool setPrivacyState; //设置隐私条款的CheckBox是否选中(true:选中;false:未选中)
  String setUncheckedImgPath; //设置隐私条款的CheckBox未选中时图片
  String setCheckedImgPath; //设置隐私条款的CheckBox选中时图片
  bool setCheckBoxHidden; //设置隐私条款的CheckBox是否隐藏(true:隐藏;false:不隐藏)
  List<int> setCheckBoxWH; //设置checkbox的宽高,包含两个参数:1.宽 2.高
  List<int> setCheckBoxMargin; //设置checkbox的间距,包含四个参数:1.左间距 2.上间距 3.右间距 4.下间距
  List<String> setPrivacyText; //设置隐私条款名称外的文字,包含五个参数
  bool setPrivacyTextBold; //设置协议栏字体是否加粗(true:加粗;false:不加粗)
  String setPrivacyCustomToastText; //未勾选协议时toast提示文字
  bool setPrivacyNameUnderline;  //协议是否显示下划线
  bool setOperatorPrivacyAtLast;//运营商协议是否为最后一个显示

授权页 slogan

  String setSloganTextColor; //设置slogan文字颜色
  int setSloganTextSize; //设置slogan文字字体大小
  int setSloganOffsetY; //设置slogan相对于标题栏下边缘y偏移
  bool setSloganHidden = false; //设置slogan是否隐藏(true:隐藏;false:不隐藏)
  int setSloganOffsetBottomY; //设置slogan相对屏幕底部Y偏移
  int setSloganOffsetX; //设置slogan相对屏幕左侧X偏移
  bool setSloganTextBold; //设置slogan文字字体是否加粗(true:加粗;false:不加粗)

创蓝 slogan

//创蓝slogan设置
  int setShanYanSloganOffsetY; //设置创蓝slogan相对于标题栏下边缘y偏移
  int setShanYanSloganOffsetBottomY; //设置创蓝slogan相对屏幕底部Y偏移
  int setShanYanSloganOffsetX; //设置创蓝slogan相对屏幕左侧X偏移
  String setShanYanSloganTextColor; //设置创蓝slogan文字颜色
  int setShanYanSloganTextSize; //设置创蓝slogan文字字体大小
  bool setShanYanSloganHidden; //设置创蓝slogan是否隐藏(true:隐藏;false:不隐藏)
  bool setShanYanSloganTextBold; //设置创蓝slogan文字字体是否加粗(true:加粗;false:不加粗)

协议页导航栏

  String setPrivacyNavColor; //设置协议页导航栏背景颜色
  bool setPrivacyNavTextBold; //设置协议页导航栏标题文字是否加粗(true:加粗;false:不加粗)
  String setPrivacyNavTextColor; //设置协议页导航栏标题文字颜色
  int setPrivacyNavTextSize; //设置协议页导航栏标题文字大小
  String setPrivacyNavReturnImgPath; //设置协议页导航栏返回按钮图标
  bool setPrivacyNavReturnImgHidden; //设置协议页导航栏返回按钮是否隐藏(true:隐藏;false:不隐藏)
  int setPrivacyNavReturnBtnWidth; //设置协议页导航栏返回按钮宽度
  int setPrivacyNavReturnBtnHeight; //设置协议页导航栏返回按钮高度
  int setPrivacyNavReturnBtnOffsetRightX; //设置协议页导航栏返回按钮距离屏幕右侧X偏移
  int setPrivacyNavReturnBtnOffsetX; //设置协议页导航栏返回按钮距离屏幕左侧X偏移
  int setPrivacyNavReturnBtnOffsetY; //设置协议页导航栏返回按钮距离屏幕上侧Y偏移

授权页隐私协议框

  String addCustomPrivacyAlertView; //添加授权页上显示隐私协议弹框

授权页 loading

  String setLoadingView; //设置授权页点击一键登录自定义loading

授权页弹窗样式

  List<String>setDialogTheme; //设置授权页为弹窗样式,包含5个参数:1.弹窗宽度 2.弹窗高度 3.弹窗X偏移量(以屏幕中心为原点) 4.弹窗Y偏移量(以屏幕中心为原点) 5.授权页弹窗是否贴于屏幕底部

注意:

a.控件 X 偏移如果不设置默认居中。

添加自定义控件

调用示例

 List<ShanYanCustomWidget> shanyanCustomWidget = [];
    final String btn_widgetId = "other_custom_button"; // 标识控件 id
    ShanYanCustomWidget buttonWidget =
    ShanYanCustomWidget(btn_widgetId, ShanYanCustomWidgetType.TextView);
    buttonWidget.textContent = "其他方式登录 >";
    buttonWidget.bottom = 200;
    buttonWidget.width = 150;
    buttonWidget.height = 40;
    buttonWidget.backgroundColor ="#330000";
    buttonWidget.isFinish = false;
    //buttonWidget.btnNormalImageName = "";
    //buttonWidget.btnPressedImageName = "";
    buttonWidget.textAlignment = ShanYanCustomWidgetGravityType.center;
    shanYanUIConfig.androidPortrait.widgets = shanyanCustomWidget;

参数说明

  String widgetId; //自定义控件ID
  int left = 0; // 自定义控件距离屏幕左边缘偏移量,单位dp
  int top = 0; // 自定义控件距离导航栏底部偏移量,单位dp
  int right = 0; // 自定义控件距离屏幕右边缘偏移量,单位dp
  int bottom = 0; // 自定义控件距离屏幕底部偏移量,单位dp
  int width = 0; // 自定义控件宽度,单位dp
  int height = 0; // 自定义控件高度,单位dp
  String textContent = ""; // 自定义控件内容
  double textFont = 13.0; // 自定义控件文字大小,单位sp
  String textColor = "#aa0000"; // 自定义控件文字颜色
  String backgroundColor; // 自定义控件背景颜色
  String backgroundImgPath; // 自定义控件背景图片
  ShanYanCustomWidgetGravityType textAlignment; //自定义控件内容对齐方式
  ShanYanCustomWidgetType type; //自定义控件类型,目前只支持 textView,button
  bool isFinish = true; //点击自定义控件是否自动销毁授权页

添加自定义 xml 布局

调用示例

List<ShanYanCustomWidgetLayout> shanYanCustomWidgetLayout = [];
String layout_name = "relative_item_view";
ShanYanCustomWidgetLayout relativeLayoutWidget = ShanYanCustomWidgetLayout(
      layout_name, ShanYanCustomWidgetLayoutType.RelativeLayout);
relativeLayoutWidget.top = 270;
relativeLayoutWidget.widgetLayoutId = ["weixin", "qq", "weibo"];
shanYanCustomWidgetLayout.add(relativeLayoutWidget);
shanYanUIConfig.androidPortrait.widgetLayouts = shanYanCustomWidgetLayout;
     // 添加点击事件监听
    oneKeyLoginManager.addClikWidgetEventListener((eventId) {
      _toast("点击了:" + eventId);
    });

参数说明

  String widgetLayoutName; //自定义xml布局名称
  String widgetLayoutId; //自定义xml中控件ID
  int left = 0; // 自定义布局距离屏幕左边缘偏移量,单位dp
  int top = 0; // 自定义布局距离导航栏底部偏移量,单位dp
  int right = 0; // 自定义布局距离屏幕右边缘偏移量,单位dp
  int bottom = 0; // 自定义布局距离屏幕底部偏移量,单位dp
  int width = 0; // 自定义布局宽度,单位dp
  int height = 0; // 自定义布局高度,单位dp

IOS 部分

调用该方法可实现对三网运营商授权页面个性化设计。(三网界面配置内部实现逻辑不同,请务必使用移动、联通、电信卡分别测试三网界面

调用示例

 /*iOS 页面样式设置*/
    shanYanUIConfig.ios.isFinish = false;
    shanYanUIConfig.ios.setAuthBGImgPath = "sy_login_test_bg";

    shanYanUIConfig.ios.setPreferredStatusBarStyle = iOSStatusBarStyle.styleLightContent;
    shanYanUIConfig.ios.setStatusBarHidden = false;
    shanYanUIConfig.ios.setAuthNavHidden = false;
    shanYanUIConfig.ios.setNavigationBarStyle = iOSBarStyle.styleBlack;
    shanYanUIConfig.ios.setAuthNavTransparent = true;

    shanYanUIConfig.ios.setNavText = "测试";
    shanYanUIConfig.ios.setNavTextColor = "#80ADFF";
    shanYanUIConfig.ios.setNavTextSize = 18;

    shanYanUIConfig.ios.setNavReturnImgPath = "nav_button_white";
    shanYanUIConfig.ios.setNavReturnImgHidden = false;

//    shanYanUIConfig.ios.setNavBackBtnAlimentRight = true;

    shanYanUIConfig.ios.setNavigationBottomLineHidden = false;

    shanYanUIConfig.ios.setNavigationTintColor = "#FF6659";
    shanYanUIConfig.ios.setNavigationBarTintColor = "#BAFF8C";
    shanYanUIConfig.ios.setNavigationBackgroundImage = "圆角矩形 2 拷贝";

//    shanYanUIConfig.ios.setNavigationShadowImage =

    shanYanUIConfig.ios.setLogoImgPath = "logo_shanyan_text";
//    shanYanUIConfig.ios.setLogoCornerRadius = 30;
    shanYanUIConfig.ios.setLogoHidden = false;

    shanYanUIConfig.ios.setNumberColor = "#499191";
    shanYanUIConfig.ios.setNumberSize = 20;
    shanYanUIConfig.ios.setNumberBold = true;
    shanYanUIConfig.ios.setNumberTextAlignment = iOSTextAlignment.right;

    shanYanUIConfig.ios.setLogBtnText = "测试一键登录";
    shanYanUIConfig.ios.setLogBtnTextColor = "#FFFFFF";
    shanYanUIConfig.ios.setLoginBtnTextSize = 16;
    shanYanUIConfig.ios.setLoginBtnTextBold = false;
    shanYanUIConfig.ios.setLoginBtnBgColor =  "#0000FF";

//    shanYanUIConfig.ios.setLoginBtnNormalBgImage = "2-0btn_15";
//    shanYanUIConfig.ios.setLoginBtnHightLightBgImage = "圆角矩形 2 拷贝";
//    shanYanUIConfig.ios.setLoginBtnDisabledBgImage = "login_btn_normal";

//    shanYanUIConfig.ios.setLoginBtnBorderColor = "#FF7666";
    shanYanUIConfig.ios.setLoginBtnCornerRadius = 20;
//    shanYanUIConfig.ios.setLoginBtnBorderWidth = 2;

    shanYanUIConfig.ios.setPrivacyTextSize = 10;
    shanYanUIConfig.ios.setPrivacyTextBold = false;

    shanYanUIConfig.ios.setAppPrivacyTextAlignment = iOSTextAlignment.center;
    shanYanUIConfig.ios.setPrivacySmhHidden = true;
    shanYanUIConfig.ios.setAppPrivacyLineSpacing = 5;
    shanYanUIConfig.ios.setAppPrivacyNeedSizeToFit = false;
    shanYanUIConfig.ios.setAppPrivacyLineFragmentPadding = 10;
    shanYanUIConfig.ios.setAppPrivacyAbbreviatedName = "666";
    shanYanUIConfig.ios.setAppPrivacyColor = ["#808080", "#00cc00"];

    shanYanUIConfig.ios.setAppPrivacyNormalDesTextFirst = "Accept";
//    shanYanUIConfig.ios.setAppPrivacyTelecom = "中国移动服务协议";
    shanYanUIConfig.ios.setAppPrivacyNormalDesTextSecond = "and";
    shanYanUIConfig.ios.setAppPrivacyFirst = ["测试连接A", "https://www.baidu.com"];
    shanYanUIConfig.ios.setAppPrivacyNormalDesTextThird = "&";
    shanYanUIConfig.ios.setAppPrivacySecond = ["测试连接X", "https://www.sina.com"];
    shanYanUIConfig.ios.setAppPrivacyNormalDesTextFourth = "、";
    shanYanUIConfig.ios.setAppPrivacyThird = ["测试连接C", "https://www.sina.com"];
    shanYanUIConfig.ios.setAppPrivacyNormalDesTextLast = "to login";

//    shanYanUIConfig.ios.setOperatorPrivacyAtLast = true;
//    shanYanUIConfig.ios.setPrivacyNavText = "闪验运营商协议";
//    shanYanUIConfig.ios.setPrivacyNavTextColor = "#7BC1E8";
//    shanYanUIConfig.ios.setPrivacyNavTextSize = 15;
//    shanYanUIConfig.ios.setPrivacyNavReturnImgPath = "close-black";

    shanYanUIConfig.ios.setAppPrivacyWebPreferredStatusBarStyle = iOSStatusBarStyle.styleDefault;
    shanYanUIConfig.ios.setAppPrivacyWebNavigationBarStyle = iOSBarStyle.styleDefault;

//运营商品牌标签("中国**提供认证服务"),不得隐藏
    shanYanUIConfig.ios.setSloganTextSize = 11;
    shanYanUIConfig.ios.setSloganTextBold = false;
    shanYanUIConfig.ios.setSloganTextColor = "#CEBFFF";
    shanYanUIConfig.ios.setSloganTextAlignment = iOSTextAlignment.center;

//供应商品牌标签("创蓝253提供认技术支持")
    shanYanUIConfig.ios.setShanYanSloganTextSize = 11;
    shanYanUIConfig.ios.setShanYanSloganTextBold = true;
    shanYanUIConfig.ios.setShanYanSloganTextColor = "#7BC1E8";
    shanYanUIConfig.ios.setShanYanSloganTextAlignment = iOSTextAlignment.center;
    shanYanUIConfig.ios.setShanYanSloganHidden = false;

    shanYanUIConfig.ios.setCheckBoxHidden = false;
    shanYanUIConfig.ios.setPrivacyState = false;
//    shanYanUIConfig.ios.setCheckBoxVerticalAlignmentToAppPrivacyTop = true;
    shanYanUIConfig.ios.setCheckBoxVerticalAlignmentToAppPrivacyCenterY = true;
    shanYanUIConfig.ios.setUncheckedImgPath = "checkBoxNor";
    shanYanUIConfig.ios.setCheckedImgPath =  "checkBoxNor";
    shanYanUIConfig.ios.setCheckBoxWH = [40,40];
    shanYanUIConfig.ios.setCheckBoxImageEdgeInsets = [6,12,6,0];

    shanYanUIConfig.ios.setLoadingCornerRadius = 10;
    shanYanUIConfig.ios.setLoadingBackgroundColor = "#E68147";
    shanYanUIConfig.ios.setLoadingTintColor = "#1C7EFF";

    shanYanUIConfig.ios.setShouldAutorotate = false;
    shanYanUIConfig.ios.supportedInterfaceOrientations = iOSInterfaceOrientationMask.all;
    shanYanUIConfig.ios.preferredInterfaceOrientationForPresentation = iOSInterfaceOrientation.portrait;

    shanYanUIConfig.ios.setAuthTypeUseWindow = true;
    shanYanUIConfig.ios.setAuthWindowCornerRadius = 10;

    shanYanUIConfig.ios.setAuthWindowModalTransitionStyle = iOSModalTransitionStyle.flipHorizontal;
//    shanYanUIConfig.ios.setAuthWindowModalPresentationStyle = iOSModalPresentationStyle.fullScreen;
    shanYanUIConfig.ios.setAppPrivacyWebModalPresentationStyle = iOSModalPresentationStyle.fullScreen;
    shanYanUIConfig.ios.setAuthWindowOverrideUserInterfaceStyle = iOSUserInterfaceStyle.unspecified;

    shanYanUIConfig.ios.setAuthWindowPresentingAnimate = true;

    //弹窗中心位置
    shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationCenterX = screenWidthPortrait*0.5;
    shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationCenterY = screenHeightPortrait*0.5;

    shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationWidth = 300;
    shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationHeight = screenWidthPortrait*0.7;

    //logo
    shanYanUIConfig.ios.layOutPortrait.setLogoTop = 40;
    shanYanUIConfig.ios.layOutPortrait.setLogoWidth = 80;
    shanYanUIConfig.ios.layOutPortrait.setLogoHeight = 40;
    shanYanUIConfig.ios.layOutPortrait.setLogoCenterX = 0;
    //手机号控件
    shanYanUIConfig.ios.layOutPortrait.setNumFieldTop = 40+40;
    shanYanUIConfig.ios.layOutPortrait.setNumFieldCenterX = 0;
    shanYanUIConfig.ios.layOutPortrait.setNumFieldHeight = 30;
    shanYanUIConfig.ios.layOutPortrait.setNumFieldWidth = 150;
    //一键登录按钮
    shanYanUIConfig.ios.layOutPortrait.setLogBtnTop = 80+20+20;
    shanYanUIConfig.ios.layOutPortrait.setLogBtnCenterX = 0;
    shanYanUIConfig.ios.layOutPortrait.setLogBtnHeight = 40;
    shanYanUIConfig.ios.layOutPortrait.setLogBtnWidth = 200;

    //授权页 创蓝slogan(创蓝253提供认证服务)
    shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight = 15;
    shanYanUIConfig.ios.layOutPortrait.setShanYanSloganLeft = 0;
    shanYanUIConfig.ios.layOutPortrait.setShanYanSloganRight = 0;
    shanYanUIConfig.ios.layOutPortrait.setShanYanSloganBottom = 15;

    //授权页 slogan(***提供认证服务)
    shanYanUIConfig.ios.layOutPortrait.setSloganHeight = 15;
    shanYanUIConfig.ios.layOutPortrait.setSloganLeft = 0;
    shanYanUIConfig.ios.layOutPortrait.setSloganRight = 0;
    shanYanUIConfig.ios.layOutPortrait.setSloganBottom = shanYanUIConfig.ios.layOutPortrait.setShanYanSloganBottom
        + shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight;

    //隐私协议
//    shanYanUIConfig.ios.layOutPortrait.setPrivacyHeight = 50;
    shanYanUIConfig.ios.layOutPortrait.setPrivacyLeft = 30;
    shanYanUIConfig.ios.layOutPortrait.setPrivacyRight = 30;
    shanYanUIConfig.ios.layOutPortrait.setPrivacyBottom = shanYanUIConfig.ios.layOutPortrait.setSloganBottom
        + shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight;

添加自定义控件

调用示例

  List<ShanYanCustomWidgetIOS> shanyanCustomWidgetIOS = [];

    final String btn_widgetId = "other_custom_button"; // 标识控件 id
    ShanYanCustomWidgetIOS buttonWidgetiOS =
    ShanYanCustomWidgetIOS(btn_widgetId, ShanYanCustomWidgetType.Button);
    buttonWidgetiOS.textContent = "其他方式登录 >";
    buttonWidgetiOS.centerY = 100;
    buttonWidgetiOS.centerX = 0 ;
    buttonWidgetiOS.width = 150;
//    buttonWidgetiOS.left = 50;
//    buttonWidgetiOS.right = 50;
    buttonWidgetiOS.height = 40;
    buttonWidgetiOS.backgroundColor = "#330000";
    buttonWidgetiOS.isFinish = true;
    buttonWidgetiOS.textAlignment = iOSTextAlignment.center;

    shanyanCustomWidgetIOS.add(buttonWidgetiOS);

    final String nav_right_btn_widgetId = "other_custom_nav_right_button"; // 标识控件 id
    ShanYanCustomWidgetIOS navRightButtonWidgetiOS =
    ShanYanCustomWidgetIOS(nav_right_btn_widgetId, ShanYanCustomWidgetType.Button);
    navRightButtonWidgetiOS.navPosition = ShanYanCustomWidgetiOSNavPosition.navright;
    navRightButtonWidgetiOS.textContent = "联系客服";
    navRightButtonWidgetiOS.width = 60;
    navRightButtonWidgetiOS.height = 40;
    navRightButtonWidgetiOS.textColor = "#11EF33";
    navRightButtonWidgetiOS.backgroundColor = "#FDECA3";
    navRightButtonWidgetiOS.isFinish = true;
    navRightButtonWidgetiOS.textAlignment = iOSTextAlignment.center;

    shanyanCustomWidgetIOS.add(navRightButtonWidgetiOS);

    shanYanUIConfig.ios.widgets = shanyanCustomWidgetIOS;

鸿蒙部分


   int? navTextSize;           // 设置服务条款标题字体大小
   String? navTextColor;       // 设置服务条款标题字体颜色,例如"#FFFFFF"
   String? navColor;           // 设置服务栏颜色,例如"#000000"
   int?    loginPageGrayScale; // 设置授权页灰度值,范围0-1

   //手机号码设置
   num?    numberSize;   // 设置号码字体大小
   bool?   numberIsBold; // 设置号码字体是否是bold
   String? numberColor;  // 设置号码字体颜色,例如"#FFFFFF"
   ShanYanHarmonyAlignRuleOption? numberAlignRuleOption; // 设置登手机号码相对布局偏移规则
   ShanYanHarmonyMarginOrPadding? numberMargin;          // 设置手机号码边缘边距

   num?    loginBtnWidth;        // 设置号码宽度
   num?    loginBtnHeight;       // 设置号码高度
   String? loginBtnText;         // 设置登录按钮文本内容
   num?    loginBtnTextSize;     // 设置授权登录文本字体大小
   String? loginBtnTextColor;    // 设置授权登录按钮字体颜色
   String? loginBtnImgPath;      // 设置登录按钮背景图片
   String? loginBtnColor;        // 设置登录按钮背景颜色
   num?    loginBtnBorderRadius; // 设置登录按钮圆角
   ShanYanHarmonyAlignRuleOption? loginBtnAlignRuleOption; //设置登录按钮相对布局偏移规则
   ShanYanHarmonyMarginOrPadding? loginBtnMargin;          // 设置登录按钮边缘边距

   // 隐私协议设置
   List<ShanYanHarmonyPrivacyEntity>?      clauses;                //设置隐私条款
   num?    checkBoxWidth;  // 设置隐私条款勾选框宽度
   num?    checkBoxHeight; // 设置隐私条款勾选框高度
   bool?   clauseState;    // 设置隐私条款勾选框勾选状态
   String? checkedImage;   // 设置 checkbox 勾选和未勾选图片(需同时设置checkedImage、unCheckedImage)
   String? unCheckedImage; // 设置 checkbox 勾选和未勾选图片(需同时设置checkedImage、unCheckedImage)
   String? checkedColor;   // 设置勾选颜色
   String? checkTipText;   // 设置未勾选提示的自定义提示文案。不设置则无提示。
   ShanYanHarmonyMarginOrPadding? clauseMargin;           // 设置隐私协议边缘边距
   ShanYanHarmonyAlignRuleOption? clauseAlignRuleOption;  // 设置隐私协议相对布局偏移规则
   ShanYanHarmonyMarginOrPadding? checkBoxMargin;         // 设置隐私条款勾选框偏移边距
   ShanYanHarmonyAlignRuleOption? checkBoxAlignRuleOption;// 设置隐私协议勾选框相对布局偏移规则

   List<ShanYanCustomWidgetHarmony>? widgets;
   bool? isInterceptionLogin;

   bool? windowMode;           // 设置窗口模式,默认非窗口模式,false
   String? windowWidth;        // 设置窗口宽度,示例"200"或者"70%"
   String? windowHeight;       // 设置窗口高度,示例"400"或者"70%"
   int? windowAlignment;       // 设置窗口位置,0~8,具体可参考鸿蒙DialogAlignment枚举,0为Top
   String? windowOffsetX;      // 设置窗口位置
   String? windowOffsetY;      // 设置窗口位置
   bool? windowShowInSubWindow;// 设置窗口是否在子窗口上
   bool? windowIsModal;        // 设置窗口是否模态弹出
   bool? windowAutoCancel;     // 设置窗口是否自动取消
   String? windowMaskColor;    // 设置窗口背景蒙版颜色,示例"#ffffff"

调用示例

    // 配置协议,其中**CLAUSE**为运营商占位协议,不写配置不生效
    shanYanUIConfig.ohos.clauses = [
      ShanYanHarmonyPrivacyEntity(text: "同意", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'),
      ShanYanHarmonyPrivacyEntity(text: "《**CLAUSE**》", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000'),
      ShanYanHarmonyPrivacyEntity(text: "、", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'),
      ShanYanHarmonyPrivacyEntity(text: "自定义协议1", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000',url:"https:www.baidu.com"),
      ShanYanHarmonyPrivacyEntity(text: "、", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'),
      ShanYanHarmonyPrivacyEntity(text: "自定义协议2", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000',url:"https:www.sina.com"),
      ShanYanHarmonyPrivacyEntity(text: "并使用本机号码", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000')
    ];

    //手机号位置布局
    ShanYanHarmonyAlignRuleOption ruleOption = ShanYanHarmonyAlignRuleOption();
    ruleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center);
    ruleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle);
    shanYanUIConfig.ohos.numberAlignRuleOption = ruleOption;
    shanYanUIConfig.ohos.numberColor = "#ff2345";

    //手机号边距配置
    ShanYanHarmonyMarginOrPadding numMargin = ShanYanHarmonyMarginOrPadding();
    numMargin.top = "10";
    shanYanUIConfig.ohos.numberMargin = numMargin;

    //登录按钮位置布局及边距
    ShanYanHarmonyAlignRuleOption loginRuleOption = ShanYanHarmonyAlignRuleOption();
    loginRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center);
    loginRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle);
    ShanYanHarmonyMarginOrPadding loginMargin = ShanYanHarmonyMarginOrPadding(top: "100");

    shanYanUIConfig.ohos.loginBtnAlignRuleOption = loginRuleOption;
    shanYanUIConfig.ohos.loginBtnMargin = loginMargin;

    shanYanUIConfig.ohos.checkBoxMargin = ShanYanHarmonyMarginOrPadding(left: '20',top: '10',bottom: '40',right: '0');
    shanYanUIConfig.ohos.clauseMargin = ShanYanHarmonyMarginOrPadding(left: '10',right: '20',bottom: '30');

    // 自定义控件
    List<ShanYanCustomWidgetHarmony> shanyanCustomWidgetHarmony = [];
    final String harmonybtnWidgetId = "other_custom_button"; // 标识控件 id
    ShanYanCustomWidgetHarmony harmonybtn =
    ShanYanCustomWidgetHarmony(harmonybtnWidgetId, ShanYanCustomWidgetType.Button);
    harmonybtn.textContent = "其他方式登录 >";
    harmonybtn.isFinish = false;

    ShanYanHarmonyAlignRuleOption harmonybtnRuleOption = ShanYanHarmonyAlignRuleOption();
    harmonybtnRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center);
    harmonybtnRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle);
    ShanYanHarmonyMarginOrPadding harmonybtnMargin = ShanYanHarmonyMarginOrPadding(top: "220");
    harmonybtn.width = "200";
    harmonybtn.height = "40";
    harmonybtn.alignRuleOption = harmonybtnRuleOption;
    harmonybtn.margin = harmonybtnMargin;
    harmonybtn.backgroundColor = "#330000";
    shanyanCustomWidgetHarmony.add(harmonybtn);

    final String harmonyImgWidgetId = "other_custom_image"; // 标识控件 id
    ShanYanCustomWidgetHarmony harmonyImg =
    ShanYanCustomWidgetHarmony(harmonyImgWidgetId, ShanYanCustomWidgetType.ImageView);
    harmonyImg.isFinish = false;
    ShanYanHarmonyAlignRuleOption harmonyImgRuleOption = ShanYanHarmonyAlignRuleOption();
    harmonyImgRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center);
    harmonyImgRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle);
    ShanYanHarmonyMarginOrPadding harmonyImgMargin = ShanYanHarmonyMarginOrPadding(top: "310");

    harmonyImg.backgroundImgPath = "qq";
    harmonyImg.width = "200";
    harmonyImg.height = "40";
    harmonyImg.alignRuleOption = harmonyImgRuleOption;
    harmonyImg.margin = harmonyImgMargin;
    harmonyImg.backgroundColor = "#330000";

    shanyanCustomWidgetHarmony.add(harmonyImg);
    shanYanUIConfig.ohos.widgets = shanyanCustomWidgetHarmony;

注意:如果添加布局为自定义控件,监听实现请参考 demo 示例。

二、本机认证 API 使用说明

注:本机认证同免密登录,需要初始化,本机认证、免密登录可共用初始化,两个功能同时使用时,只需调用一次初始化即可。

1.初始化

同免密登录初始化

2.本机号校验

在初始化执行之后调用,本机号校验界面需自行实现,可以在多个需要校验的页面中调用。

调用示例:

//闪验SDK 本机号校验获取token (Android+iOS+harmony)
oneKeyLoginManager.startAuthentication().then((shanYanResult) {
      setState(() {
        _code = shanYanResult.code;
        _result = shanYanResult.message;
        _content = shanYanResult.toJson().toString();
      });

返回为 ShanYanResult 对象属性如下:

字段类型含义
codeIntcode 为 1000:成功;其他:失败
messageString描述
innerCodeInt内层返回码
innerDescString内层事件描述
tokenStringtoken(成功情况下返回)用来和后台校验手机号。一次有效。

3.校验手机号

当本机号校验外层 code 为 1000 时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端接口文档」文档来实现校验本机号的步骤

三、返回码

该返回码为闪验 SDK 自身的返回码,请注意 1003 及 1023 错误内均含有运营商返回码,具体错误在碰到之后查阅「返回码」

24小时热线 400-9669-253