You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin iOS应用调用IdentityModel.OidcClient的LoginAsync登录后无返回结果

问题原因

这个问题本质是LoginAsync方法返回的Task从未被标记为完成,导致await一直等待,核心诱因通常有三类:

  1. 自定义URL Scheme未正确注册到iOS系统,ASWebAuthenticationSession接收登录成功回调后无法将请求转发到你的App,回调闭包完全没有执行,TaskCompletionSource始终未调用SetResult
  2. TaskCompletionSource未配置异步延续触发,引发同步上下文死锁
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:07