2012-11-03 12 views
5

, więc udało mi się połączyć moją aplikację Windows Phone 8 z Live API, udało mi się również odczytać dane z mojego konta hotmail.Windows Phone Live SDK API - pobierz nowy obiekt sesji po ponownym uruchomieniu aplikacji

Mam dostęp do potrzebnego identyfikatora klienta i tokenu dostępu na żywo.

Ale po zamknięciu i ponownym uruchomieniu aplikacji tracę wszystkie odwołania do sesji i obiektów klienckich i muszę rozpocząć proces od nowa.

Nie chcę denerwować użytkownika za pomocą maski internetowej, w której musi ponownie się zgodzić, że zapewnia mi wymagane uprawnienia za każdym razem, gdy uruchamia aplikację. Ale nie znalazłem również sposobu na uzyskanie odniesienia do obiektu sesji bez tego kroku.

Maska logowania jest wyświetlana tylko po raz pierwszy po zainstalowaniu aplikacji, a następnie wyświetlany jest tylko powyższy ekran. Ale nadal jest dość denerwujące, aby użytkownik zaakceptował to za każdym razem.

Próbowałem już serializacji obiektu sesji, co nie jest możliwe, ponieważ klasa nie ma standardowego konstruktora.

Może uda się utworzyć nową sesję za pomocą tokenu dostępu na żywo, ale nie znalazłem sposobu, aby to zrobić.

Wszelkie pomysły? Co robię źle, wiem, że jest sposób na ponowne zalogowanie bez pytania użytkownika. Jestem wdzięczny za każdy pomysł.

Niektóre kod używam:

/// <summary> 
    /// This method is responsible for authenticating an user asyncronesly to Windows Live. 
    /// </summary> 
    public void InitAuth() 
    { 
     this.authClient.LoginCompleted += 
      new EventHandler<LoginCompletedEventArgs>(this.AuthClientLoginCompleted); 

     this.authClient.LoginAsync(someScopes); 
    } 

    /// <summary> 
    /// This method is called when the Login process has been completed (successfully or with error). 
    /// </summary> 
    private void AuthClientLoginCompleted(object sender, LoginCompletedEventArgs e) 
    { 
     if (e.Status == LiveConnectSessionStatus.Connected) 
     { 
      LiveConnector.ConnectSession = e.Session; // where do I save this session for reuse? 
      this.connectClient = new LiveConnectClient(LiveConnector.ConnectSession); 

      // can I use this access token to create a new session later? 
      LiveConnector.LiveAccessToken = LiveConnector.ConnectSession.AccessToken; 

      Debug.WriteLine("Logged in."); 
     } 
     else if (e.Error != null) 
     { 
      Debug.WriteLine("Error signing in: " + e.Error.ToString()); 
     } 
    } 

Próbowałem użyć LiveAuthClient.InitializeAsync - metoda, aby zalogować się w tle po ponownym uruchomieniu aplikacji, ale obiekt sesja pozostaje pusta:

// this is called after application is restarted 
private void ReLogin() 
{ 
    LiveAuthClient client = new LiveAuthClient(LiveConnector.ClientID); 
      client.InitializeCompleted += OnInitializeCompleted; 
      client.InitializeAsync(someScopes); 
} 


private void OnInitializeCompleted(object sender, LoginCompletedEventArgs e) 
    { 
     Debug.WriteLine("***************** Inititalisation completed **********"); 
     Debug.WriteLine(e.Status); // is undefined 
     Debug.WriteLine(e.Session); // is empty 
    } 

Czy ktoś ma pomysł, jak uzyskać dostęp do nowej sesji po ponownym uruchomieniu aplikacji?

Odpowiedz

9

Po dwóch pełnych dniach szukania błędu, który popełniłem, w końcu dowiedziałem się, co robiłem źle: muszę użyć zakresu wl.offline_access, aby to zadziałało!

Pozwolę sobie zacytować innego użytkownika tutaj:

„Jeśli aplikacja korzysta z zakresu wl.offline_access niż na żywo: SignInButton kontrola zapisuje go dla Ciebie i ładuje automatycznie Wystarczy użyć zdarzenia SessionChanged uchwycić obiekt sesji.. W ten sposób użytkownik będzie musiał zalogować się tylko raz. " (patrz WP7 how to store LiveConnectSession during TombStoning?)

Teraz wszystko znowu jest zabawne. Nie mogę uwierzyć, że to był problem. Przetestowano & w pracy. Miły!

+1

+1 za to, miałem ten sam problem, dzięki! –

2

Zmagałem się, aby pracować nad aplikacją Windows Live + Azure Mobile Service, więc pomyślałem, że opublikuję tutaj pełną działającą próbkę kodu, teraz, gdy mam ją uruchomioną.

Kluczowymi częściami są zasięg wl.offline_access i wywołanie InitializeAsync.

Uwaga: ten przykład łączy się również z usługami mobilnymi Windows Azure. Po prostu usuń rzeczy związane z MobileService, jeśli tego nie używasz.

private static LiveConnectSession _session; 
    private static readonly string[] scopes = new[] {"wl.signin", "wl.offline_access", "wl.basic"}; 

    private async System.Threading.Tasks.Task Authenticate() 
    { 
     try 
     { 
      var liveIdClient = new LiveAuthClient("YOUR_CLIENT_ID"); 
      var initResult = await liveIdClient.InitializeAsync(scopes); 

      _session = initResult.Session; 


      if (null != _session) 
      { 
       await MobileService.LoginWithMicrosoftAccountAsync(_session.AuthenticationToken); 
      } 

      if (null == _session) 
      { 
       LiveLoginResult result = await liveIdClient.LoginAsync(scopes); 

       if (result.Status == LiveConnectSessionStatus.Connected) 
       { 
        _session = result.Session; 
        await MobileService.LoginWithMicrosoftAccountAsync(result.Session.AuthenticationToken); 

       } 
       else 
       { 
        _session = null; 
        MessageBox.Show("Unable to authenticate with Windows Live.", "Login failed :(", MessageBoxButton.OK); 
       } 
      } 
     } 
     finally 
     { 
     } 
    } 
Powiązane problemy