身份验证后,iOS Facebook发布供稿对话框不会显示

时间:2012-01-17 23:34:57

标签: ios facebook facebook-ios-sdk

感谢阅读。

我经历了Facebook iOS SDK Feed Dialog issue after authentication,但徒劳无功。

什么有效: 我使用带有Feed对话框的Facebook iOS Tutorial创建了一个示例“Hello,World”应用程序。本教程工作正常,我可以在我的Feed中看到帖子。

问题: 当我在我的应用程序中集成此代码时,当控件返回到我的应用程序时,我无法在身份验证后看到Feed对话框。

控制流程 我有UIImagePickerController显示拍照的相机,然后显示UIAlertView以指示图像正在上传,显示UIAlertView以显示从服务器返回的结果,然后最后显示UIActionSheet以显示不同的共享选项(分享到Facebook,Twitter等)。

当用户点击“分享到Facebook”时,会调用以下selector


- (void) initFacebook
{
    //Init Facebook
    facebook = [[Facebook alloc] initWithAppId:@"308136969223987" andDelegate:self];

    //Check for access_token 
    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:nil];
    }

    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
  kAppId, @"app_id",
  @"https://developers.facebook.com/docs/reference/dialogs/", @"link",
  @"http://fbrell.com/f8.jpg", @"picture",
  @"Facebook Dialogs", @"name",
  @"Reference Documentation", @"caption",
  @"Using Dialogs to interact with users.", @"description",
  @"Facebook Dialogs are so easy!",  @"message",
  nil];

  [_facebook dialog:@"feed" andParams:params andDelegate:self];  
}

这会启动Facebook应用进行身份验证,然后使用UIImagePickerController再次打开我的应用,但不会显示Feed Dialog

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:4)

您必须在FBSessionDelegate的 - (void)fbDidLogin中再次手动调用您想要的方法 - (void)initFacebook。

另外,为了使这更通用,我在[facebook authorize:nil]之后做了一个小技巧;我设置了一个挂起的目标和选择器来存储登录后需要执行的挂起命令。像这样......

id fbPendingTarget;
SEL fbPendingAction;

    if (![delegate.facebook isSessionValid]) {
        [delegate.facebook authorize:nil]; // Facebook app or Safari login, mustitask

        // Save pending actions
        delegate.fbPendingTarget = self;
        delegate.fbPendingAction = @selector(facebookButtonPressed);

        [self retain]; // *** hold on to self if you will release self and is using fbPendingTarget as self
    } 

当代表触发时,它会运行您的待处理操作......

- (void)fbDidLogin {
    [self storeAuthData:[facebook accessToken] expiresAt:[facebook expirationDate]];
    [self apiFQLIMe]; // request user info

    // perform any pending actions after login
    if ([fbPendingTarget respondsToSelector:fbPendingAction]) {
        [fbPendingTarget performSelector:fbPendingAction];
    }
    self.fbPendingTarget = nil;
    self.fbPendingAction = nil;

    [self release]; // *** let go of self after we finished everything
}

这有助于在登录后执行您需要的任何待处理操作。并且在执行或登录失败后不要忘记清除它们。

-(void)fbDidNotLogin:(BOOL)cancelled {
    UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:@"Cannot Connect"
                                                         message:@"There was an error while connecting to Facebook. Please try Again."
                                                        delegate:self
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil] autorelease];
    [alertView show];

    self.fbPendingTarget = nil;
    self.fbPendingAction = nil;

    [self release]; // *** let go of self after we finished everything
}

希望这会有所帮助:)

修改:我认为最好将fbPendingTarget设置为整个应用生命周期中存在的某个对象(例如appDelegate),而不是设置为self。这是因为在很多情况下,您的self是一个视图,将在用户向Facebook发送帖子后立即发布。向已发布的对象发送消息会使您的应用程序崩溃。

解决此问题的一种肮脏方式是在发送之前明确使用[self retain],然后在[self release]中明确使用fbPendingAction。但是那将保留那些应该在那个时候释放的其他东西。我发现设置为appDelegate更容易,因为您将采取的大多数操作只是显示警报。为了安全起见,我将编辑代码。