2012-03-19 19 views
6

अद्यतन: मुझे एहसास हुआ है कि नीचे दी गई समस्या केवल तभी होती है जब उपयोगकर्ता ने पहले से ही मेरे ऐप पर फेसबुक पहुंच दी हो और फिर मेरे ऐप को दोबारा इंस्टॉल कर दिया हो। पहली बार उपयोगकर्ता मेरे ऐप में फेसबुक बटन का चयन करता है, यह प्रमाणीकरण प्राप्त करने के लिए फेसबुक ऐप पर जाता है, लेकिन चूंकि प्रमाणीकरण स्थिति अभी भी फेसबुक ऐप में सहेजी गई है, इसलिए यह उपयोगकर्ता के स्पष्टीकरण के बिना तुरंत मेरे ऐप पर लौट आती है, और postToFacebookWall विधि विफल रहता है।फेसबुक ऐप के साथ फेसबुक एसडीके आईओएस लॉगिन

अद्यतन 2: मैंने यहां मिले समाधान को कार्यान्वित करना समाप्त कर दिया: How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? और फेसबुक ऐप से परहेज किया। सफारी बेहतर है क्योंकि कम से कम उपयोगकर्ता को यह संदेश मिलता है कि वे लॉग इन करेंगे। हालांकि फ़ीड डायलॉग अभी भी पहले की तरह पहली बार विफल रहता है।


मुझे एक आम समस्या होनी चाहिए, लेकिन मैं अभी तक समाधान नहीं ढूंढ पा रहा हूं। ध्यान दें कि मेरा ऐप आईओएस 5 और उससे ऊपर तक सीमित है।

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

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

मैं काफी यहाँ दिए गए निर्देशों का पालन किया: http://developers.facebook.com/docs/mobile/ios/build/#implementsso

और यहाँ: http://developers.facebook.com/docs/reference/dialogs/feed/

AppDelegate में मैं निम्नलिखित कोड है:

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

इस बीच फर्क सिर्फ इतना है और नमूना कोड यह है कि मैंने एक एनएसएनोटिफिकेशन जोड़ा जो मेरे व्यू कंट्रोलर द्वारा उठाया गया है, जहां मेरे पास निम्न कोड है:

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

क्या कोई मेरी समस्या को ठीक करने का तरीका जानता है? (साथ ही, यदि यह स्पष्ट नहीं है, तो YOUR_APP_ID को मेरे कोड में मेरे ऐप आईडी के साथ बदल दिया गया है)।

उत्तर

3

यह एक आउट-केस की तरह लगता है कि यह केवल तब होता है जब यह ऐप इंस्टॉल किया गया था, ऑट किया गया था, फिर अनइंस्टॉल किया गया था, फिर पुनर्स्थापित किया गया था।

यह विशेष बात होने पर आपको "क्लासिक वेब व्यू प्रमाणीकरण" पर वापस आना चाहिए।

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

फिर फिर, आप सफारी ऑथ का भी उपयोग कर सकते हैं मुझे लगता है।

+0

है जैसे कि यह व्यवहार्य हो सकता है लगता है कि। मै उसे करने की एक कोशिश तो करूंगा। – Darren

संबंधित मुद्दे