iOS 17.2中ASWebAuthenticationSession OAuth报错Code=1求助
解决ASWebAuthenticationSession LinkedIn OAuth回调失败(Code=1)问题
核心问题分析
你遇到的Code=1错误,本质是ASWebAuthenticationSession未捕获到匹配自定义Scheme的回调URL,导致会话无法自动终止,只能手动关闭浮窗,进而触发取消类错误。登录后跳转到自身Web页面的行为,说明后端在OAuth授权完成后,没有正确重定向到APP的自定义Scheme地址,反而跳转到了Web页面,浏览器自然不会把回调传递给APP。
分步解决思路
1. 确认APP的URL Scheme配置
先确保iOS项目已正确配置自定义Scheme:
- 打开
Info.plist,添加URL types数组 - 新增一项,在
URL Schemes中填入代码里使用的oauth-linkedin - 注意Scheme需和
ASWebAuthenticationSession初始化时的callbackURLScheme完全一致(大小写敏感)
2. 修正后端的OAuth回调逻辑
这是解决问题的关键!后端完成LinkedIn授权流程后,必须重定向到你的自定义Scheme URL,而非自身的Web登录页面:
- 后端收到LinkedIn返回的授权码后,完成token交换操作
- 随后返回重定向响应,目标地址格式示例:
oauth-linkedin://callback?access_token=xxx&user_id=xxx(可根据需求携带必要参数)
只有当Web页面跳转到该Scheme地址时,ASWebAuthenticationSession才会捕获回调,自动关闭浮窗,并将URL传递给你的闭包。
3. 检查LinkedIn开发者平台配置
在LinkedIn开发者后台的应用设置中:
- 确保
Authorized Redirect URLs填写的是后端的https://our.api.root/auth/linkedin地址(这是LinkedIn授权完成后回调后端的合法地址,无需修改) - 无需在此处填写APP的Scheme,LinkedIn只会回调你配置的后端域名,再由后端转跳至APP Scheme
4. 代码层面的细节优化
- 确认
ASWebAuthenticationSessionWrapper对session持有强引用,避免会话被提前释放(当前代码已通过类属性持有session,无问题) - 在回调闭包中,解析回调URL的参数并完成后续登录逻辑,示例:
if let callbackURL = callbackURL { let components = URLComponents(url: callbackURL, resolvingAgainstBaseURL: false) let accessToken = components?.queryItems?.first(where: { $0.name == "accessToken" })?.value // 此处可调用后端API验证token,或直接将token存入Keychain }
验证步骤
- 先测试后端重定向逻辑:直接访问
https://our.api.root/auth/linkedin,模拟授权成功后,确认是否跳转到oauth-linkedin://callback开头的地址 - 重新运行APP完成LinkedIn登录,此时Web浮窗应自动关闭,回调闭包能收到正确URL,不再出现Code=1错误
内容的提问来源于stack exchange,提问作者Lucy Janssens
相关产品推荐
相关产品推荐

