2012-11-03 10 views
5

così sono riuscito a collegare l'applicazione Windows Phone 8 all'API Live, sono anche riuscito a leggere i dati dal mio account hotmail.API SDK per Windows Phone Live - ottieni un nuovo oggetto sessione dopo aver riavviato l'app

Ho accesso all'ID client necessario e al token di accesso in tempo reale.

Ma quando si chiude e si riavvia la mia applicazione, perdo tutti i riferimenti alla sessione e agli oggetti client e devo avviare di nuovo il processo.

Non voglio annoiare l'utente con la maschera Web in cui deve essere d'accordo di nuovo che mi fornisce le autorizzazioni necessarie ogni volta che avvia l'applicazione. Ma non ho trovato un modo per ottenere un riferimento a un oggetto di sessione senza questo passo.

La maschera di accesso viene visualizzata solo la prima volta dopo aver installato l'applicazione, dopo di che viene visualizzata solo la schermata menzionata sopra. Ma è ancora abbastanza fastidioso per l'utente accettarlo ogni volta.

Ho già provato a serializzare l'oggetto sessione, cosa non possibile, perché la classe non ha un costruttore standard.

Forse è possibile creare una nuova sessione utilizzando il token di accesso in diretta, ma non ho trovato un modo per farlo.

Qualche idea? Cosa sto facendo male, so che c'è un modo per accedere nuovamente senza chiedere all'utente. Sono grato per ogni idea.

Alcuni codice che utilizzo:

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

Ho provato ad utilizzare il LiveAuthClient.InitializeAsync - metodo per effettuare il login in background dopo il riavvio dell'applicazione, ma l'oggetto di sessione rimane vuoto:

// 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 
    } 

Qualcuno ha un'idea di come potrei accedere a una nuova sessione dopo aver riavviato l'applicazione?

risposta

9

Dopo due giorni interi alla ricerca dell'errore che stavo facendo, ho finalmente scoperto cosa stavo facendo male: devo usare lo scope wl.offline_access per farlo funzionare!

Permettetemi di citare un altro utente qui:

"Se la tua applicazione utilizza portata wl.offline_access rispetto al live: SignInButton controllo salva per voi e lo carica automaticamente Basta utilizzare l'evento SessionChanged per catturare l'oggetto della sessione.. In questo modo l'utente dovrà accedere solo una volta. " (vedi WP7 how to store LiveConnectSession during TombStoning?)

Ora tutto è di nuovo divertente. Non posso credere che questo era il problema. Testato & funzionante. Bello!

+1

+1 per quello, stavo avendo lo stesso problema, grazie !! –

2

Stato faticato a farlo funzionare su un'app di Windows Live + Azure Mobile Service, quindi ho pensato di pubblicare un codice completo di esempio qui ora che ho funzionato.

Le parti chiave sono l'ambito wl.offline_access e la chiamata a InitializeAsync.

Nota: questo esempio si collega anche ai servizi mobili di Windows Azure. Basta rimuovere la roba relativa a MobileService se non la stai usando.

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 
     { 
     } 
    } 
Problemi correlati