【发布时间】:2018-03-25 11:14:03
【问题描述】:
我正在构建一个登录页面,在提交和验证用户凭据后,它会打开一个本地移动应用程序。直到上周,我通过使用自定义方案 URI 让这个跨移动操作系统工作,例如:
function onLoginCallback() {
const redirectUri = 'customscheme:/action?param1=val1¶m2=val2';
window.location.replace(redirectUri);
}
登录页面以 IABT 形式显示,是 In App Browser Tab 的缩写。
但是,自从 Chrome 61 版发布以来,这种方法在 Android 上被打破了。 Chrome 会阻止重定向,因为没有与重定向相关的明显用户操作(有关此事的更多信息,请参阅 here)。
因此,在执行上面的代码时,我最终会在控制台中收到警告:
导航被阻止:customscheme:/action?param1=val1¶m2=val2
我也尝试将自定义方案 url 更新为意图 url,但无济于事。谷歌搜索这个问题并不能轻易提供一个明确的解决方案,所以我希望任何人都可以帮助我。
编辑: 尝试使用以下场景重现问题(尽可能接近真实场景):
- IABT 显示一个带有单个按钮的页面
- 单击该按钮会触发对模拟端点的 jsonp 调用
- 执行 JSONP 回调并触发自定义事件
- 自定义事件的事件处理程序被触发并将浏览器重定向到另一个模拟端点
- 该模拟端点以 302 响应自定义深度链接方案。
唉,这似乎奏效了。我原以为包含 jsonp 调用会导致 Chrome 阻止最终重定向,因为它无法将其识别为用户发起的操作。
编辑 2: 设法获得可重现的场景。我们设置了一个虚拟端点,它会根据请求简单地返回一个
302,并在 Location 标头中使用自定义方案。这在所有尝试中都被阻止,除了第一个尝试。这个事实仍然令人难以置信。我们正在使用AppAuth for Android 应用程序来测试设置。
我正在为端点打开一个自定义选项卡,如下所示。代码取自this answer。
void launchTab(Context context, Uri uri){
final CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) {
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
final CustomTabsIntent intent = builder.build();
client.warmup(0L); // This prevents backgrounding after redirection
intent.launchUrl(context, uri);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
CustomTabsClient.bindCustomTabsService(context, "com.android.chrome", connection);
}
【问题讨论】:
-
FWIW 我的问题回到了 AndroidManifest.xml 并确保标签正确。
标签: javascript android google-chrome redirect appauth