2016-07-17 90 views
11

Edit: progetto di esempio che illustra incidente può essere trovato qui: https://github.com/rringham/brokenazurexamforms - è necessario impostare il proprio Azure App Servizio URL:Perché Navigation.PushAsync si arresta in modo anomalo dopo Azure MobileServiceClient LoginAsync()?

  • src/BrokenAzureForms/Droid/Servizi/utente/DroidUserService cs
  • src/BrokenAzureForms/iOS/Servizi/utente/IosUserService.cs

Sto riscontrando l'arresto di Xamarin Forms Navigation.PushAsync() su Android quando tento di usarlo dopo l' di autenticazione con Azure MobileServiceClient. Questo crash è isolato su Android - non succede su iOS.

Ecco la messa a punto - ho una base NavigationPage come la mia pagina applicazione principale:

MainPage = new NavigationPage(new LoginPage()); 

Sul mio LoginPage, ho l'autenticazione utilizzando una classe -injected DependencyService che esegue l'autenticazione nel mio progetto 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); 
    } 
} 

Nel mio Android attuazione IUserService, faccio questo (più o meno esattamente quali forme Azure/Xamarin tutorial mostrano):

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

    return true; 
} 

Ecco dove le cose vanno a pezzi. Al termine di LoginWithAzureAD(), il controllo riprende in OnMicrosoftAccountTapped(); poi andiamo a chiamare Navigation.PushAsync(), e del braccio - l'applicazione si blocca, con dettagli molto poco per andare avanti:

MobileServiceClient/Navigation crash

Tutto quello che posso pensare è che Azure MobileServiceClient sta facendo qualcosa piuttosto funky con Xamarin.Forms.Forms.Context internamente, perché se Rimuovere la chiamata a await userService.LoginWithAzureAD(), la chiamata a Navigation.PushAsync() funziona senza problemi. Qualcosa in MobileServiceClient è rotto o sta rompendo qualcosa in Xamarin Forms.

Qualcuno vede qualcosa di simile?

+0

Ciao @ Rob Ringham, siete riusciti a ottenere questo risolto in fine? Questo è esattamente il problema che sto affrontando in questo momento e l'ho inchiodato alla stessa chiamata che avevi. Grazie. –

risposta

4

Quando faccio questo, io uso il seguente:

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

Poi, nella mia classe DroidLoginProvider, faccio la seguente:

Context _context; 

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

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

I chiama LoginAsync da un wrapper Singleton nel mio progetto condiviso. È importante che sia un Singleton perché in un progetto dovrebbe esserci un solo MobileServiceClient: l'autenticazione è memorizzata nella proprietà MobileServiceClient.CurrentUser e viene impostata solo sul client corrente.

si può vedere un progetto di lavoro con questa logica qui: https://github.com/adrianhall/30-days-of-zumo-v2/tree/master/file-upload

+0

Grazie Adrian: ho provato, aggiungendo in particolare la chiamata di inizializzazione per Azure Mobile Apps in MainActivity, nonché memorizzando nella cache il contesto Android sul mio provider di accesso da MainActivity; Ho aggiornato il codice nel mio repository Git in modo che sia effettivamente equivalente a quello che stai suggerendo, ma sfortunatamente vedo ancora il crash (inoltre seguo l'approccio di Singleton RE: MobileServiceClient). Darò un giro al tuo progetto di esempio e vedrò se funziona! –

+0

Commento finale su questo - sto usando Xamarin Forms v2.3.x nei miei progetti. C'è una versione successiva, ma ho problemi con ottenere la giusta combinazione per ottenere una compilazione valida su Android. –

+0

Proprio come una FYI, ho appena letto su Singletons e l'ho trovato su MSDN: "Il principale svantaggio dell'implementazione [Singleton], tuttavia, è che non è sicuro per gli ambienti con multithreading. esecuzione immettere contemporaneamente il metodo della proprietà Istanza, più l'istanza dell'oggetto Singleton può essere creata. " (Tratto da https://msdn.microsoft.com/en-us/library/ff650316.aspx) –

4

Credo che il problema di accesso è ortogonale, e si sta chiamando PushAsync da un thread in background. Dovresti semplicemente attendere la chiamata al tuo metodo di servizio delle dipendenze dalla tua discussione principale, e quindi fare PushAsync lì.

Ecco un esempio: metodo di

+0

Hmm, non definisco 'PushAsync' da un thread in background - il mio metodo LoginWithAzureAD viene chiamato sul thread UI in un pulsante Gestore eventi cliccato, che a sua volta (e sulla stessa thread) chiama' MobileServiceClient''s ' Metodo LoginAsync'. –

+0

@RobRingham Sì, sembra che sarebbe ancora il thread dell'interfaccia utente. Per isolare il problema, prova a spostare il codice PushAsync sull'interfaccia utente e attendi il risultato dell'account di accesso e verifica se la riproduzione delle eccezioni. –

+0

Non sono sicuro di seguirlo - la chiamata 'PushAsync' viene chiamata sul thread dell'interfaccia utente dopo che ho atteso il risultato del login (che ritorna con successo). Ho anche provato a mettere la chiamata a 'PushAsync' più in basso nel ciclo di esecuzione dell'interfaccia utente tramite' Device.BeginInvokeOnMainThread() ', senza alcun risultato. Qualcosa nel modo in cui funziona "MobileServiceClient' sembra essere incompatibile con il modo in cui Xamarin Forms funziona su Android; Sospetto che possa trattarsi di un bug all'interno di Xamarin Forms stesso. –

Problemi correlati