2012-11-03 16 views
5

को पुनरारंभ करने के बाद नया सत्र ऑब्जेक्ट प्राप्त करें, इसलिए मैं अपने विंडोज फोन 8 एप्लिकेशन को लाइव एपीआई में जोड़ने में सफल रहा हूं, मैं अपने हॉटमेल खाते से डेटा पढ़ने में भी सफल रहा हूं।विंडोज फोन लाइव एसडीके एपीआई - ऐप

मेरे पास आवश्यक क्लाइंट आईडी और लाइव एक्सेस टोकन तक पहुंच है।

लेकिन जब मैं अपना आवेदन छोड़ देता हूं और पुनरारंभ करता हूं, तो मैं सत्र और क्लाइंट ऑब्जेक्ट्स के सभी संदर्भ खो देता हूं और मुझे प्रक्रिया को फिर से शुरू करना होगा।

मैं उपयोगकर्ता को वेब मास्क के साथ परेशान नहीं करना चाहता हूं जिसमें उसे फिर से सहमत होना है कि वह हर बार आवेदन शुरू करने पर आवश्यक अनुमतियों के साथ मुझे प्रदान करता है। लेकिन मुझे इस चरण के बिना किसी सत्र ऑब्जेक्ट का संदर्भ प्राप्त करने का कोई तरीका नहीं मिला है।

लॉगिन मास्क केवल एप्लिकेशन इंस्टॉल करने के बाद पहली बार दिखाया गया है, उसके बाद, केवल ऊपर वर्णित स्क्रीन दिखाई गई है। लेकिन उपयोगकर्ता हर बार इसे स्वीकार करने के लिए अभी भी काफी परेशान है।

मैंने पहले ही सत्र ऑब्जेक्ट को क्रमबद्ध करने का प्रयास किया है, जो संभव नहीं है, क्योंकि कक्षा में मानक कन्स्ट्रक्टर नहीं है।

शायद लाइव एक्सेस टोकन का उपयोग करके एक नया सत्र बनाना संभव है, लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिला है।

कोई विचार? मैं गलत क्या कर रहा हूं, मुझे पता है कि उपयोगकर्ता को संकेत दिए बिना फिर से लॉगिन करने का कोई तरीका है। मैं हर विचार के लिए आभारी हूं।

कुछ कोड मैं का उपयोग करें:

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

मैं LiveAuthClient.InitializeAsync उपयोग करने के लिए कोशिश की है - आवेदन पुन: प्रारंभ करने की पृष्ठभूमि में प्रवेश करने की विधि है, लेकिन सत्र वस्तु खाली रहता है:

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

क्या किसी को पता है कि एप्लिकेशन को पुनरारंभ करने के बाद मैं नए सत्र तक कैसे पहुंच सकता हूं?

उत्तर

9

दो पूर्ण दिनों के बाद मैं गलती की खोज कर रहा था, मुझे अंत में पता चला कि मैं क्या कर रहा था: मुझे यह काम करने के लिए wl.offline_access स्कोप का उपयोग करना होगा!

मुझे किसी अन्य उपयोगकर्ता यहां उद्धृत करते हैं:

"अपने अनुप्रयोग से wl.offline_access गुंजाइश का उपयोग करता है लाइव: SignInButton नियंत्रण आप और लोड के लिए यह बचाता है यह स्वचालित रूप से बस सत्र वस्तु पर कब्जा करने के SessionChanged घटना का उपयोग करें।। इस तरह उपयोगकर्ता को केवल एक बार साइन इन करने की आवश्यकता होगी। " (देखें WP7 how to store LiveConnectSession during TombStoning?)

अब सब कुछ मजेदार है। विश्वास नहीं कर सकता कि यह समस्या थी। परीक्षण & काम कर रहा है। अच्छा!

+1

+1 इसके लिए, मुझे एक ही समस्या थी, धन्यवाद !! –

2

विंडोज लाइव + एज़ूर मोबाइल सर्विस ऐप पर काम करने के लिए संघर्ष कर रहा था, इसलिए मैंने सोचा कि अब मैं एक पूर्ण वर्किंग कोड नमूना पोस्ट करूंगा कि मुझे यह काम मिल गया है।

मुख्य भाग wl.offline_access गुंजाइश और InitializeAsync पर कॉल हैं।

नोट: यह नमूना विंडोज़ एज़ूर मोबाइल सेवाओं से भी जुड़ता है। यदि आप इसका उपयोग नहीं कर रहे हैं तो बस मोबाइल सेवा से संबंधित सामान को हटा दें।

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 
     { 
     } 
    } 
संबंधित मुद्दे