2013-05-24 2 views
10

मेरे पास निम्नलिखित लॉगिन है जो मैं फेसबुक लॉगिन के दौरान उपयोग करता हूं।फेसबुक एसडीके 3.5 क्लोज़ और क्लेरटोकन इन्फोर्मेशन ओपनएक्टिव सत्र के पूरा होने वाले हैंडलर को कॉल करता है विथ रीडमिशन

- (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI 
      withCompletionHandler:(void (^)())completionHandler 
{ 

    NSArray *permissions = [NSArray arrayWithObjects: 
         @"user_photos", 
         @"email", 
         nil]; 
    return [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     if (error != nil) { 
     ... 
     } else { 
      switch (state) { 
       case FBSessionStateOpen: 
       { 
        ... 
       } 
       case FBSessionStateClosed: 
       { 
        ... 
       } 
       case FBSessionStateClosedLoginFailed: 
       { 
        ... 
       } 
       default: 
        break; 
      } 
     } 
    }]; 
} 

उपरोक्त काम लॉगिन के लिए ठीक काम करता है। लेकिन, जब मैं निम्नलिखित कोड

[FBSession.activeSession closeAndClearTokenInformation]; 

यह फिर से openActiveSessionWithReadPermissions completionHandler कॉल का उपयोग कर लॉग आउट: अनुमतियों allowLoginUI :. यह मुझे समझ में नहीं आता है। मुझे नहीं लगता कि यह सही व्यवहार है। क्या किसी ने इस समस्या को देखा है? हम लॉग-आउट कैसे करते हैं? मैं आईओएस 6 पर एसडीके 3.5 का उपयोग कर रहा हूं।

+0

क्या 'state' मूल्य है पूरा होने हैंडलर है जब

FBSession एक छिपा संपत्ति है '[FBSession.activeSession CloseAndClearTokenInformation] पर कॉल किया गया; ' – Geek

+0

' स्थिति 'का मान' FBSessionStateOpen' है जब मैं' [FBSession.activeSession CloseAndClearTokenInformation] ' –

+0

पर कॉल करता हूं क्या आपने पहले' FBSession' की 'क्लोज़' विधि को कॉल करने का प्रयास किया था और फिर 'clearToken' विधि? यदि एक ही समस्या बनी रहती है तो अधिक कोड देखने की आवश्यकता है। शायद आपके प्रोग्रामिंग बग। – Geek

उत्तर

2

फेसबुक डेवलपर बग ट्रैकर पर this thread के अनुसार, यह व्यवहार "डिज़ाइन द्वारा" है।

वास्तव में, मैं सुझाव था कि इस विधि के लिए एक बेहतर नाम होगा: openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:

के रूप में है कि अधिक सटीक वर्णन क्या हो रहा है ("completionHandler" राज्य परिवर्तन पर कहा जाता है वास्तव में है)।

आप कई तरीकों से इस संभाल कर सकते हैं: Ben Cohen सुझाव है कि आप पूरा होने के ब्लॉक के भीतर completionHandlernil करने के लिए सेट कर सकते हैं या तो (रन-एक बार यह सुनिश्चित करने के), this answer एक FBSessionStateHandler रन एक बार हैंडलर बनाने का सुझाव, या आप पर स्विच कर सकते हैं राज्य परिवर्तन

आदर्श रूप में, जैसा कि हम विशिष्ट उद्देश्यों के लिए फेसबुक एसडीके पर भरोसा करते हैं (लॉग इन, लॉग आउट, अनुरोध करें, आदि), ये प्रतिनिधियों के माध्यम से प्रदान किए जाएंगे, लेकिन चूंकि एसडीके डेवलपर्स को स्पष्ट रूप से थोड़ा सा " ओह ब्लॉक !! ", आप उस बिंदु पर अपने राज्य परिवर्तन हैंडलर को परिभाषित करने के लिए बाएं हैं जहां आप अपना सत्र खोलते हैं।

+0

एडम वालनर द्वारा प्रस्तावित "हैक" के अलावा इस धागे में संभावित उत्तर के रूप में, समस्या का एक और समाधान पूरा करने के अंदर जांच करना है एफबी सत्र की प्रभावी स्थिति: अगर है, तो (राज्य == FBSessionStateOpen || राज्य == FBSessionStateOpenTokenExtended) { // बस में ... लॉग इन} else (त्रुटि) { // त्रुटि लॉग इन करते हुए ... } else { // बंद कर दिया } – viggio24

0

यह एक बहुत बुरा व्यवहार है जो मुझे लगता है।

@property (readwrite, copy) FBSessionStateHandler loginHandler; 

तो तुम यह नहीं के बराबर के लिए इस कोड द्वारा इस तरह ब्लॉक में सेट कर सकते हैं:

[FBSession openActiveSessionWithReadPermissions:FACEBOOK_PERMISSIONS 
              allowLoginUI:NO 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
              [[FBSession activeSession] performSelector:NSSelectorFromString(@"setLoginHandler:") withObject:nil]; 
#pragma clang diagnostic pop 
              // Your stuff... 
             }]; 
संबंधित मुद्दे