2013-05-22 5 views
8

मेरे पास एक लिंक साझा करने के लिए एक बटन है। मैं मूल रूप से दो कॉल का उपयोग कर रहा हूं: openActiveSessionWithReadPermissions और requestNewPublishPermissionsफेसबुक आईओएस एसडीके 3.5.1: openActiveSessionWithReadPermissions - समापन हैंडलर दो बार

तो इस बटन को कार्रवाई है:

- (IBAction) shareFacebookButtonAction:(id)sender 
if (![[FBSession activeSession] isOpen]) 
     { 
      NSArray *permissions = @[@"read_friendlists", @"email"]; 
      [FBSession openActiveSessionWithReadPermissions:permissions 
               allowLoginUI:YES 
              completionHandler:^(FBSession *session, 
                   FBSessionState state, 
                   NSError *error) 
      { 
       if (FB_ISSESSIONOPENWITHSTATE([session state])) 
       { 
        [self _prepareShare]; 
       } 
       else 
       { 
        // show alert view with error 
       } 
      }]; 
     } 
     else 
     {   
      [self _prepareShare]; 
     } 
    } 

और इस के साथ मैं अनुमति प्रकाशित के लिए पूछ रहा हूँ, अगर कोई permissione सत्र में पाए जाते हैं

-(void) _prepareShare; 
{ 
    if ([FBSession.activeSession.permissions 
     indexOfObject:@"publish_actions"] == NSNotFound) 
    { 
     [FBSession.activeSession 
     requestNewPublishPermissions: 
     [NSArray arrayWithObject:@"publish_actions"] 
     defaultAudience:FBSessionDefaultAudienceFriends 
     completionHandler:^(FBSession *session, NSError *error) 
     { 
      if (!error) 
      { 
       [self _share]; 
      } 
      else 
      { 
       //error 
      } 
     }]; 
    } else 
    { 
     [self _share]; 
    } 
} 

_share सिर्फ कुछ पोस्ट करता है

-(void) _share; 
{ 

    NSMutableDictionary *params_dict = [NSMutableDictionary dictionary]; 
    // setting some params 

    [FBRequestConnection startWithGraphPath:@"me/feed" parameters:params_dict HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
    { 
     if (result) 
     { 
      // sharing succedeed, do something 
     } 
     else if (error) 
     { 
      //sharing failed, do something else 
     } 
    }]; 
} 

पहली बार मैं साझा करने का प्रयास करता हूं (पहले से ही आईओएस 6 में एफबी पर लॉग इन किया गया है और ऐप पहले ही अधिकृत है) openActiveSessionWithReadPermissions का पूरा करने वाला हैंडलर दो बार कहा जाता है: एक बार FBSessionStateOpen के साथ और एक बार FBSessionStateOpenTokenExtended (openSessionForPublishPermissions कॉल से) के साथ। परिणामस्वरूप, _share को दो बार भी कहा जाता है, else_prepareShare (यदि मेरे पास पहले से ही अनुमति अनुमतियां हैं) और ओपन सत्र फॉरपुब्लिशप्रमिशन के समापन हैंडलर में दूसरी बार। तो मेरे पास फेसबुक की दीवार पर एक डबल पोस्ट है, बस पहली बार जब मैंने ऐप में साझा किया था। मुझे FBSession: It is not valid to reauthorize while a previous reauthorize call has not yet completed के लिए एक क्रैश रिपोर्ट भी मिली (मैं इसे फिर से करने में सक्षम नहीं हो सका)।

इस स्थिति को संभालने का सही तरीका क्या है?

+0

कृपया इस पोस्ट में जवाब देखें: http://stackoverflow.com/questions/12915420/facebook-ios-3-1-: [1] [1] [लिंक यहाँ विवरण दर्ज] एसडीके-लॉगिन-साथ-प्रकाशित-अनुमति-कॉलबैक – Chengjiong

उत्तर

2

आप इस

- (IBAction)facebookBasti:(id)sender { 
if(FBSession.activeSession.isOpen){ 

    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
     if (!error) { 

      NSLog(@" Email = %@",[user objectForKey:@"email"]); 
     } 
    }]; 

    NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken); 
    [self publishFacebook]; 

} 
else { 
    // try to open session with existing valid token 
    NSArray *permissions = [[NSArray alloc] initWithObjects: 
          @"publish_actions",@"email", 
          nil]; 
    FBSession *session = [[FBSession alloc] initWithPermissions:permissions]; 
    [FBSession setActiveSession:session]; 
    if([FBSession openActiveSessionWithAllowLoginUI:NO]) { 
     // post to wall 
     [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
      if (!error) { 

       NSLog(@" Email = %@",[user objectForKey:@"email"]); 
      } 
     }]; 

     NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken); 
     [self publishFacebook]; 
    } else { 
     // you need to log the user 
     NSLog(@"login"); 

     [FBSession openActiveSessionWithPermissions:permissions 
             allowLoginUI:YES 
            completionHandler:^(FBSession *session, 
                 FBSessionState state, 
                 NSError *error) { 
             NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken); 
             [self publishFacebook]; 

            }]; 
    } 
} 

}

और publishFacebook विधि

-(void)publishFacebook 
    { 
NSMutableDictionary *postParams2= [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
            haberLink, @"link", 
            @"abc.com", @"name", 
            title, @"caption", 
            desc, @"description", 
            nil]; 

[FBRequestConnection 
startWithGraphPath:@"me/feed" 
parameters:postParams2 
HTTPMethod:@"POST" 
completionHandler:^(FBRequestConnection *connection, 
        id result, 
        NSError *error) { 
    NSString *alertText; 
    if (error) { 
     alertText = [NSString stringWithFormat: 
         @"error: domain = %@, code = %d", 
         error.domain, error.code]; 
    } else { 
     alertText = [NSString stringWithFormat: @"Shared Facebook"]; 



     [[[UIAlertView alloc] initWithTitle:@"Shared Facebook" 
            message:alertText 
            delegate:self 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles:nil] 
      show]; 

    } 
}]; 

}

+0

आपकी सहायता के लिए धन्यवाद, लेकिन मैं वास्तव में समझना चाहता हूं कि क्या मैं कुछ गलत कर रहा हूं और इस फेसबुक व्यवहार को संभालने का उचित तरीका – laucel

+0

आपकी तैयार शेयर विधि में पहले से ही पोस्ट कर चुका है जब आप _share विधि को कॉल करते हैं तो इसे फिर से –

+0

हां पोस्ट करें, लेकिन अगर कोई ब्लॉक में है (यदि मेरे पास प्रकाशित अनुमति नहीं है, तो इसके लिए पूछें, फिर साझा करें), दूसरा अन्य ब्लॉक में है (अगर मैंने पहले ही प्रकाशित किया है अनुमति, बस साझा करें)। समस्या यह है कि _share को FBSessionStateOpenTokenExtended द्वारा ट्रिगर किए गए _prepareshare के अन्य कथन में बुलाया जाता है, जबकि अनुरोधन्यूपublिशप्रमिशन ने अभी तक अपना पूरा करने वाला हैंडलर नहीं कहा है, जब _share को फिर से कॉल किया जाता है – laucel

13

यह प्रतीत होता है कि डिजाइन द्वारा, फेसबुक एसडीके संचालकों को ब्लॉक करने के संदर्भ को बरकरार रखे हुए भी उपयोग कर सकते हैं उन्हें बुलाए जाने के बाद। इस प्रकार, आपके कॉल में openActiveSessionWithReadPermissions सत्र स्थिति बदलते समय पूरा होने वाले हैंडलर को कई बार बुलाया जा सकता है। Facebooks comment on this issue here देखें।

के चारों ओर एक काम करते हैं, आप अपने खुद के तंत्र कि हैंडलर सुनिश्चित करता है केवल एक बार सक्रिय किए जाने पर लागू करने के लिए चाहते हो सकता है के रूप में:

__block FBSessionStateHandler runOnceHandler = ^(FBSession *session, 
              FBSessionState status, 
              NSError *error) { /* YOUR CODE HERE */ }; 

... 

[FBSession openActiveSessionWithReadPermissions:YOUR_PERMISSIONS 
             allowLoginUI:YES 
            completionHandler:^(FBSession *session, 
                 FBSessionState status, 
                 NSError *error) { 
             if (runOnceHandler) { 
              runOnceHandler(session, status, error); 
              runOnceHandler = nil; 
             } 

            } 
    ]; 
1

कृपया Upgrading from 3.0 to 3.1 पढ़ा है, विशेष रूप से पैरा पढ़ें & लिखने की अनुमति अलग से माँगना । ऐसा लगता है कि फेसबुक एसडीके इस तरह इस्तेमाल नहीं किया जा रहा है।

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

और

यह महत्वपूर्ण है कि आप बस दो अलग-अलग तरीकों बैक-टू-बैक कॉल करने के लिए पदावनत कार्यों में से किसी को बदलने के लिए प्रयास नहीं करते है।

मुझे आश्चर्य है कि आपने इस समस्या को हल करने में कैसे कामयाब रहे। बीटीडब्लू, मुझे एक ही क्रैश रिपोर्ट मिलती है (एफबीएसशन: पिछला पुन: प्राधिकरण कॉल अभी तक पूरा नहीं हुआ है, फिर भी इसे पुनः प्राधिकृत करने के लिए मान्य नहीं है)।

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