更新时间:2026-01-13 17:21:33
产生原因:开发者打开混淆开关,但是没有配置混淆过滤文件
解决方案:请按照文档混淆规则部分核查
产生原因:创建应用时填写的包名/包签名与当前运行 APP 的不一致
解决方案:确认好所需要的正确的包名/包签名,① 如果创建应用时填写错误,请联系运营人员或者重新创建个正确的应用;② 如果填写无误,项目配置错误,请按照文档创建应用部分核查
产生原因:so 库未引用到或 so 库版本与 SDK 版本不对应
解决方案:

产生原因:适配框架导致 SDK 内置界面和 app 界面获取到的 density 发生变化 ,导致原有控件和自定义控件参考系不一样。
解决方案:
① 如果使用今日头条适配框架出现界面错乱问题,需要过滤授权页:AutoSizeConfig.getInstance().getExternalAdaptManager().addCancelAdaptOfActivity(ShanYanOneKeyActivity.class).addCancelAdaptOfActivity(CmccLoginActivity.class).addCancelAdaptOfActivity(LoginAuthActivity.class);
如果授权页是透明的,需要把授权页前一个 activity 也加入过滤。
② 如果使用 JessYanCoding 适配,需要过滤调用拉起授权页的界面AutoSize.autoConvertDensityOfGlobal(MainActivity.this);
③ 如果是修改系统文字大小后不适配,可以设置字体大小单位用 dp,ShanYanUIConfig 中配置 setTextSizeIsdp(true)
④ 目前部分折叠屏手机和分屏显示时,界面适配可能会有问题,暂时没有优化方案。
产生原因:取号原理依赖数据流量,① 部分 OPPO 机型,WiFi 和数据流量双开情况下无法使用数据流量,② 个别 6.0 系统机型,系统不支持 CHANGE_NETWORK_STATE 权限目前统计到的机型如下:

解决方案:不支持 WiFi+数据网络;请关闭 WiFi,使用纯数据网络取号
方法一:ShanYanUIConfig 配置中,调用:setCheckBoxTipDisable(true);(true:关闭,false:开启,默认:false)
方法二:传一个空的 toast 对象,调用示例:

按照文档给的 setLoadingView 方法传入自定义 loadingview 布局,调用示例:

如果需要隐藏 loading,传 setLoadingView(new RelativeLayout(context))。
如果是插件集成想隐藏 loading,需要传空的 xml 文件,以 flutter 为例:

是否可以去掉 CHANGE_WIFI_STATE 权限?
该权限可选,仅用于 WiFi+数据网络双开的情况下,提高 OPPO 机型 6.0-9.0 系统取号成功率。
因为部分 OPPO 机型,系统底层不支持 WiFi+数据网络双开情况下指定使用数据网络,而取号必须在数据网络下进行,所以使用该权限触发系统弹出授权数据网络的弹窗,提高取号成功率。调用 SDK 初始化方法成功后,并且预取号没有成功过(如首次安装应用)时,会触发一次。
产生原因:资源被压缩,
解决方案:需要添加过滤:"R.anim.umcsdk*", "R.drawable.umcsdk*", "R.layout.layout_shanyan*", "R.id.shanyan_view*",
① 如果配置了 shrinkResources true(注意:flutter 插件默认配置了),需要把 true 改 false,即:zipAlignEnabled false。如果需要设置 shrinkResources true 则要在 raw/keep 里面配置资源过滤。[keep.xml]添加示例:

② 如果项目中使用 AndResGuard 资源压缩,需要在 module 的 build.gradle 中添加资源过滤。添加示例:

需要使用 setPrivacyState 设置,true:选中;false:未选中,默认:true;
不能使用 OneKeyLoginManager.getInstance().setCheckBoxValue(false);该方法是授权页展示后,改变勾选状态时使用的。
① 弹窗样式背景黑屏效果如下:

② 导航栏有黑条遮挡,效果如下:

解决方案:修改 AndroidManifest.xml 中授权页 activity 的主题 theme,可以参考示例 demo 源码中的主题配置
通过 addCustomPrivacyAlertView 添加,具体实现可以参考 SDK 包中的 demo 示例源码,A 配置示例部分,如下:

注意:默认添加进去的view是隐藏的,需要主动调用view.setVisibility(View.VISIBLE);
报错信息:
1.java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported
2.java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
3.resultCode":"200025","authType":"0","authTypeDes":"其他","resultDesc":"发生未知错误"
产生原因:android P 行为变更,不支持同时使用多个进程中具有相同数据目录的 WebView,因为 SDK 内部有使用到 webview 加载协议,如果客户端存在多进程,需要为不同进程 webView 设置不同目录
解决方案:在 Application onCrete 中调用下面方法(必须放到初始化之前)示例:
复制成功@RequiresApi(api = 28) public void webviewSetPath(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { String processName = getProcessName(context); if (!getApplicationContext().getPackageName().equals(processName)) { WebView.setDataDirectorySuffix(processName); } } } public String getProcessName(Context context) { if (context == null) { return null; } ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { if (processInfo.pid == android.os.Process.myPid()) { return processInfo.processName; } } return null; }
报错信息:
1.Only fullscreen opaque activities can request orientation
2.Attempt to invoke virtual method 'com.cmic.sso.sdk.d.b com.cmic.sso.sdk.a.a()' on a null object reference
com.cmic.sso.sdk.view.LoginAuthActivity.onCreate(LoginAuthActivity.java:104)
3.java.lang.NullPointerException:Attempt to invoke virtual method 'com.cmic.sso.sdk.d.b com.cmic.sso.sdk.a.a()' on a null object reference
4.android.util.SuperNotCalledException Activity {com.mlwx.fallinlove/com.cmic.sso.sdk.activity.LoginAuthActivity} did not call through to super.onCreate()
产生原因:在 8.0 系统版本上,只有全屏不透明的 activity 才能指定方向
解决方案:弹框或者透明主题,授权页不能指定方向。如需指定方向,可以指定授权页前个页面的方向,授权页设置跟随前个界面方向,即:“android:screenOrientation="behind"”
产生原因:第一次拉起的授权页没有销毁,又重新调用了拉起授权页
解决方案:等上次拉起的授权页销毁后,才能再次调用拉起授权页方法;如果已经调用了销毁授权页方法仍报该错,可能是因为授权页销毁后回到的界面 onStart 或者 onResume 执行耗时操作,阻塞了授权页的 onDestroy,导致授权页销毁延迟,请核查修改耗时操作。
注:开启 SDK 的 log 开关,用 ActivityLifecycleShanYanTask 可以过滤生命周期,查看耗时发生在哪里
产生原因:调用的时机不对
解决方案:需要在初始化方法调用之前调用(单位:秒):OneKeyLoginManager.getInstance().setTimeOutForPreLogin(10);
产生原因:
解决方案:日志里面会有捕获到的异常日志,按照日志确认是哪种情况导致的
如果是 ①:请按照对应版本的集成文档核对 AndroidManifest 里面授权页 activity 配置(核对 activity 名称及包名)
如果是 ②:请按照[问题 10]解决方案排查
如果是 ③:自定义 view 的控件不能复用,需要分别创建
产生原因:某些版本的听云 SDK 的嵌码操作会对 SDK 的编译造成影响,报错如下:


解决方案:更新听云 SDK 到 2.14.10 版本(maven 依赖方式可能没有这个版本,需要下载听云 SDK 包本地集成)
初始化有网络即可;
预取号、获取 token 分两种情况:
一、首次调用:
① 预取号:
移动、联通、电信都必须开启数据流量
② 获取 token(预取号已成功):
移动:必须有网络(WiFi、数据网络均可)
联通、电信:
二、非首次(成功过):
① 由于系统层限制,部分 OPPO、vivo、一加机型,WiFi+数据网络环境下必须手动授予数据流量权限才能使用数据网络,而取号(无缓存的情况下)必须使用数据网络才能成功,所以如果没有手动授予数据流量权限时取号会失败;
② 部分 6.0 系统在系统层不支持 CHANGE_NETWORK_STATE 权限,目前统计到的机型有:
| 机型 | 系统 |
|---|---|
| 红米 Note 4X(Redmi Note 4X) | 6.0 |
| 红米 Note 4X(Redmi Note 4) | 6.0 |
| 华为荣耀 7 (PLK-AL10) | 6.0 |
| 华为 mate7(MT7-TL10) | 6.0、6.0.1 |
| 荣耀畅玩 5X(KIW-AL10) | 6.0.1 |
| 华为麦芒 4(RIO-AL00) | 6.0.1 |
| 华为 P8(GRA-UL10) | 6.0 |
| 华为 P8max(P8max) | 6.0 |
| 乐视(Le X620) | 6.0 |
| 华为 Mate 8(NXT-AL10) | 6.0 |
| 红米 Pro(Redmi Pro) | 6.0 |
产生原因:授权页 activity 配置错误。
解决方案:按照集成文档核查 AndroidManifest.xml 中授权页 activity 配置
产生原因:版本升级导致的 so 库文件未引用到,或者 so 库版本跟 SDK 版本不对应
解决方案:按照升级指南核查 so 库配置
产生原因:授权页 activity 未配置正确
解决方案:按照文档核查授权页 activity 的包名、类名是否配置正确
产生原因:①app 中存在 hook 系统获取 ip 地址 api 的操作,导致 SDK 取到的 IP 不准确,取号时通过 IP 做安全校验失败 ② 取号被运营商标记为风险取号
解决方案:① 核查代码中是否有 hook 系统获取 ip 的方法,可以用同一台手机在相同网络环境下,安装获取IP列表安装包,获取一组 ip 地址;再在自己 app 中按照[ 获取 ip 列表方法.txt]获取一组 ip 地址,比对结果是否一样,如果结果不一样,说明是 hook 系统 api 导致的,需要将下面运营商获取 ip 地址的调用类加 hook 白名单。② 换手机卡或换测试机
复制成功电信调用类:"cn.com.chinatelecom.account.api.e.d" 移动调用类:"com.cmic.gen.sdk.e.p" 联通调用类:"com.sdk.base.framework.utils.app.AppUtils" "com.sdk.l.a" "com.unikuwei.mianmi.account.shield.e.j"
解决方案:需要将 H5 中 a 标签的 target 改成_self,即在当前窗口中打开,不支持在新窗口打开

产生原因:因为自定协议内部可能会有多级跳转,所以点击返回时 SDK 内部先判断 canGoBack,如果 canGoBack 为 true,则只执行 goBack,而不销毁,从而导致点击无反应|不能销毁的情况,
解决方案:需要自己前端开发对协议页做适配。
解决方案:将授权页ShanYanOneKeyActivity主题 theme 中 style 的 parent 使用系统 dialog 相关主题,如:
复制成功<style name="dialogStyle" parent="Theme.AppCompat.Light.Dialog"> <!--没有标题--> <item name="windowNoTitle">true</item> <!--背景透明--> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <!--dialog的整个屏幕的背景是否有遮障层--> <item name="android:backgroundDimEnabled">true</item> </style>
相反,如果想点击弹窗外部不关闭登录页,则不能使用dialog主题,可以参考demo示例源码。
产生原因:大概率是物联网卡,或者 VPN 开启导致的
解决方案:不支持物联网卡取号,不支持连接网络代理取号。
产生原因:① 使用 APP 端集成了第三方网络请求框架,代理了 SDK 接口请求 ② 设备开启了代理或连接的 WiFi 有网络链接安全策略限制的场景
解决方案:不支持网络代理取号



【获取 token 失败、错误的请求签名、103101】
工程中的 Info.plist 中添加 bundleId 对应的 key-value。搜索 Xcode 项目工程中的.strings 国际化文件,如果 app 存在本地国际化文件,请在每个本地国际化文件中添加 CFBundleIdentifier,各个语言版本文件中都需要添加。

**2.移动报错[UASDKLogin getAuthorizationWithModel:complete:] has nil model or nil model.currentVC** 【**has nil model or nil model.currentVC**】关闭授权页时机
a.SDK 拉起授权页方法 直接回调失败时
b.置换手机号有返回结果时
当前页面直接销毁
复制成功[self.PresentedViewController dismissViewControllerAnimated:YES completion:nil];
找到 topVC 进行 dismiss
复制成功dispatch_async(dispatch_get_main_queue(), ^{ //建议使用授权页面配置对象传入的viewcontroller 调 dismiss if (self.navigationController.viewControllers.lastObject.navigationController) { [self.navigationController.viewControllers.lastObject dismissViewControllerAnimated:YES completion:nil]; } else { UIViewController *topRootViewController = [[UIApplication sharedApplication] keyWindow].rootViewController; // 在这里加一个这个样式的循环 while (topRootViewController.presentedViewController) { // 这里固定写法 topRootViewController = topRootViewController.presentedViewController; } // 然后再进行present操作 [topRootViewController dismissViewControllerAnimated:YES completion:nil]; } });
报错信息:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

处理方式:
1.info.plist 中添加 App Transport Security Settings->Allow Arbitrary Loads->YES

2.配置白名单
目前运营商个别接口为 http 请求,对于全局禁用 Http 的项目,需要设置 Http 白名单。以下为运营商 http 接口 host 名单:.cmpassport.com、id6.me、.wostore.cn、mdn.open.wo.cn、*.zzx9.cn,*为通配符,建议按以下方式配置 Info.plist
复制成功<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>zzx9.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>cmpassport.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>id6.me</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>wostore.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>mdn.open.wo.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
sdk_oauth.bundle资源文件是否正常 copy 导入联通 SDK 内部会读取校验 info.plist 文件中 Bundle identifier、Bundle name、Bundle versions string, short、Bundle version 字段,如未配置相关字段 Value 会导致以下崩溃


Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CLSDKInitModel cl_modelInitWithCoder:]: unrecognized selector sent to instance 错误【运行报错、编译报错】
OtherLinkerFlags项-force_load并添加 framework 路径,参考 Xcode 配置添加-force_loadld: 38 duplicate symbols for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 【编译报错、OtherLinkerFlags、framework 路径错误】OtherLinkerFlags`项去掉`-all_load`添加`-force_load`并添加framework路径,参考 Xcode配置添加`-force_load
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CLSDKInitModel cl_modelInitWithCoder:]: unrecognized selector sent to instance 错误【运行报错、编译报错】
添加OtherLinkerFlags项-force_load并添加 framework 路径,参考 Xcode 配置添加-force_load
替换 Demo 中 appid/appkey 和 bundleID 为自己申请的,运行 Demo 确定 Demo 是否可以正常完成流程,如果不能,请联系客服。
如果 Demo 正常运行,用开发者自己的工程运行报 403000,请检查最后一步用获取到的 token 调用手机号查询API是,是否是以 form-data 格式发送参数:使用 AFN 或者 Alamofire 直接发送 completeResult.data,使用原生 NSURLSession 请将 completeResult.data 的每个字段值进行URLEncode 编码再拼接成 form-data 格式字符串("key1=value1&key2=value2&...")再发送,Objc 版 Demo 内有两种方式发送的示例代码
关于如何确定最终是否以 formData 形式发送,可以使用 charls 抓包工具,查看 request 的 headers 里的 Content-Type 是否为application/x-www-form-urlencoded,以及 completeResult.data 的 sign 字段带有 + 号时 + 号丢失的情况
如果开发者后台已经接入手机号查询API,请开发者后台也确认后台的发送格式
1005 获取移动 token 失败, resInfoDict,{desc = "request is time out.";resultCode = 200023;} 【200023、time out、超时】运营商限制不允许短时间内连续多次频繁调用登录接口,请过段时间再试,测试时不要短时间内频繁调用
工程中的 Info.plist 国际化文件,添加 bundleId 对应的 key-value。如果 app 存在本地国际化文件,请在每个本地国际化文件中添加 CFBundleIdentifier,各个语言版本文件中都需要添加。
为了防止恶意刷量攻击,SDK 从 v2.1.1 开始,会限制拉起授权页的调用频率,在短时间内,多次调用将会报频繁操作
release 模式,bitCode 为 NO,developmentTarget 8.0+ 下,ipa 增量约 1.25M。
理论上凡支持调用原生代码模块的平台或框架,都可以集成闪验 SDK,集成方式参考各框架中调用原生代码或制作原生插件教程。目前已确认支持的平台有 ReactNative、Weex、Flutter、Hbuild
213 版本及之前只支持纯 H5 链接,如果有 js 脚本可能导致协议页面 web 加载异常
213 版本之前不支持,213 及之后版本支持
支持
[{String:"300011885619"},{String:"STsid00000015591314406938cJcYsd0Hbwue4002SE2qxYcF0NCpNFk"}]--result:{"code":-6,"message":"token 非法","success":false}或{"resultCode":"105312","taskId":"ea913ef63aa7430f97e8e1603e2cc290"}
三大运营商 token 置换手机号码时的接口分别有对应的 url,需要调用相对应的地址。
sdk 读取的是工程中的 CFBundleIdentifier,请确保项目工程中配置的 CFBundleIdentifier 与闪验后台申请的 BundleID 一致即可
闪验授权登录页各运营商协议默认勾选,用户可自行设置默认状态且勾选框 CheckBox 默认不隐藏。当用户设置 checkBox 隐藏时,电信用户登录就会提示“请勾选协议”,导致用户无法进行登录操作。
暂处理方式:设置 checkbox 显示,同时 checkBox 开放了一个尺寸设置属性,只要单独设置 checkBox 的 size 为{0,0}即可达到隐藏 checkbox 的目的
原因是运营商或我们后台配置的问题
SDK 返回的 device 字段或其他字段用户端传入到后台的时候空格被处理了,导致签名验证通不过。
在 appdelegate 中的 didFinishLaunchingWithOptions 方法中的[self.window makeKeyAndVisible];上面加上 self.window.backgroundColor = [UIColor whiteColor]。
此为 iOS15 之后,iOS 系统导航栏原因,客户需要升级 SDK 版本 2.3.5.0 之后的版本即可。
复制成功/// 统一事件监听方法 /// @param type 事件类型(1:隐私协议点击, 2:协议勾选框点击,3:"一键登录"按钮点击) /// @param code 事件对应序号 type=1时:code:0,1,2,3(协议页序号),message:协议名|当前运营商类型 /// type=2时:code:0,1(0为未选中,1为选中) /// type=3时:code:0,1(0为协议勾选框未选中,1为选中) /// @param message 说明:type=1时:message:协议名_当前运营商类型 - (void)clShanYanActionListener:(NSInteger)type code:(NSInteger)code message:(NSString *_Nullable)message;
错误原因:105313 非法请求,触发了运营商风控,
解决方案:可以多尝试几次飞行模式之后网络重启、手机重启、APP 卸载重装,或者换一个手机设备等尝试一下
UI 配置类:CLUIConfigure,以下仅为简要概括,具体请查看 api 展示,使用示例可查看demo
用户想要获取对应控件,可在代理方法中获取对象的控件对象,具体可查看 demo
可配置项:
报错描述:"code":1003,"errorDesc":"未能完成操作。(移动预取号失败错误 1023。)","innerCode":103111,"innerDesc":"WAP 网关 IP 错误","message":"移动预取号失败"}
原因:由于苹果系统在 xcode14.3,iOS 16.4 系统上废弃了运营商判断的接口,目前我们的 SDK 通过该接口来判断运营商类型,所以在这种情况下判断运营商会失效;
解决方案:SDK版本升级到2.3.6.5及以后版本 或 老版本SDK使用xcode14.2打包。
{"message":"请求非法,appId 不能为空","code":"403000"}
问题排查方案:
检查是否传入 appId 字段。请求数据格式是否正确,本接口不支持发送 JSON 格式数据。
问题解决方案:
首先,请核对字段名称无误,使用正确的字段名。
其次,请确保请求使用 POST 方法,参数放到 RequestBody 中以 application/x-www-form-urlencoded 或 multipart/form-data 提交
{"message":"请求非法,签名验证不通过","code":"403000"}
问题排查方案:
请确保签名生成无误。
问题解决方案:
1、首先确保使用了正确的应用对应的 appKey。
2、其次请确保签名方式正确,签名字段的值由客户服务端生成,签名算法 hmacSHA256(所有传入参数按字段名排序后拼接的字符串,应用 appKey) 后再进行 16 进制字符串转换的值。
问题排查方案:
确认接口传入参数是否传入了 encryptType 字段,encryptType 字段值:0 AES 算法 、1 RSA 算法,不传默认 AES 算法,检查对应的解密函数是否正确。
问题解决方案:
1、如使用 AES 算法,则确认使用了应用对应的正确的 appKey 解密。
2、如使用 RSA 算法,则确认创建应用时是否填写了 RSA 公钥,并使用了填入的 RSA 公钥对应的私钥解密。
{"code":"500000","chargeStatus":0,"message":"权限校验失败"}
问题排查:
确认是否为电信运营商
问题解决方案:
如果为电信运营商,那么请将交易流水号记录并联系闪验客服运营人员处理。
{"code":"500000","data":{"tradeNo":"5420665345084063744"},"message":"token参数无效","chargeStatus":0} 造成原因:APPID填写错误 解决方案:请填写对应应用的APPID,确保获取token的appId和置换手机号的appId一致
{"retCode":"0010","retMsg":"参数校验失败","data":null} 造成原因:本机号校验和一键登录是两个单独的能力,两者的token不能互用。
解决方案:调用对应能力的接口,请使用对应能力生成的token。
核查图片放在了指定的目录下,如Android必须放到drawable目录下