gpt4 book ai didi

xamarin.android - 为什么在 Azure MobileServiceClient LoginAsync() 之后 Navigation.PushAsync 崩溃?

转载 作者:行者123 更新时间:2023-12-04 02:14:42 24 4
gpt4 key购买 nike

编辑:可以在此处找到演示崩溃的示例项目:https://github.com/rringham/brokenazurexamforms - 您需要在以下位置设置自己的 Azure 应用服务 URL:

  • src/BrokenAzureForms/Droid/Services/User/DroidUserService.cs
  • src/BrokenAzureForms/iOS/Services/User/IosUserService.cs


  • 我看到 Xamarin Forms 的 Navigation.PushAsync()在通过 Azure 进行身份验证后尝试使用 Android 时崩溃 MobileServiceClient .此崩溃与 Android 无关 - 它不会在 iOS 上发生。

    这是设置 - 我有一个基本的 NavigationPage作为我的主要应用程序页面:
    MainPage = new NavigationPage(new LoginPage());

    在我的 LoginPage ,我使用 DependencyService 进行身份验证-在我的 Android 项目中执行身份验证的注入(inject)类:
    private async void OnMicrosoftAccountTapped(object sender, EventArgs args)
    {
    IUserService userService = DependencyService.Get<IUserService>();
    bool authenticated = await userService.LoginWithAzureAD();
    if (authenticated)
    {
    await Navigation.PushAsync(new HomePage(), false);
    }
    }

    在我的 IUserService 的 Android 实现中,我这样做(几乎正是 Azure/Xamarin Forms 教程显示的内容):
    public async Task<bool> LoginWithAzureAD()
    {
    try
    {
    _user = await _client.LoginAsync(Xamarin.Forms.Forms.Context, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory);
    }
    catch (Exception)
    {
    return false;
    }

    return true;
    }

    这就是事情分崩离析的地方。当 LoginWithAzureAD()完成后,控制在 OnMicrosoftAccountTapped() 中恢复;然后我们去调用 Navigation.PushAsync() ,然后繁荣 - 应用程序崩溃,几乎没有细节可以继续:

    MobileServiceClient / Navigation crash

    我能想到的只是 Azure MobileServiceClient正在用 Xamarin.Forms.Forms.Context 做一些非常时髦的事情在内部,因为如果我删除对 await userService.LoginWithAzureAD() 的调用,调用 Navigation.PushAsync()工作没有问题。 MobileServiceClient 中的某些内容已损坏,或者正在破坏 Xamarin Forms 中的某些内容。

    有人看到这样的东西吗?

    最佳答案

    当我这样做时,我使用以下内容:

    在 MainActivity.cs 中:

    // Initialize for Azure Mobile Apps
    Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init();

    // Initialize for Xamarin Forms
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

    // Initialize for Login Provider
    var lp = (DroidLoginProvider)DependencyService.Get<ILoginProvider>();
    lp.Initialize(this);

    然后,在我的 DroidLoginProvider 类中,我执行以下操作:
    Context _context;

    public void Initialize(Context context)
    {
    this._context = context;
    }

    public async Task LoginAsync(MobileServiceClient client)
    {
    await client.LoginAsync(this._context, MobileServiceAuthenticationProvider.whatever);
    }

    我从共享项目中的单例包装器调用 LoginAsync。重要的是它是单例,因为项目中应该只有一个 MobileServiceClient - 身份验证存储在 MobileServiceClient.CurrentUser 属性中,并且仅在当前客户端上设置。

    您可以在此处查看具有此逻辑的工作项目: https://github.com/adrianhall/30-days-of-zumo-v2/tree/master/file-upload

    关于xamarin.android - 为什么在 Azure MobileServiceClient LoginAsync() 之后 Navigation.PushAsync 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38417723/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com