IOS问题



1. 移动手机号报获取 token 失败: desc = 错误的请求签名, resultCode = 103101

SDK1.7.3 以下版本会出现,可更新SDK或按照下面方法进行解决:

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



2. 预取号的时机

预取号比较耗时,若直接预取号之后再进入授权页面,会影响用户体验。

建议用户提前预取号,可以放到 didFinishLaunchingWithOptions 方法中,因获取运营商信息的时候需要用到 window,建议要放到设置了 window 的 rootViewController 之后



3.预取号成功后,调用取号方法,取号页面无法弹起

有两种情况可能会导致该问题,请参照下述方案解决:
a. 在授权页面,取号成功后,必须调用 SDK 的 dismissAuthViewController 方法关掉授权页面;

b. 由于移动进入授权页面时要检测网络状态,若网络极差则无法进入授权页面



4. SDK 报 8001 错误/服务条款页面加载不出来

ATS未设置白名单,参考下图设置 ATS 白名单,也可以参考官网部署文档:

linkerflags



5. 仅支持横屏的 app 在双卡手机上无法获取运营商信息

linkerflags

获取运营商信息时需要用到状态栏信息,而只支持横屏的 app 中无法获取状态栏信息。可以通过工程支持竖屏,在对应的 ViewController 中设置为只支持横屏,解决该问题。



6. CocoaPods 无法获取 OneLogin

若在集成极验 SDK 之前就安装了 CocoaPods,安装完成之后,会在本地有一份缓存,缓存中并没有 OneLogin,可通过下述步骤解决:
a. 删掉缓存的索引,使用 pod setup 重新建立索引即可;

b. 使用 pod install --repo-update 安装。



7. 自定义协议点击无响应

可能是下面两种情况导致,可参照排查:
a. 初始化协议时,对应的 block 没有传 nil,但是在 block 中又没做任何操作;

b. 多个协议使用了相同的 URL



8. 在授权页面,当前流量卡为电信时,点击一键登录报 40399

1.8.0以下版本会出现该问题,可更新SDK或按照下面方法进行解决:

app 内部存在多个 window 的情况时,授权页面要放到 keyWindow



9. 联通预取号报 -40201 错误
用户修改了手机时间,手机调为正常时间即可。若当前时间恢复正常后依然报错,检查下当前网络环境



10. iOS 13 双卡预取号失败

1.7.3 之前的版本不支持 iOS 13 双卡,请升级到 1.8.0或以上 版本



11. - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 方法中(程序启动时)预取号失败

预取号方法会先调用系统 API 检测当前手机流量对应的运营商,而在程序刚刚启动时,该检测方法往往会检测不到正确的运营商。

可以把预取号的方法放到 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 方法的最后面执行,或者稍微延迟一下去执行预取号方法



12. 联通 SDK 预取号始终超时

可能是联通对区域做了限速,或者设置的超时时间过短,建议超时时间设置5s左右进行调试。



13. push 方式进入授权页面或者服务条款页面

OneLogin 授权页面和服务条款页面不是 UINavigationController,不支持 push 方式进入,默认是通过 presentViewController 方法进入的,可以通过添加动画来模拟 push 的方式进入,代码如下:

CATransition *animation = [CATransition animation];         
animation.duration = 0.5;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromRight;

CustomProtocolViewController *customProtocolController = [CustomProtocolViewController new];
[[OneLogin currentAuthViewController].view.window.layer addAnimation:animation forKey:nil];
customProtocolController.modalPresentationStyle = UIModalPresentationFullScreen;
[[OneLogin currentAuthViewController] presentViewController:customProtocolController animated:NO completion:nil];



14. 授权页面卡死

通过 presentViewController 方法进入授权页面时,默认的 UIModalPresentationStyleUIModalPresentationFullScreen,在某些场景下,进入到授权页面后,调用 dismissViewControllerAnimated 方法关闭授权页面时,会出现页面不消失的情况,然后实际上,授权页面已经被释放掉了,故此时点击授权页面上的任何控件均无响应,造成页面卡死现象,判断为 iOS 系统 bug,解决方案是,将 UIModalPresentationFullScreen 改为 UIModalPresentationOverFullScreen 即可



15. preGetTokenWithCompletion 方法回调中使用 if ([status isEqualToNumber:@(200)]) 方法判断预取号是否成功导致 crash

不能用该方法判断预取号是否成功,正确的判断方法如下:

// 预取号成功
if (result.count > 0 && result[@"status"] && 200 == [result[@"status"] integerValue]) {
}



16.隐私条款是否支持设置距离屏幕底部偏移
不支持设置距离屏幕底部偏移,只支持设置距离屏幕顶部偏移,请根据屏幕尺寸,以 375*667 为基准,给偏移量乘一个比例即可

Android问题



1.全机型,全系统兼容吗?

本产品依赖第三方运营商SDK,联通SDK最低可兼容Android 5.0,因此移动、电信用户最低可支持Android 4.0,联通用户最低可支持Android 5.0



2. 只有一个回调,该怎样处理页面切换等逻辑呢?

页面的所有状态都有错误码输出,可以根据错误码来实现。



3. 怎样控制关闭授权页的时机?

在requestToken()方法执行完成之后,根据错误码来自主实现关闭授权页的时机,当请求成功之后需要页面跳转的时候是关闭授权页的时机。开发者自定义控件的事件发生时也是关闭授权页的时机。



4. 授权页面的沉浸式状态栏或者设置状态栏的颜色怎么实现呢?

0.6.1版本之后,可以通过setStatusBar方法设置。



5. 怎样实现横屏呢?

在页面初始化时调用OneLoginHelper.with().setRequestedOrientation(MainActivity.this, false)即可。然后页面的偏移量可以在OneLoginThemeConfig中进行配置。



6. 怎样设置主题?

0.9.0版本之后,SDK 内部 AndroidManifest 默认提供了授权页隐私页 Activity 的声明及默认主题配置。自定义主题时需要在用户自己的清单文件中添加 activity 的相关配置,如下代码片段所示。针对多个需要覆盖的配置,tools:replace 后面可填多个配置项,通过西文逗号,分隔即可。

<activity
android:name="com.geetest.onelogin.activity.OneLoginActivity"
tools:replace="android:theme"
android:theme="@style/Theme.ActivityDialogStyle" />
<activity
android:name="com.geetest.onelogin.activity.OneLoginWebActivity"
tools:replace="android:theme"
android:theme="@style/Theme.ActivityDialogStyle" />



7. 如何设置授权页面的Logo?

0.6.1版本之后,可以通过setLogoImgView方法设置。



8. 怎样隐藏返回图标?

0.6.1版本之后,可以通过setAuthNavReturnImgView方法设置。



9. 怎样实现第三方登录的自定义?

在Demo中有详细的方法展示,在这里展示部分代码。

private void initLogin() {
LayoutInflater inflater1 = LayoutInflater.from(context);
RelativeLayout relativeLayout = (RelativeLayout) inflater1.inflate(R.layout.relative_item_view, null);
RelativeLayout.LayoutParams layoutParamsOther = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParamsOther.setMargins(0,dip2px(context, 430), 0, 0);
layoutParamsOther.addRule(RelativeLayout.CENTER_HORIZONTAL);
relativeLayout.setLayoutParams(layoutParamsOther);
ImageView weixin = relativeLayout.findViewById(R.id.weixin);
ImageView qq = relativeLayout.findViewById(R.id.qq);
ImageView weibo = relativeLayout.findViewById(R.id.weibo);
weixin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "微信登录", Toast.LENGTH_SHORT).show();
}
});
qq.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "qq登录", Toast.LENGTH_SHORT).show();
}
});
weibo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "微博登录", Toast.LENGTH_SHORT).show();
}
});
OneLoginHelper.with().addOneLoginRegisterViewConfig("title_button", new AuthRegisterViewConfig.Builder()
.setView(relativeLayout)
.setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
.setCustomInterface(new CustomInterface() {
@Override
public void onClick(Context context) {
Toast.makeText(context, "动态注册的其他按钮", Toast.LENGTH_SHORT).show();
}
})
.build()
);
}



10. 怎样设置弹窗形式?

0.6.1版本之后,可以通过setDialogTheme方法设置。0.9.0版本之后,如果不改theme,则只需要这一步即可。



11. 授权页面弹框背景为黑色,如何设置为透明?

授权页面以对话框形式弹出时,支持通过主题设置背景样式。未设置主题的情况下,默认背景为黑色,可参考以下方式设置为透明背景:

在主题配置文件styles.xml中增加对话框主题样式:

<style name="Theme.ActivityDialogStyle" parent="Theme.AppCompat.Light.NoActionBar"> <!--背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item> <!--dialog的整个屏幕的背景是否有遮障层-->
<item name="android:backgroundDimEnabled">true</item>
</style>

在AndroidManifest.xml中给授权页面应用主题样式(参考问题6):

<activity
android:name="com.geetest.onelogin.activity.OneLoginActivity"
...
android:theme="@style/Theme.ActivityDialogStyle" />



12. OneLoginThemeConfig使用注意事项?

  1. 配置项的图片,地址都应为drawable目录下。
  2. OffsetY与OffsetY_B两者必须有一个值为0,偏移量以不为0的方向作为基准。