2016-07-17 4 views
11

編集:クラッシュを実証サンプル・プロジェクトは、ここで見つけることができます:https://github.com/rringham/brokenazurexamforms - あなたがあなた自身のAzureアプリケーションサービスのURLを設定する必要があります。Azure MobileServiceClient LoginAsync()の後にNavigation.PushAsyncがクラッシュするのはなぜですか?

  • のsrc/BrokenAzureForms /ドロイド/サービス/ユーザー/ DroidUserService .csファイル
  • のsrc/BrokenAzureForms/iOS版/サービス/ユーザー/ IosUserService.cs

私はAzureのMobileServiceClientで認証後にそれを使用しようとするとき、私はAndroid上でXamarinフォームのNavigation.PushAsync()クラッシュを見ています。このクラッシュはAndroidに分離されています.iOSでは発生しません。ここで

がセットアップだ - 私は私のメインのアプリページなどの基本的なNavigationPageを持っている:

:私のLoginPageオン

MainPage = new NavigationPage(new LoginPage()); 

を、私は私のAndroidのプロジェクトで認証を実行するDependencyService -injectedクラスを使用して認証しますIUserServiceの私のAndroidの実装では

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); 
    } 
} 

、私は(かなりの正確アズール/ Xamarinはフォームどのようなチュートリアルが表示され)、この操作を行います。

public async Task<bool> LoginWithAzureAD() 
{ 
    try 
    { 
     _user = await _client.LoginAsync(Xamarin.Forms.Forms.Context, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory); 
    } 
    catch (Exception) 
    { 
     return false; 
    } 

    return true; 
} 

ここでは、物事が崩れる場所があります。 LoginWithAzureAD()が完了すると、制御はOnMicrosoftAccountTapped()に戻ります。もしので、私は考えることができるすべては、AzureのMobileServiceClientが内部Xamarin.Forms.Forms.Contextとかなりファンキーな何かをやっているということです

MobileServiceClient/Navigation crash

:アプリがクラッシュする、非常に小さなディテールを持つに行くために - 私たちは、その後Navigation.PushAsync()を呼び出すために行く、とブームは、 await userService.LoginWithAzureAD()へのコールを削除すると、Navigation.PushAsync()への呼び出しは問題なく動作します。 MobileServiceClientの何かが壊れているか、Xamarin Formsで何かが壊れています。

誰でもこのようなものを見ますか?

+0

こんにちは@Rob Ringham、あなたはこれがでソートを取得するために管理しました終わり?これはちょうど私が現時点で直面している問題であり、あなたが持っていたのと同じ呼び出しにそれを釘付けにしました。ありがとう。 –

答えて

4

私はこれを行うと、私は次のようにします。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); 
} 

私は共有プロジェクトのSingletonラッパーからLoginAsyncを呼び出します。プロジェクトにはMobileServiceClientが1つだけある必要があるため、これはシングルトンであることが重要です。認証はMobileServiceClient.CurrentUserプロパティに格納され、現在のクライアントでのみ設定されます。

現在地このロジックでの作業プロジェクトを見ることができます:https://github.com/adrianhall/30-days-of-zumo-v2/tree/master/file-upload

+0

ありがとうアドリアン - 私はこれを試しました。具体的には、MainActivityのAzure Mobile Appsの初期化コールを追加し、MainActivityのログインプロバイダにAndroidコンテキストをキャッシュします。私はGitリポジトリ内のコードを更新して、あなたが提案しているものと同等の機能を提供しますが、残念ながら私はまだクラッシュしています(シングルトンアプローチRE:MobileServiceClientにも従います)。あなたのサンプルプロジェクトに渦を吹き込み、それがうまくいくかどうかを見てみましょう! –

+0

最終的なコメント - 自分のプロジェクトでXamarin Forms v2.3.xを使用しています。それ以降のバージョンがありますが、Androidで有効なコンパイルを得るための適切な組み合わせを得ることに問題があります。 –

+0

ちょうど参考までに、私はSingletonsについて読んでいて、MSDNでこれを見つけました: "しかし、[Singleton]実装の主な欠点は、マルチスレッド環境では安全ではないということです。インスタンスのプロパティメソッドを同時に実行すると、さらにSingletonオブジェクトのインスタンスが1つ作成される可能性があります。 (https://msdn.microsoft.com/en-us/library/ff650316.aspxから取得) –

4

私は、ログイン問題が直交していると思うし、あなたがバックグラウンドスレッドからPushAsyncを呼んでいます。メインスレッドから依存関係サービスメソッドへの呼び出しを待ってから、PushAsyncを実行してください。ここで

はサンプルです:依存関係サービスで

+0

うーん、私は間違いなくバックグラウンドスレッドから 'PushAsync'を呼び出すことはありません - 私のLoginWithAzureADメソッドはボタンのClickedイベントハンドラのUIスレッドで呼び出されます。これは順番に(同じスレッド上で)' MobileServiceClient'の ' LoginAsync'メソッドを呼び出します。 –

+0

@RobRinghamそれはまだUIスレッドのように聞こえます。問題を特定するには、PushAsyncコードをUIに移動してログイン結果を待ってから、例外が返されるかどうかを確認してください。 –

+0

私は、私が(成功した)ログイン結果を待ってから、UIスレッド上で 'PushAsync'呼び出しが確実に呼び出されています。私は 'PushAsync'への呼び出しを、' Device.BeginInvokeOnMainThread() 'を介してUI実行ループのさらに下に置くことを試みましたが、役に立たなかった。 'MobileServiceClient'の仕組みは、Xamarin FormsがAndroid上で動作する方法と互換性がないようです。 Xamarin Forms自体のバグかもしれないと思う。 –

関連する問題