如何在重定向至外部网站而非App通用链接时关闭ASWebAuthenticationSession
问题解决方案
首先明确:ASWebAuthenticationSession(简称AS)默认确实需要重定向到自定义URL Scheme(如app://redirect)或已配置的关联通用链接,才能自动触发会话关闭回调,普通的HTTPS API端点无法直接触发这个逻辑。不过你这个场景有两种可行的解决办法,不用完全改变现有授权流程:
解决办法一:自定义URL Scheme中转
- 在Xcode项目的「Info」标签页里,添加自定义URL Scheme(比如
yourapp,对应app://redirect)。 - 初始化ASWebAuthenticationSession时,把
callbackURLScheme参数设为你配置的scheme(比如yourapp):let authSession = ASWebAuthenticationSession( url: yourAuthStartURL, callbackURLScheme: "yourapp" ) { callbackURL, error in // 处理回调逻辑 if let callbackURL = callbackURL { // 从回调URL里提取授权码等参数 let code = callbackURL.queryItems?.first(where: { $0.name == "code" })?.value // 手动请求你的HTTPS API端点完成后续流程 fetchTokenFromAPI(code: code) } // 会话会自动关闭,也可在此做额外清理 } authSession.present() - 修改你的授权流程,最终重定向到
app://redirect?code=xxx这类带参数的自定义URL。 - 在AppDelegate或SceneDelegate里处理这个URL的跳转(确保App能捕获到该Scheme):
// AppDelegate示例 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { if url.scheme == "yourapp" { return ASWebAuthenticationSession.resumeExternalUserAgentFlow(with: url) } return false }
解决办法二:配置关联域名(HTTPS通用链接)
如果不想用自定义Scheme,也可以用HTTPS的通用链接触发AS的回调:
- 在苹果开发者后台,给你的App ID开启「Associated Domains」权限。
- 在Xcode项目的「Signing & Capabilities」里添加「Associated Domains」,并添加
webcredentials:api.example.com(你的API域名)。 - 在你的API服务器根目录放置
apple-app-site-association文件,内容示例:{ "webcredentials": { "apps": ["你的TeamID.你的BundleID"] } } - 确保授权流程最终重定向到
https://api.example.com/redirect,此时系统会识别这是关联的通用链接,触发AS的回调,你就能在回调里处理并关闭会话。
额外说明
- 谷歌登录支持ASWebAuthenticationSession,因为这是苹果官方推荐的第三方认证组件,系统会标记为可信的认证会话,不会像WKWebView那样被谷歌拒绝,只要解决回调触发的问题,就能正常走通谷歌登录+你的授权流程。
- 两种方法里,自定义URL Scheme实现更简单快速,关联域名适合追求更原生HTTPS体验的场景。
内容的提问来源于stack exchange,提问作者Paweł Madej
相关产品推荐
相关产品推荐

