2016-05-26 3 views
0

Derzeit habe ich in meiner Anwendung zwei Navigationsstacks.Was ist die beste Lösung zum "Zurücksetzen" des Authentifizierungsstapels?

  1. Authentifizierung
  2. Haupt

Mein Authentifizierungsstapel sieht wie folgt aus:

  1. Splash Seite
  2. Wählen Sie erstellen oder Login-Seite
  3. Login Seite

Danach habe ich Aufruf:

CoreMethods.SwitchOutRootNavigation(NavigationContext.Main);

Das alles funktioniert gut.

Wenn ich Logout Anruf aus dem Hauptstapel wie folgt aus:

CoreMethods.SwitchOutRootNavigation(NavigationContext.Authentication);

ich zur Zeit auf „Login-Seite“ sein wird, aber ich will es wirklich die erste Seite „Splash-Seite“ sein.

Wenn sich die Navigationstapel merken, ist der Stapelverlauf für alle anderen Fälle perfekt.

Frage: Was ist die beste Lösung zum "Zurücksetzen" des Authentifizierungsstapels?

+0

Ist Ihre Splash-Seite eine XAML/C# -Seite oder Aktivität? Wenn seine Aktivität dann wird das nicht funktionieren. –

Antwort

1

Was ich normalerweise in meinen Apps mache, folgt.

Ich habe IAuthenticationService, die eine State Eigenschaft hat, die LoggedIn oder LoggedOut sein kann. Wenn sich der Sitzungszustand aufgrund einer expliziten Anmeldung geändert hat oder das Token zum Beispiel abgelaufen ist, setze ich State auf LoggedOut. Außerdem feuere ich eine Broadcast-Nachricht SessionStateChanged durch Messenger, so kann ich diese Nachricht rund um die App abfangen, und reagieren entsprechend in UI-Ebene, wie Bildschirmstatus ändern und so weiter.

Wenn Sie den Benutzer vollständig anmelden müssen, ich meine Show Login-Seite, wenn StateLoggedOut ist, was Ihr Fall ist, mache ich folgendes. Ich benutze Xamarin.Forms, aber der Ansatz wäre ähnlich, wenn Sie natives iOS oder Android verwenden. In meinem Haupt App Klasse (die, die von Xamarin.Forms.Application ableitet) erstelle ich einen Methodenaufruf UpdateMainPage, so etwas wie diese

private async void UpdateMainPage() 
    { 
     if (_authService.State == SessionState.LoggedIn) 
      MainPage = new NavigationPage(new RequestPage()); 
     else 
      MainPage = new NavigationPage(new SignInPage()); 
    } 

Was ich ändern passiert einfach die Root-Seite der Anwendung SignIn Strom oder Hauptfluss in Abhängigkeit von SessionState. Dann mache ich in meinem Konstruktor folgendes.

public FormsApp() 
    { 
     InitializeComponent(); 
     _authService = Mvx.Resolve<IAuthenticationService>(); 

     UpdateMainPage(); 

     var messenger = Mvx.Resolve<IMvxMessenger>(); 
     _sessionStateChangedToken = messenger.Subscribe<SessionStateChangedMessage>(HandleSessionStateChanged); 
    } 

Was ich tun muss, muss ich vorher Haupt-Seite einrichten, dann abonniere ich SessionStateChanged Veranstaltung, wo ich UpdateMainPage

private void HandleSessionStateChanged(SessionStateChangedMessage sessionStateChangedMessage) 
    { 
     UpdateMainPage(); 
    } 

ich für mehrere Anwendungen verwendet, um dieses Ansatzes auslösen, und es funktioniert Perfekt für mich. Hoffe, das hilft

+0

danke kyurkchyan, nicht ganz, was ich nach, obwohl, aber half mir, einen Weg (wir sind speziell mit FreshMvvm). – duyker

0

ich das gleiche Problem hatte vor kurzem, und das ist, was ich tue:

Navigation stapelt:

public enum NavigationStacks {Authentication, Main} 

In dem App.xaml.cs:

//Navigation stack when user is authenticated. 
var mainPage = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); 
var mainNavigation = new FreshNavigationContainer(MainPage, NavigationStacks.Main.ToString()); 

//Navigation stack for when user is not authenticated. 
var splashScreenPage= FreshPageModelResolver.ResolvePageModel<SplashScreenPageModel>(); 
var authenticationNavigation = new FreshNavigationContainer(splashScreenPage, NavigationStacks.Authentication.ToString()); 

Hier können Sie James Montemagno's Settings Plugin

if (Settings.IsUserLoggedIn) 
    { 
     MainPage = mainNavigation; 
    } 
    else 
    { 
     MainPage = authenticationNavigation; 
    } 
nutzen

Bisher haben Sie den obigen Code bereits gemacht. Aber die Idee für das Problem ist den Authentifizierungsstapel mit Ausnahme der Stammseite dh Splash-Screen zu löschen:

public static void PopToStackRoot(NavigationStacks navigationStack) 
{ 
    switch (navigationStack) 
    { 
     case NavigationStacks.Authentication: 
     { 
      var mainPage = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); 
      var mainNavigation = new FreshNavigationContainer(MainPage, NavigationStacks.Main.ToString()); 
      break; 
     } 
     case NavigationStacks.Main: 
     { 
      var splashScreenPage= FreshPageModelResolver.ResolvePageModel<SplashScreenPageModel>(); 
      var authenticationNavigation = new FreshNavigationContainer(splashScreenPage, NavigationStacks.Authentication.ToString()); 
      break; 
     } 
    } 
} 

Und schließlich ist hier der Code innerhalb Logout-Befehls:

private void Logout() 
{ 
    Settings.IsUserLoggedIn = false; 
    NavigationService.PopToStackRoot(NavigationStacks.Authentication); 
    CoreMethods.SwitchOutRootNavigation(NavigationStacks.Authentication.ToString()); 
} 

Ich weiß, es kann besser sein und effizientere Ansätze. Aber das hat für mich funktioniert.

Verwandte Themen