闪验、创蓝闪验

Android问题


高频问题



1.参数异常问题【安卓/Android/android+参数+异常】

①开发者打开混淆开关,但是没有配置混淆过滤文件

②212版本之前SDK没有适配9.0系统


2.签名校验问题【签名校验】

①开发者打开混淆开关,但是没有配置混淆过滤文件

②创建应用时签名填写错误,release和debug版本签名不一致


3.{"result":"-8001","msg":"请求网络异常"}

①确认so库是否按照您项目中的架构导入对应的so库,或者项目是否配置了jni路径。

②3g网络不支持取号。


4.“code=1msg=网络连接已断开status=100001”

9.0以上系统,需要配置对http的支持。用PriorityAsyncTask字段,请求过滤下异常日志。


5.“公网IP无效

1. 如果是纯4G状态下出现公网IP无效,请检查您的运营商接入点名称(APN)是否是net接入点,如果是4G+wifi状态下,建议您换台机型试一下。

2. 双开情况强开流量通道失败,需单开流量。

3. 号码欠费。


6.WiFi+4G预取号失败

因为预取号必须使用数据流量。部分OPPO机型,WiFi+4G环境下第一次使用无法强切到数据流量,华为、vivo、小米等个别机型WiFi+4G一直无法切换到数据流量,预取号会返回失败,需使用纯4G网络。


崩溃问题


1.HashMap空指针问题【HashMap.get/空指针】

image.png


移动在销毁授权页的时候sdk 存放自定义控件的HashMap被清空了,再次拉起授权页可能没有设置进去,目前统计到有万二左右的异常率,需要下个版本修复。


2.在2.1.3以上版本,联通拉起授权页或点击一键登录出现崩溃问题【安卓/Android/andorid+联通崩溃】

 该问题会出现在2.1.3版本及以上,请确保项目中联通原始的布局文件已经删除完,具体是:

 activity_oauth.xml --------------------------  联通免密布局文件

 oauth_loading_dialog.xml -------------------  联通免密布局文件


3.webview相关异常 java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported


原因:android P之后不支持同时使用多个进程中具有相同数据目录的WebView,需要为不同进程webView设置不同目录

方案如下:

image.png

 

常规问题


1.怎么在安卓授权页页面底部添加协议?【底部+自定义协议、底部+用户协议】

运营商协议不必手动添加,SDK已封装为第一条协议,通过给定的方法用可以添加自己的协议,最多添加两条。


2.授权页的加载loading怎么自定义?【自定义loading】

221版本之前不支持自定义,221版本可按照文档给的setLoadingView方法传入自定义loadingview布局,实现自定义loading;如果不想要loading,传入宽高为0的view即可。


3.授权页上的【其他方式登录】按钮,如何定义点击后的行为?【其他方式登录】

SDK默认不提供其他方式登录按钮,需要按照文档手动设置自定义控件


4.闪验android为什么需要获取READ_PHONE_STATEREAD_PHONE_STATE

移动运营商需要此权限判断双卡及换卡,必须授予该权限才能取号成功,否则返回失败状态码和信息。


5.怎么修改授权页状态栏的背景色和字体颜色?【修改状态栏】

SDK没有提供方法,只能通过修改AndroidManifest里面配置的activity主题来修改授权页状态栏背景和状态栏字体颜色。添加下面属性:


1<item name="colorPrimaryDark">@color/white</item>
2<item name="android:windowLightStatusBar"tools:ignore="NewApi">true</item>


6.资源压缩后找不到ID?【Resource ID】

项目中使用资源压缩的,需要配置对以下R文件的过滤:


 1R.anim.umcsdk_anim_loading
 2
 3R.drawable.authbackground_image
 4R.drawable.login_bg_gray
 5R.drawable.oauth_anim_loading_dialog
 6R.drawable.oauth_loading_bg
 7R.drawable.progress_bar_states
 8R.drawable.selector_button_cucc
 9R.drawable.sy_sdk_left
10R.drawable.sysdk_anim
11R.drawable.umcsdk_check_image
12R.drawable.umcsdk_checkbox_bg.xml
13R.drawable.umcsdk_login_btn_bg
14R.drawable.umcsdk_return_bg
15R.drawable.umcsdk_shap_bg
16R.drawable.umcsdk_uncheck_image
17R.drawable.umcsdk_load_dot_white
18R.drawable.umcsdk_mobile_logo
19
20R.layout.activity_ctcc_privacy_protocol
21R.layout.activity_oauth
22R.layout.cmcc_navigationbar_back_layout
23R.layout.oauth_loading_dialog
24R.layout.shanyan_navigationbar_layout
25R.layout.shanyan_privacy_layout
26R.layout.sysdk_activity_onekey_login
27
28R.id.loading_parent
29R.id.oauth_loading_dialog_img
30R.id.loading
31R.id.oauth_loading_dialog_txt
32R.id.sysdk_cucc_login_layout
33R.id.cuc_webview
34R.id.navigation_bar
35R.id.oauth_back
36R.id.oauth_title
37R.id.oauth_content
38R.id.navigation_bar_line
39R.id.app_name
40R.id.other_login
41R.id.login_before_text
42R.id.service_and_privacy
43R.id.authorize_app
44R.id.is_agree
45R.id.shanyan_navigationbar_include
46R.id.sy_cucc_boby
47R.id.oauth_logo
48R.id.oauth_mobile_et
49R.id.brand
50R.id.oauth_login
51R.id.protocol
52R.id.shanyan_onkeylogin_loading
53R.id.agreement_title
54R.id.ctcc_agreement_back
55R.id.oauth_help
56R.id.baseweb_webview
57R.id.sysdk_ctcc_login_layout
58R.id.sysdk_login_boby
59R.id.sysdk_authority_finish
60R.id.sysdk_log_image
61R.id.tv_per_code
62R.id.bt_one_key_login
63R.id.shanyan_privacy_include
64R.id.sysdk_identify_tv
65R.id.shanyan_privacy_rootlayout
66R.id.shanyan_privacy_checkbox_rootlayout
67R.id.shanyan_privacy_checkbox
68R.id.shanyan_privacy_text
69R.id.shanyan_navigationbar_root
70R.id.shanyan_navigationbar_back_root
71R.id.shanyan_navigationbar_back
72R.id.shanyan_navigationbar_title



iOS问题


高频问题


1.移动报 获取移动token失败 Code=1003 “(null)” UserInfo={desc=错误的请求签名, resultCode=103101}

【获取token失败、错误的请求签名、103101】

工程中的Info.plist中添加bundleId对应的key-value。搜索Xcode项目工程中的.strings国际化文件,如果app存在本地国际化文件请在每个本地国际化文件中添加CFBundleIdentifier,各个语言版本文件中都需要添加。


image.png



2.移动报错[UASDKLogin getAuthorizationWithModel:complete:] has nil model or nil model.currentVC has nil model or nil model.currentVC

请检查拉起授权页接口配置参数传参,传入模型是否为空或者传入的baseUIConfigure.viewController是否为当前控制器


3.拉起授权页面方法无回调【拉不起授权页面、授权页+无回调、授权页+无反应】

  • 请检查拉起授权页接口配置参数传参,传入模型是否为空或者传入的baseUIConfigure.viewController是否为当前控制器
  • 确认配置是否传入vc,拉起页面时vc必须为当前正在显示的vc;若传self,需确认当前self就是当前vc;对于从后台启动等方式需要立即拉起授权页的,需确认调用时机是否为当前vc已经显示出来再调方法


4.何时手动销毁授权页 【手动销毁授权页、授权页释放时机】

  • 关闭授权页时机

      a.SDK拉起授权页方法 直接回调失败时

      b.置换手机号有返回结果时


  • 当前页面直接销毁
1[self.PresentedViewController dismissViewControllerAnimated:YES completion:nil];


  • 找到topVC进行dismiss
 1dispatch_async(dispatch_get_main_queue(), ^{
 2    //建议使用授权页面配置对象传入的viewcontroller 调 dismiss
 3    if (self.navigationController.viewControllers.lastObject.navigationController) {
 4        [self.navigationController.viewControllers.lastObject dismissViewControllerAnimated:YES completion:nil];
 5    } else {
 6        UIViewController *topRootViewController = [[UIApplication  sharedApplication] keyWindow].rootViewController;
 7        // 在这里加一个这个样式的循环
 8        while (topRootViewController.presentedViewController) {
 9            // 这里固定写法
10            topRootViewController = topRootViewController.presentedViewController;
11        }
12        // 然后再进行present操作
13        [topRootViewController dismissViewControllerAnimated:YES completion:nil];
14    }
15});


5.ATS开关(Http与Https) 【http+白名单、禁用http、App Transport Security、ATS


报错信息:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

屏幕快照 2019-06-24 下午4.23.05.png


处理方式:

1.info.plist中添加App Transport Security Settings->Allow Arbitrary Loads->YES


屏幕快照 2019-06-24 下午4.18.52.png


2.配置白名单

目前运营商个别接口为http请求,对于全局禁用Http的项目,需要设置Http白名单。以下为运营商http接口host名单:*.cmpassport.com、id6.me、*.wostore.cn、mdn.open.wo.cn、*.zzx9.cn,*为通配符,建议按以下方式配置Info.plist


 1<key>NSAppTransportSecurity</key>
 2    <dict>
 3        <key>NSExceptionDomains</key>
 4        <dict>
 5            <key>zzx9.cn</key>
 6            <dict>
 7                <key>NSIncludesSubdomains</key>
 8                <true/>
 9                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
10                <true/>
11            </dict>
12            <key>cmpassport.com</key>
13            <dict>
14                <key>NSIncludesSubdomains</key>
15                <true/>
16                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
17                <true/>
18            </dict>
19            <key>id6.me</key>
20            <dict>
21                <key>NSIncludesSubdomains</key>
22                <true/>
23                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
24                <true/>
25            </dict>
26            <key>wostore.cn</key>
27            <dict>
28                <key>NSIncludesSubdomains</key>
29                <true/>
30                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
31                <true/>
32            </dict>
33            <key>mdn.open.wo.cn</key>
34            <dict>
35                <key>NSIncludesSubdomains</key>
36                <true/>
37                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
38                <true/>
39            </dict>
40        </dict>
41    </dict>




崩溃问题


1.联通崩溃【联通+崩溃、资源找不到】

测试过程中 移动、电信正常,联通卡运行项目时直接崩溃,请检查项目中sdk_oauth.bundle资源文件是否正常copy导入


2.联通预取号崩溃【预取号+联通+崩溃、NSDictionary + setObject、空指针】

联通SDK内部会读取校验info.plist文件中Bundle identifier、Bundle name、Bundle versions string, short、Bundle version字段,如未配置相关字段Value会导致以下崩溃

image.png


image.png


3.运行`Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CLSDKInitModel cl_modelInitWithCoder:]: unrecognized selector sent to instance` 错误 

【运行报错、编译报错

  • 添加`OtherLinkerFlags`项`-force_load`并添加framework路径,参考 Xcode配置添加`-force_load`
  • 或工程项目->Genaral->Linked Frameworks and Libraries 中添加CL_ShanYanSDK.framework


4. iOS12.0beta版系统奔溃问题 【12.0beta+ 崩溃

  • 问题描述:所有12.0 beta版本找不到serviceSubscriberCellularProviders系统方法导致[CTTelephonyNetworkInfo serviceSubscriberCellularProviders]: unrecognized selector send to  instance崩溃

5. iOS13.0beta版系统奔溃问题 【13.0beta+ 崩溃

  • 问题描述:所有13.0 beta版本[UIApplication valueForKey@"statusBar"]:崩溃
  • 解决方案:2.1.3到2.2.0.3之间版本(包含),需接入方手动加入版本判断,当判断为iOS13.0系统时跳过闪验。从2.2.0.4版本开始sdk内部使用兼容方式修复



常规问题


1.编译报 `ld: 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`


2.运行报`Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CLSDKInitModel cl_modelInitWithCoder:]: unrecognized selector sent to instance` 错误

【运行报错、编译报错】

添加`OtherLinkerFlags`项`-force_load`并添加framework路径,参考 Xcode配置添加`-force_load`


3.报 403000 6006 请求非法,签名验证不通过 【请求非法、签名验证通不过、验签失败、403000、6006】

  • 替换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`,请开发者后台也确认后台的发送格式


4.移动连续报`1005` 获取移动token失败, resInfoDict,{desc = "request is time out.";resultCode = 200023;} 【200023、time out、超时

运营商限制不允许短时间内连续多次频繁调用登录接口,请过段时间再试,测试时不要短时间内频繁调用


5.移动报 获取移动token失败 Code=1003 “(null)” UserInfo={desc=错误的请求签名, resultCode=103101}
【获取token失败、错误的请求签名、103101】

工程中的Info.plist国际化文件,添加bundleId对应的key-value。如果app存在本地国际化文件请在每个本地国际化文件中添加CFBundleIdentifier,各个语言版本文件中都需要添加。


6.关于频繁调用 【频繁调用、操作频繁】

为了防止恶意刷量攻击,SDK从v2.1.1开始,会限制拉起授权页的调用频率,在短时间内,多次调用将会报频繁操作


7.集成sdk后app包体增量 【bitCode、包体大小、包体增量】

release模式,bitCode为NO,developmentTarget 8.0+ 下,ipa增量约950Kb。


8.其他移动端开发框架或平台支持说明 【跨平台开发、插件集成、支持平台】

理论上凡支持调用原生代码模块的平台或框架,都可以集成闪验SDK,集成方式参考各框架中调用原生代码或制作原生插件教程。目前已确认支持的平台有ReactNative、Weex、Flutter、Hbuild


9.iOS系统集成一键登录时,内嵌的协议页面中无法执行脚本吗? 【协议打不开、协议页面加载失败】

213版本及之前只支持纯H5链接,如果有js脚本可能导致协议页面web加载异常


10.是否支持控制自由关闭授权页,方便我们逻辑的衔接 【授权页销毁、手动销毁授权页】

213版本之前不支持,213及之后版本支持


11.是否支持BitCode 【bitcode】

支持


12.置换手机号时报错 【置换手机号报错、token非法、105312】

[{String:"300011885619"},{String:"STsid00000015591314406938cJcYsd0Hbwue4002SE2qxYcF0NCpNFk"}]--result:{"code":-6,"message":"token非法","success":false}或{"resultCode":"105312","taskId":"ea913ef63aa7430f97e8e1603e2cc290"}

三大运营商token置换手机号码时的接口分别有对应的url,需要调用相对应的地址。


13.关于重签名打包【重签名】

sdk读取的是工程中的CFBundleIdentifier,请确保项目工程中配置的CFBundleIdentifier与闪验后台申请的BundleID一致即可


14.220版本CheckBox隐藏时电信用户提示“请勾选协议”【CheckBox、CheckBox 隐藏、请勾选协议】

闪验授权登录页各运营商协议默认勾选,用户可自行设置默认状态且勾选框CheckBox默认不隐藏。当用户设置checkBox隐藏时,电信用户登录就会提示“请勾选协议”,导致用户无法进行登录操作。

暂处理方式:设置checkbox显示,同时checkBox开放了一个尺寸设置属性,只要单独设置checkBox的size为{0,0}即可达到隐藏checkbox的目的


15.2204版本出现网络服务异常 failure:Error Domain=EAccountError Code=30910 "(null)" UserInfo={result=30910, msg=topClass not found in config, responseData=null}

原因是运营商或我们后台配置的问题


16.置换手机号:签名验证不通过

SDK返回的device字段或其他字段用户端传入到后台的时候空格被处理了,导致签名验证通不过。


17.跳转隐私协议:导航条有黑边

在appdelegate中的didFinishLaunchingWithOptions方法中的[self.window makeKeyAndVisible];上面加上self.window.backgroundColor = [UIColor whiteColor]。




服务端问题


1.错误appId不能为空

{"message":"请求非法,appId不能为空","code":"403000"}

问题排查方案:

检查是否传入appId字段。请求数据格式是否正确,本接口不支持发送JSON格式数据。

问题解决方案:

首先,核对字段名称无误,使用正确的字段名。

其次,确保请求使用POST方法,参数放到RequestBody中以application/x-www-form-urlencoded或multipart/form-data提交

 

2.错误请求非法,签名验证不通过

{"message":"请求非法,签名验证不通过","code":"403000"}

问题排查方案:

请确保签名生成无误。

问题解决方案:

1、首先确保使用了正确的应用对应的appKey。

2、其次请确保签名方式正确,签名字段的值由客户服务端生成,签名算法 hmacSHA256(所有传入参数按字段名排序后拼接的字符串,应用appKey) 后再进行16进制字符串转换的值。

 

3.返回参数mobileName密文无法解密

问题排查方案:

确认接口传入参数是否传入了encryptType字段,encryptType字段值:0 AES算法 、1 RSA算法,不传默认AES算法,检查对应的解密函数是否正确

问题解决方案:

1、如使用AES算法,则确认使用应用对应的正确的appKey解密。

2、如使用RSA算法,则确认创建应用时是否填写了RSA公钥,并使用了填入的RSA公钥对应的私钥解密。