Turbo Native应用能否不打开外部浏览器访问外部URL完成SSO登录?
Turbo Native 处理外部SSO登录URL的实现方案
针对你提到的Turbo Native应用需在内部处理SSO登录外部URL的需求,可通过以下几种方式实现,避免跳转外部浏览器:
1. 拦截导航请求,在应用内加载外部SSO页面
Turbo Native默认会将非配置域名的URL跳转至外部浏览器,你可以通过自定义会话代理(iOS)或导航拦截器(Android),拦截SSO相关的URL并在应用内的WebView容器中加载:
iOS 实现
在TurboSessionDelegate中重写session(_:shouldVisitURL:)方法,判断目标URL是否属于SSO相关域名,若匹配则用普通WebView加载非Turbo页面:
func session(_ session: Turbo.Session, shouldVisitURL url: URL) -> Bool { let ssoDomains = ["abc.com", "pw-sso.example.com"] // 替换为实际SSO域名 if ssoDomains.contains(url.host ?? "") { // 用普通WebView承载SSO页面 let webViewController = UIViewController() let webView = WKWebView(frame: webViewController.view.bounds) webViewController.view.addSubview(webView) webView.load(URLRequest(url: url)) self.present(webViewController, animated: true) return false // 阻止Turbo默认跳转逻辑 } return true // 其他URL按Turbo默认逻辑处理 }
Android 实现
通过TurboActivity的onVisitProposal方法拦截URL,对SSO域名发起应用内导航:
override fun onVisitProposal(visitProposal: VisitProposal) { val ssoDomains = setOf("abc.com", "pw-sso.example.com") // 替换为实际SSO域名 val host = visitProposal.url.host ?: "" if (ssoDomains.contains(host)) { // 启动独立WebView页面加载SSO内容 val intent = Intent(this, WebViewActivity::class.java).apply { putExtra("URL", visitProposal.url.toString()) } startActivity(intent) visitProposal.cancel() } else { visitProposal.accept() } }
需创建WebViewActivity承载外部页面,确保其Cookie存储与Turbo WebView一致。
2. 统一Cookie存储,保持会话一致性
SSO登录后的会话Cookie需要在Turbo WebView和外部页面WebView之间共享,才能让登录状态传递回Turbo应用:
- iOS:所有WebView默认使用
WKWebsiteDataStore.default(),自动共享Cookie。 - Android:启动时开启Cookie同步:
CookieManager.getInstance().setAcceptCookie(true) CookieManager.getInstance().setAcceptThirdPartyCookies(turboWebView, true)
3. 配置SSO回调URL为应用内跳转
将SSO服务的回调URL配置为应用的自定义URL Scheme或Universal Link(iOS)/App Link(Android),SSO登录完成后可直接跳转回Turbo应用,无需经过外部浏览器。跳转后恢复Turbo会话即可获取已登录状态。
4. 启用Turbo的WebView降级机制
对于不支持Turbo的外部页面,可配置Turbo在应用内自动降级为普通WebView加载,无需手动拦截。具体可参考Turbo Native官方文档,将SSO域名加入允许降级的配置列表。
内容的提问来源于stack exchange,提问作者samueletc
相关产品推荐
相关产品推荐

