Xamarin iOS应用调用IdentityModel.OidcClient的LoginAsync登录后无返回结果
问题原因
这个问题本质是LoginAsync方法返回的Task从未被标记为完成,导致await一直等待,核心诱因通常有三类:
- 自定义URL Scheme未正确注册到iOS系统,ASWebAuthenticationSession接收登录成功回调后无法将请求转发到你的App,回调闭包完全没有执行,
TaskCompletionSource始终未调用SetResult TaskCompletionSource未配置异步延续触发,引发同步上下文死锁- App全局的URL处理逻辑拦截了OIDC回调请求,导致回调无法传递到ASWebAuthenticationSession的处理逻辑
解决方案
1. 修正URL Scheme配置
你当前的重定向URI是wodtracker.app://callback,对应的Scheme是wodtracker.app,需要在iOS项目的Info.plist中正确注册:
- 打开iOS项目的
Info.plist,切换到「高级」选项卡,找到「URL类型」配置块 - 新增一条URL类型,标识符填你的App包名(如
com.yourcompany.wodtracker),URL Schemes填wodtracker.app,角色选择「Editor」 - 切换到Info.plist的源视图,确认存在以下配置:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>你的App包名</string> <key>CFBundleURLSchemes</key> <array> <string>wodtracker.app</string> </array> <key>CFBundleTypeRole</key> <string>Editor</string> </dict> </array>
注意:Scheme只需要填://之前的部分,不要把callback路径也填到URL Schemes中
2. 修正TaskCompletionSource初始化逻辑
默认的TaskCompletionSource会在SetResult调用的线程直接执行后续延续任务,很容易触发UI线程同步上下文死锁,修改InvokeAsync方法中的tcs初始化代码:
// 新增TaskCreationOptions.RunContinuationsAsynchronously参数 var tcs = new TaskCompletionSource<BrowserResult>(TaskCreationOptions.RunContinuationsAsynchronously);
3. 检查App全局URL处理逻辑
在iOS项目的AppDelegate.cs中重写OpenUrl方法,确保没有其他逻辑拦截OIDC回调:
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { // 若引入了其他第三方登录SDK,确保没有拦截scheme为wodtracker.app的请求 return base.OpenUrl(app, url, options); }
如果你的项目适配了iOS13及以上的Scene模式,还需要在SceneDelegate.cs中添加对应处理:
[Export("scene:openURLContexts:")] public void OpenUrlContexts(UIScene scene, NSSet<UIOpenUrlContext> urlContexts) { var callbackUrl = urlContexts.AnyObject?.Url; if (callbackUrl?.Scheme == "wodtracker.app") { // 不要拦截该请求,直接交由系统处理即可 } }
4. 额外校验项
- 确认Identity Server后台配置的重定向URI和你客户端配置的
RedirectUri = "wodtracker.app://callback"完全一致,大小写、路径、符号都不能有差异 - 在ASWebAuthenticationSession的回调闭包中添加断点或Debug日志,确认登录成功后回调逻辑确实被执行
内容的提问来源于stack exchange,提问作者Bartvandee
相关产品推荐
相关产品推荐

