2011-08-17 5 views
8

पर फेसबुक के एफबीसी कनेक्ट कनेक्ट एसडीके मुद्दे मैं अपने आवेदन के माध्यम से किसी उपयोगकर्ता की प्रोफ़ाइल में पोस्ट प्रकाशित करने के लिए एफबीसी कनेक्ट कनेक्ट एसडीके का उपयोग कर रहा हूं। मुझे इसके साथ कई समस्याएं आ रही हैं:आईओएस

जब प्रासंगिक कोड डिवाइस पर पहली बार चलता है, तो उपयोगकर्ता को फेसबुक ऐप/वेबसाइट पर वांछित, फिर से निर्देशित किया जाता है, जो उसे अधिकृत करने के लिए कहता है यह। यदि उपयोगकर्ता इसे अधिकृत करता है, तो यह उस एप्लिकेशन पर वापस लौटाता है, जो "फेसबुक से कनेक्ट करें" दृश्य नियंत्रक को पॉप करता है जो उपयोगकर्ता को लॉग इन करने के लिए कहता है। यह अजीब है, क्योंकि उपयोगकर्ता पहले ही लॉग इन है, अन्यथा वह ऐप को कैसे अधिकृत कर सकता है ? लेकिन मुझे लगता है कि यह ठीक हो सकता है, के रूप में वह अभी तक एप्लिकेशन के माध्यम से लॉग इन नहीं किया था। लॉग इन करने के बाद, यह कुछ भी नहीं करता है। ऐप को अधिकृत करने के बाद कोड को चलाने के लिए दूसरी बार, उपयोगकर्ता को पोस्टिंग संवाद मिलता है।

यदि उपयोगकर्ता ने ऐप को अधिकृत नहीं किया है, तो जब यह प्राधिकरण संवाद के बाद मेरे ऐप पर वापस आता है, तो यह उपयोगकर्ता से लॉगिन करने के लिए कहता है (जैसे वह अधिकृत है), और लॉग इन करने के बाद कुछ भी नहीं करता है। केवल दूसरी बार कोड भाग गया हो जाता है, प्राधिकरण संवाद खोलता है, optinos साथ & "App छोड़ें", के बजाय "अधिकृत करें" & "अधिकृत नहीं है"/"अनुमति दें" & "की अनुमति न दें" "अधिकृत करें"।

इसके अतिरिक्त, यदि उपयोगकर्ता ने फेसबुक पर अपने खाते की सेटिंग्स के माध्यम से अपना प्राधिकरण हटा दिया है, तो उसे सिर्फ इसे फिर से अधिकृत करने के लिए कहने के बजाय, एक फेसबुक संवाद पॉप (पोस्ट/प्राधिकरण संवाद के बजाय) कहता है: "एन त्रुटि आई। कृपया बाद में पुनः प्रयास करें। " बाद में कोशिश करने में मदद नहीं करता है। यह हमेशा पॉप होगा, भले ही आप ऐप को पुनरारंभ करें। इसे दूर करने का एकमात्र तरीका ऐप को दोबारा स्थापित करना है, जिससे इसे प्राधिकरण संवाद को दोबारा पॉप-अप कर दिया जाएगा। उपयोगकर्ता एप्लिकेशन अधिकृत करता है

  1. के बाद, वह फिर से लॉग इन करने की जरूरत नहीं होगी:

    तो यहाँ मैं क्या हासिल करना चाहते हैं।
  2. उपयोगकर्ता एप्लिकेशन अधिकृत करता है के बाद पोस्टिंग डायलॉग, immedietly पॉप जाएगा उसके बिना (एक बटन के साथ है, जो शुरू हो रहा है, Btw) कोड को फिर से चलाने के लिए हो रही है।
  3. एप्लिकेशन को उपयोगकर्ता अन-अधिकृत करता है, तो वह फिर से प्राधिकरण संवाद के साथ, संवाद
  4. त्रुटि के बजाय अगर वह प्राधिकरण से इनकार कर दिया प्रेरित किया जाएगा, मैं एक समारोह है कि एक त्रुटि प्रदर्शित करता है/आदि कॉल करेंगे।

यहाँ प्रासंगिक कोड है:

MyViewController.m

- (void)shareOnFacebook 
{ 
    Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID]; 
    [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook]; 
    [facebook release]; 
    facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 
    if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
    } 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs 
} 

MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate> 
{ 
    Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here 
} 
@property (nonatomic, retain) Facebook *facebook; 

@end 

MyAppDelegate.m

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

क्या यह संभव है कि मैं MyViewController पर कुछ प्रतिनिधि कार्यों को याद कर रहा हूं? क्योंकि मैं किसी कारण से देखता हूं, मैंने इसे FBDialogDelegate प्रोटोकॉल को कार्यान्वित करने के रूप में चिह्नित किया है, हालांकि वह वहां से किसी भी फ़ंक्शन को लागू नहीं करता है।

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

अग्रिम में टीएनएक्स!

+0

शायद यह आपके प्रश्न का उत्तर नहीं है, लेकिन ऐसा लगता है कि आपके पास एक समस्या है जो फेसबुक इंस्टेंस है जो हर शेयर पर पुनर्निर्मित है। प्रलेखन से ऐसा लगता है कि फेसबुक इंस्टेंस को आम तौर पर ऐपडिलेगेट में जोड़ा जाता है और ऐप चलने पर कभी भी असाइन नहीं किया जाता है। शायद इस कोड को मैंने जिस परियोजना पर काम कर रहा है, उसके लिए लिखा है, यह आपके मुद्दों को हल करना आसान हो सकता है (यह अभी तक सही नहीं है, लेकिन जहां तक ​​शेयरिंग संबंधित है, ठीक काम करता है): http://stackoverflow.com/प्रश्न/7085162/फेसबुक-कनेक्ट-क्लास-सिंगलटन-एक्सेस-टोकन-इश्यू/7085809 # 7085809 –

उत्तर

8

पहले:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self]; 

offline_access कुंजी यहाँ प्रमाणीकरण टोकन जिंदा रखेंगे हमेशा के लिए (या, और अधिक विशेष रूप से, जब तक उपयोगकर्ता मैन्युअल रूप से अपने आवेदन अपने फेसबुक में अपने आवेदन सेटिंग में डी-अधिकृत करता है अकाउंट सेटिंग)। साथ ही, अपने सक्रिय वीसी को प्रतिनिधि के रूप में सेट करें (बाद में उस पर अधिक)।

दूसरे

:

-(void)popUserShareFeed { 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; 
} 

कॉल इस विधि (या ऐसा लगता है जैसे एक) अपने -fbDidLogin प्रतिनिधि विधि में। इसके अलावा अपने मूल विधि में इसे कहते है, तो सत्र अभी भी मान्य था, अर्थात्:

if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
} else { 
    [self popUserShareFeed]; 
} 

... और अपने नए fbDidLogin:

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [self popUserShareFeed]; 
} 

(नोट: यदि आप MyViewController.m में यह परिभाषित करना होगा और इसे अपने FBSessionDelegate के रूप में उपयोग करें। यह कार्यात्मक रूप से समकक्ष होगा। आपके AppDelegate को आपके FBSessionDelegate भी होने की आवश्यकता नहीं है।

तीसरा:

लागू -fbDidNotLogin:(BOOL)cancelledFBSessionDelegate विधि इतनी तरह,:

-(void)fbDidNotLogin:(BOOL)cancelled { 
    if (cancelled) { 
     ... some alert about the user cancelling... 
    } else { 
     ... some alert about how it failed for some reason... 
    } 
} 

चौथा, जहाँ तक अपने bizarro त्रुटियों जाना: एक) सामान्य रूप में फेसबुक SDKs महान नहीं हैं, और बी) मैं केवल प्रमाणीकरण टोकन और अपने facebook वस्तु पर समाप्ति की तारीख अगर

ए) आप पहले से ही एक instantiated नहीं है सेट करते हैं (यानी, यह nil)

है

और

बी) समाप्ति तिथि जो आप निर्धारित कर रहे हैं भविष्य में है (यानी। timeIntervalSinceNow [NSDate इंस्टेंस विधि] इसे रिटर्न> 0 पर बुलाया जाता है)।

3

लगता है जैसे आप इस Facebook Platform Developer forum post में वर्णित एक ही समस्या का सामना कर रहे हैं। मुझे एक ही समस्या का सामना करना पड़ रहा है, लेकिन वेब पर। उस थ्रेड में फेसबुक से केवल एक प्रतिक्रिया दी गई थी, और यह गलत जानकारी है।

फेसबुक में अब तक का सबसे खराब डेवलपर दस्तावेज़ और डेवलपर समर्थन है, मैं समाधान पर अपनी सांस का इंतजार नहीं करूँगा।

0

मैंने इतने सारे अनुप्रयोगों में एफबीसी कनेक्ट को एकीकृत किया है, लेकिन इस तरह के गंभीर मुद्दे का कभी सामना नहीं करते हैं। तो, आपके कोड में कुछ गायब होगा:

FBAccessTokenKey & FBExpirationDateKey की जांच करने का इंस्टाल, बस FBConnect के FBSession क्लास के सत्र ऑब्जेक्ट के साथ प्रयास करें।

बस कुछ conidtions साथ मेरा कोड का उपयोग करके देखें:

session = [[FBSession sessionForApplication:@"key" secret:@"AppSecretKey" delegate:self] retain]; 
     [session resume]; 
     _posting = YES; 

     // If we're not logged in, log in first... 
     if (![session isConnected]) { 
      loginDialog = nil; 
      loginDialog = [[FBLoginDialog alloc] init]; 
      [loginDialog show]; 
     } 
      // If we have a session and a name, post to the wall! 
      else if (_facebookName != nil) { 
         [self postToWall]; // Over here posting dialog will appear , if user has already logged in or session is running. 
        } 

     } 
     else { 
      [FBBtn setTitle:@"Login" forState:UIControlStateNormal]; // if you want to change the title of button 
      [session logout]; 
     } 

साथ ही केवल, बल्कि किसी भी अन्य विधि में इसे जारी की तुलना में dealloc विधि में सत्र वस्तु जारी की देखभाल।

- (void)dealloc { 
     [super dealloc]; 
     [session release]; 
     session = nil; 
    } 

आशा है कि आपकी समस्या का समाधान होगा।

+0

क्या आप अधिक कोड/जानकारी प्रदान कर सकते हैं? मुझे यह कक्षा नहीं मिली। मुझे बस फेसबुक, एफबीडीअलॉग, एफबीएलोगिनडियलोग और एफबीआरक्वेट मिला है। – Niv

+2

@ एनआईवी वह पुराने फेसबुक एसडीके - एफबीसी कनेक्ट से उपयोग कर रहा है। आप नए एक का उपयोग कर रहे हैं - फेसबुक आईओएस एसडीके। –

0
अपने कोड की समस्याओं के लिए

नहीं एक सीधा समाधान है, लेकिन ...

आप इस के लिए एक खुला स्रोत पुस्तकालय उपयोग करने पर विचार किया है? शेयरकिट एक महान उदाहरण है: http://getsharekit.com। एकीकरण मृत सरल है और यह आपको आवश्यक सब कुछ करता है।

+1

मुझे यह त्रुटि ShareKit से ही मिल रही है (यह पृष्ठ Google पर मिली पहली हिट्स में से एक था, ShareKit को डीबग करने का प्रयास कर रहा था)। शेयरकिट भयानक है - फेसबुक के लिए दस्तावेज़ों की कुल योग का कहना है कि "फेसबुक के लिए कोई सेटअप नहीं है", जो पेटेंट असत्य है। मैं इसे टालने की सलाह दूंगा - मैं वापस एफबी आईओएस एसडीके पर स्विच करने जा रहा हूं क्योंकि शेयरकिट इतनी खराब है। – Adam

0

मैं ठीक उसी समस्या आ रहा था, और इसके बाद के संस्करण बेन मोशेर की प्रतिक्रिया का इस्तेमाल किया है, लेकिन मैं भी, फेसबुक वस्तु के लिए एक सरल सिंगलटन वर्ग बनाने के लिए इतना है कि मेरी AppDelegate में मैं निम्नलिखित समारोह ठीक से संभाल कर सकते हैं का फैसला किया:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 

    return [[[FBManager defaultManager] facebook] handleOpenURL:url]; 

    //return [facebook handleOpenURL:url]; 
} 

मेरे सिंगलटन वर्ग दोनों FBSessionDelegate और FBDialogDelegate है, इसलिए इसे इसी तरीकों संभालती है।

इससे मुझे ऐप लॉन्च होने की बजाय, वास्तव में कुछ पोस्ट करने का प्रयास करने पर उपयोगकर्ता को लॉगिन करने की अनुमति मिलती है।

1

मेरे समान था लेकिन एक ही समस्या नहीं: संदेश "एक त्रुटि आई। कृपया बाद में पुनः प्रयास करें।" हमेशा दिखाया गया था।

समस्या ठीक से कॉन्फ़िगर नहीं किया गया था ऐप आईडी - यह ग्राहक द्वारा प्रदान किया गया था (इसलिए मुझे यकीन नहीं है कि वास्तव में क्या गलत था); सबकुछ ठीक से काम करता है क्योंकि मैंने इसे अपनी खुद की टेस्ट ऐप आईडी (पिछले ऐप से) से बदल दिया है।