2013-05-15 25 views
11

我發現有趣的問題。FBSession requestNewPublishPermissions如何處理「跳過」用戶操作

當我要求新的發佈權限時,fb sdk顯示「跳過」按鈕的對話框。 我處理像這樣

 

     [[[appDelegate facebook] session] requestNewPublishPermissions:permissions 
                 defaultAudience:FBSessionDefaultAudienceEveryone 
                completionHandler:^(FBSession *session, NSError *error) 
     { 
      if (!error) 
      { 
        //do smth if there is no error 
      } 
     }]; 

但是,當用戶按下「跳過」對話框內 - 誤差爲零。

如何處理?也許我不明白。 Thx。

+0

說不上誰是弗蘭克•downvoted這個......你救了我的屁股。 –

+0

發現相同的問題。 Facebook對話框顯示「跳過」按鈕 –

回答

8

對我來說也一樣,好像這是Facebook SDK中的bug,但我不確定。如果會話具有新的權限,我添加了額外的檢查。

- (void)postToFacebookWithMessage:(NSString *)message completionBlock:(void (^)(NSError *))completionBlock 
    { 
     NSArray *permissions = @[@"publish_actions"]; 

     void (^completionHandler)(FBSession *session, NSError *error) = ^(FBSession *session, NSError *error) { 
      if (error != nil) 
      { 
       if (completionBlock != nil) 
       { 
        completionBlock(error); 
       } 
      } 
      else if(![self activeSessionHasPermissions:permissions]) 
      { 
       NSError *error = [NSError errorWithDomain:@"Facebook" code:FBAccessDisabledCode userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Facebook access disabled", @"Facebook access disabled")}]; 
       if (completionBlock != nil) 
       { 
        completionBlock(error); 
       } 
      } 
      else 
      { 
       NSMutableDictionary<FBGraphObject> *action = [FBGraphObject graphObject]; 
       action[@"message"] = message; 

       [FBRequestConnection startForPostWithGraphPath:@"me/og.posts" graphObject:action completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
        // internal error 1611231 means that this was already posted 
        if (error.code == 5) 
        { 
         error = [NSError errorWithDomain:@"Facebook" code:FBDuplicateActionErrorCode userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Already posted to Facebook", @"Already posted to Facebook")}]; 
        } 

        if (completionBlock != nil) 
        { 
         completionBlock(error); 
        } 
       }]; 
      } 
     }; 

     if ([self activeSessionHasPermissions:permissions]) 
     { 
      completionHandler([FBSession activeSession], nil); 
     } 
     else 
     { 
      [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone completionHandler:completionHandler]; 
     } 
    } 

    - (BOOL)activeSessionHasPermissions:(NSArray *)permissions 
    { 
     __block BOOL hasPermissions = YES; 
     for (NSString *permission in permissions) 
     { 
      NSInteger index = [[FBSession activeSession].permissions indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
       if ([obj isEqualToString:permission]) 
       { 
        *stop = YES; 
       } 
       return *stop; 
      }]; 

      if (index == NSNotFound) 
      { 
       hasPermissions = NO; 
      } 
     } 
     return hasPermissions; 
    } 

希望這將有助於

+2

你是老兄。我不知道是誰downvoted這個考慮,即使從Facebook的美味的示例應用程序遭受這種情況。我沒有期望在friggin示例應用程序的這種級別的plebbery。 –

+5

您可以檢查[[FBSession activeSession] .permissions containsObject:@「publish_actions」]爲true,而不是使用activeSessionHasPermissions:method @evfemist寫道。 –