2012-10-16 68 views
16

我遇到了登录与Facebook的发布权限3.1的ios sdk。Facebook的iOS 3.1 sdk登录与发布权限回调

我的应用程序有一个共享视频的按钮,当用户点击它时我想添加基本+发布权限。据我了解,我必须做两个通话 -

  1. openActiveSessionWithReadPermissions,然后
  2. reauthorizeWithPublishPermissions

这是我现在使用的代码:

//Opens a Facebook session and optionally shows the login UX. 
- (void)openSessionForReadPermissions 
{ 
    [FBSession openActiveSessionWithReadPermissions:nil 
             allowLoginUI:YES 
            completionHandler: 
    ^(FBSession *session, 
     FBSessionState state, NSError *error) { 

     //this is called even from the reauthorizeWithPublishPermissions 
     if (state == FBSessionStateOpen && !error) 
     { 
      [self openSessionForPublishPermissions]; 
     } 
     else if (state == FBSessionStateClosedLoginFailed) 
     { 
      [FBSession.activeSession closeAndClearTokenInformation]; 

      [[NSNotificationCenter defaultCenter] postNotificationName:FBLoginErrorNotification object:session]; 
     } 
    }]; 
} 

-(void)openSessionForPublishPermissions 
{  
    NSArray* permissions = [NSArray arrayWithObject:@"publish_stream"]; 

    [[FBSession activeSession] reauthorizeWithPublishPermissions:permissions 
               defaultAudience:FBSessionDefaultAudienceFriends 
               completionHandler: 
    ^(FBSession *session, NSError *error) 
    { 
     if (!error) 
     { 
      [[NSNotificationCenter defaultCenter] 
       postNotificationName:FBLoginSuccessNotification 
       object:session]; 
     } 
     else 
     { 
      [[NSNotificationCenter defaultCenter] 
       postNotificationName:FBLoginErrorNotification 
       object:session]; 
     } 
    }]; 
} 

我看到openSessionForReadPermissions中的块被调用两次(一次使用FBSessionStateOpen,一次使用来自openSessionForPublishPermissions调用的FBSessionStateOpenTokenExtended),一次当第一次尝试登录应用程序时,我得到ErrorReauthorizeFailedReasonUserCancelled(如果O之前删除了所有应用程序权限)。

什么是实现此登录的正确方法?该应用程序不需要Facebook登录,除了这一功能,所以登录过程应该在同一按钮上。

谢谢!

+0

+1我们陷入了同样的问题,特别是因为混合权限调用被取消。 –

+0

reauthorizeWithPublishPermissions折旧。改为使用 requestNewPublishPermissions。 – John

回答

26

我跑过这个相同的问题。我找到的解决方案是将调用[self openSessionForPublishPermissions];包装在dispatch_async块中。

实施例:

dispatch_async(dispatch_get_current_queue(), ^{ 
    [self openSessionForPublishPermissions]; 
}); 

的原因是,该呼叫重新授权..需要是事件循环其中openActiveSession ..被称为后。

+0

谢谢!这个bug已经让我头痛了好几天。 – Tiddly

0

这可能是一个超时断点的机会吗?遇到此错误一次,但在断点停用后再次运行。