PWA如何强制window.open调用的URL在系统浏览器而非PWA内打开?
问题描述
我基于@angular/pwa构建了一个Angular应用,支持微软、谷歌、脸书、推特等第三方登录。用户选择第三方登录时,我会调用window.open打开承载Challenge的URL。
当前遇到的问题是:从浏览器内的Web应用调用window.open时,目标URL会被强制在PWA内打开。我已经尝试了所有能想到的解决方案均无效,最后尝试的将第三方登录端点部署在子域名上的方案原本运行良好。
但现在我给应用新增了双因素认证(2FA)功能,要让2FA正常工作,ExternalLoginSigninAsync的调用域名必须和TwoFactorAuthenticatorSignInAsync的调用域名保持一致,因此需要解决让window.open打开的URL强制在浏览器而非PWA内打开的问题。
已排除的无效方案
以下方案均已验证无效,无需再提及:
- 在navigationUrls中排除路径:
"navigationUrls": [ "!/web/v3/Account/connect/" ] - 调用
window.open(url, '_system') - 调用
window.open(url, '_blank') - 添加ngsw-bypass参数:
window.open(url + '?ngsw-bypass=true')
补充说明
经查阅Chromium源码,对应逻辑决定了URL是在PWA内启动还是打开新标签页,对应的调用栈如下:
- WebappLauncherActivity.shouldLaunchWebapp
- WebApkValidator.canWebApkHandleUrl
- 若要让指定URL不在PWA内打开,需要让WebApkValidator.resolveInfosForUrlAndOptionalPackage返回
false
内容的提问来源于stack exchange,提问作者Pieterjan
相关产品推荐
相关产品推荐

