2012-08-09 11 views
11

मैं आईओएस के लिए नए फेसबुक एसडीके को एकीकृत करने की कोशिश कर रहा हूं और कुछ अवधारणाओं को समझने में समस्या थी।लगातार लॉन्च में एफबीएसशन खोलना (एसडीके 3.0 के लिए एफबी एसडीके)

  1. मैं [FBSession sessionOpenWithPermissions:...] प्रमाणन संवाद का उपयोग करके प्रमाणित आता है और मैं एप्लिकेशन को वापस। एथ सफल

  2. फिर ऐप बंद करें, फिर से लॉन्च करें। [[FBSession activeSession] accessToken] पहले से सहेजे गए टोकन को सफलतापूर्वक लौटाता है।

  3. हालांकि, उसी समय, [[FBSession activeSession] isOpen]NO देता है। (इसका मतलब है कि सत्र उपयोग के लिए तैयार नहीं है।)

  4. इसके अलावा, [[FBSession activeSession] state] इस समय FBSessionStateCreatedTokenLoaded है। ट्यूटोरियल here सक्रिय सत्र को सत्यापित करने के लिए isOpen कॉल का उपयोग करता है और टोकन के साथ खोला जाता है।

तो हम उपयोगकर्ता को ऑथ संवाद में रीडायरेक्ट किए बिना टोकन-लोड किए गए सत्र को खोलने के लिए क्या कहते हैं?

संकेत:

FBSessionState enum में, FBSessionStateOpen के लिए यह कहते हैं:

खुला सत्र स्थिति दर्शाते हैं कि उपयोगकर्ता में लॉग इन किया है या संचय टोकन उपलब्ध है।

हालांकि FBSessionStateCreatedTokenLoaded रूप में वर्णित है:

यह दर्शाता है कि एक कैश्ड टोकन लोड किया गया था दो आरंभिक सत्र को राज्यों में से एक; जब इस स्थिति में एक सत्र होता है, तो ओपन के लिए कॉल के बाद ओपन या एप-स्विचिंग

क्या आप कृपया इन सत्र संक्रमणों को समझने में मेरी सहायता कर सकते हैं?

+0

आप हर ऐप लॉंन्च अपने सत्र को फिर से खोलने के लिए है में कहते हैं। –

+2

यह कैसे करें? मुझे वह हिस्सा याद आ रहा है। '[FBSession सत्र ओपनविथप्रमिशन: ...]' हर बार ऑथ संवाद दिखाए बिना चाल करें? –

+2

यह: '+ (BOOL) openActiveSessionWithAllowLoginUI: (BOOL) अनुमति LoginUI' और Google FBSession भी - शाब्दिक रूप से पहली हिट। –

उत्तर

31

मैं एक फेसबुक उपयोगिता कक्षा भी शामिल कर रहा हूं जो मैंने लिखा है जो लॉगिन स्थिति को समझने में मदद करता है, क्योंकि मैं अपने स्वयं के सेटिंग्स UI में उपयोगकर्ता को "लॉग इन"/"लॉग इन नहीं हुआ" संदेश का खुलासा करता हूं, इसके अलावा वास्तविक 'FBLoginView' घटक जब उपयोगकर्ता को प्राधिकरण स्थिति टॉगल करने की अनुमति देने का समय आता है।

नीचे दिया गया कोड भी इस gist के माध्यम से उपलब्ध है।

मैंने अपने स्विच स्टेटमेंट में सभी FBSessionState प्रकारों का सही ढंग से व्याख्या नहीं किया हो सकता है, लेकिन इस प्रकार, मैंने परीक्षण किए गए मामलों में मुझे अच्छी तरह से सेवा दी है (मैंने इसे एक साथ रखा है)।

ध्यान देने योग्य महत्वपूर्ण बात यह है कि दूसरों ने संकेत दिया है कि कभी-कभी आपके पास एक कैश प्रमाणीकरण टोकन होता है जिसे आप तुरंत उपयोग नहीं कर सकते हैं, लेकिन यदि आप फेसबुक open पर कॉल करते हैं, तो आप इसे प्राप्त कर सकते हैं पुन: प्रयोज्य (ताज़ा)। यह ओपन कॉल दृश्यों के पीछे काम करता है, बिना किसी UI/jarring OAuth विंडो/ऐप स्विचिंग (यदि आपके पास कैश किए गए टोकन हैं) ट्रिगर किए बिना।

विधि isLoggedInAfterOpenAttempt में मेरी टिप्पणियां देखें। ध्यान दें कि मैं FBSessionStateCreatedTokenLoaded होने के लिए राज्य की जांच कैसे करता हूं और केवल तभी,

-openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) पर कॉल करें।

इस वर्ग के बारे में अन्य छोटी-मोटी बातें:

  • मैं, उपयोगकर्ता द्वारा प्रवेश प्रकार प्रोटोकॉल FBGraphUser के अनुरूप की कैश करने के लिए यहाँ एक संपत्ति है। हालांकि, यहां प्रदर्शित किसी भी लॉगिन विधियों में इसका उपयोग नहीं किया जाता है।
  • आईओएस नमूना कोड के लिए फेसबुक एसडीके 3.0 सुझाव देता है कि यदि आप एक छोटे से ऐप से ज्यादा कुछ लेते हैं, तो इस तरह के संचालन को संभालने और प्रबंधित करने के लिए अपनी खुद की कक्षा का निर्माण करना है। नीचे मेरा यह वर्ग मेरे ऐप के लिए उस विचार की शुरुआत है।
  • आप यह काम करने के लिए एनएसएलओजी के साथ अपने 'log4Info' और 'log4Debug' मैक्रोज़ को प्रतिस्थापित कर सकते हैं।
 
#import "UWFacebookService.h" 

@implementation UWFacebookService 

// Static 
static const int ddLogLevel = LOG_LEVEL_DEBUG; 

// Strong 
@synthesize facebookGraphUser = _facebookGraphUser; 


#pragma mark - Inquiries 

- (BOOL)isSessionStateEffectivelyLoggedIn:(FBSessionState)state { 
    BOOL effectivelyLoggedIn; 

    switch (state) { 
     case FBSessionStateOpen: 
      log4Info(@"Facebook session state: FBSessionStateOpen"); 
      effectivelyLoggedIn = YES; 
      break; 
     case FBSessionStateCreatedTokenLoaded: 
      log4Info(@"Facebook session state: FBSessionStateCreatedTokenLoaded"); 
      effectivelyLoggedIn = YES; 
      break; 
     case FBSessionStateOpenTokenExtended: 
      log4Info(@"Facebook session state: FBSessionStateOpenTokenExtended"); 
      effectivelyLoggedIn = YES; 
      break; 
     default: 
      log4Info(@"Facebook session state: not of one of the open or openable types."); 
      effectivelyLoggedIn = NO; 
      break; 
    } 

    return effectivelyLoggedIn; 
} 

/** 
* Determines if the Facebook session has an authorized state. It might still need to be opened if it is a cached 
* token, but the purpose of this call is to determine if the user is authorized at least that they will not be 
* explicitly asked anything. 
*/ 
- (BOOL)isLoggedIn { 
    FBSession *activeSession = [FBSession activeSession]; 
    FBSessionState state = activeSession.state; 
    BOOL isLoggedIn = activeSession && [self isSessionStateEffectivelyLoggedIn:state]; 

    log4Info(@"Facebook active session state: %d; logged in conclusion: %@", state, (isLoggedIn ? @"YES" : @"NO")); 

    return isLoggedIn; 
} 


/** 
* Attempts to silently open the Facebook session if we have a valid token loaded (that perhaps needs a behind the scenes refresh). 
* After that attempt, we defer to the basic concept of the session being in one of the valid authorized states. 
*/ 
- (BOOL)isLoggedInAfterOpenAttempt { 
    log4Debug(@"FBSession.activeSession: %@", FBSession.activeSession); 

    // If we don't have a cached token, a call to open here would cause UX for login to 
    // occur; we don't want that to happen unless the user clicks the login button over in Settings, and so 
    // we check here to make sure we have a token before calling open 
    if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) { 
     log4Info(@"We have a cached token, so we're going to re-establish the login for the user."); 
     // Even though we had a cached token, we need to login to make the session usable: 
     [FBSession.activeSession openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
      log4Info(@"Finished opening login session, with state: %d", status); 
     }]; 
    } 
    else { 
     log4Info(@"Active session wasn't in state 'FBSessionStateCreatedTokenLoaded'. It has state: %d", FBSession.activeSession.state); 
    } 

    return [self isLoggedIn]; 
} 

@end 

2

कोड नमूना निम्न प्रयास करें:

///////////////////////////////// 

-(void)CallBackOpenURLFromDelegate:(NSURL *)url 
{ 
    [FBSession.activeSession handleOpenURL:url]; 
} 

-(id)init 
{ 
    self = [super init]; 
    FBSessionTokenCachingStrategy* pToken = [[[FBSessionTokenCachingStrategy alloc]initWithUserDefaultTokenInformationKeyName:@"STokenInfoX"]autorelease]; 
    FBSession.activeSession = [[FBSession alloc] initWithAppID:FACEBOOK_AppId 
                permissions:[NSArray arrayWithObject:@"status_update"] 
               urlSchemeSuffix:@"" 
              tokenCacheStrategy: pToken]; 
    return self; 
} 


-(void)dealloc 
{ 
    [FBSession.activeSession close]; 
    [super dealloc]; 
} 

-(void) UploadImpl:(NSString*)strImagePath 
{ 
    FBRequest *photoUploadRequest = [FBRequest requestForUploadPhoto: [UIImage imageWithContentsOfFile:strImagePath ]]; 
    [photoUploadRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
    { 
     NSLog(@"%@",[error description]); 
     //self.delegate 
    }]; 
} 
5

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

ऐसा करने से यह मौजूदा टोकन का पुन: उपयोग कर सकता है (और यह आपका मामला है), और इस मामले में यूएक्स (उपयोगकर्ता अनुभव - यानी, ऐप स्विचिंग या फेसबुक लॉगिन पॉपअप) ट्रिगर नहीं किया जाएगा।

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

इस कारण को डिज़ाइन किया गया है क्योंकि टोकन उपलब्ध है लेकिन समाप्त हो गया है, तो फेसबुक लाइब्रेरी आपको बताएगी - "हे टोकन की समयसीमा समाप्त हो गई है, जब तक कि आपको कोई नया टोकन न मिले, तब तक स्वयं को लॉग आउट करें।"

उम्मीद है कि मदद करता है।

1

यह एक पुरानी धागा हो सकता है, लेकिन अब एक दिन तुम सब करने की है के भीतर (शून्य) applicationDidBecomeActive से अपने FBSession वस्तु में handleDidBecomeActive कहते हैं: (UIApplication *) अपने अनुप्रयोग प्रतिनिधि में आवेदन।

उदाहरण के लिए:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[[MLSocialNetworksManager sharedManager] MLFacebook] handleDidBecomeActive]; 
} 

कहाँ MLFacebook मेरी FBSession वस्तु है।

+0

आपने एमएलफ़ेसबुक नामक एक और कक्षा क्यों बनाई? 'हैंडलडिडबैकएक्टिव' 'एफबीएसशन 'की विधि है? –

+0

यह मेरे फेसबुक तर्क encapsulating है। किसी भी तरह से यह आवश्यक नहीं है। –

0

बस अपने init दृश्य नियंत्रक

self.FBloginView = [[FBLoginView alloc] init]; 
संबंधित मुद्दे