16

我在使用 facebook 3.1 ios 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 登录,除了这一功能,因此登录过程应该在同一个按钮按下。

谢谢!

4

2 回答 2

26

我遇到了同样的问题。我找到的解决方案是将调用包装[self openSessionForPublishPermissions];在 dispatch_async 块中。

例子:

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

原因是对 reauthorize.. 的调用需要在调用 openActiveSession.. 的事件循环之后。

于 2012-10-20T21:54:45.840 回答
0

这是否有可能是命中断点的超时?遇到此错误一次,但在禁用断点运行后没有再次出现。

于 2012-10-16T20:22:05.007 回答