出于某种奇怪的原因,Facebook 决定创建实际上只是通知观察者的完成处理程序。忽略他们为什么这样做,我需要一些方法来请求打开一个 FBSession 并且只发生一次回调,因为回调中的对象不能被保留。
如果用户按下按钮并且具有“publish_actions”权限的 Facebook 会话未打开,则应显示活动指示器并防止在打开 Facebook 会话时与 UI 交互。
这是用于登录 Facebook 的方法:
- (void)loginToFacebookFromViewController:(UIViewController *)viewController completion:(void (^)(NSString *facebookAccountName))completion
{
if([self isLoggedIntoFacebook] == NO)
{
[viewController startLoadingAnimation];
[FBSession openActiveSessionWithPublishPermissions: @[ @"publish_actions" ] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
{
if(error == nil)
{
[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id<FBGraphUser> user, NSError *error)
{
NSString *accountName = [user name];
if(error == nil)
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
[standardUserDefaults setObject:accountName forKey:TSFacebookAccountName];
[standardUserDefaults synchronize];
}
[viewController stopLoadingAnimation];
if(completion != nil)
completion(accountName);
}];
}
else
{
[viewController stopLoadingAnimation];
if(completion != nil)
completion(nil);
}
}];
}
else
{
if(completion != nil)
completion([self facebookAccountName]);
}
}
如果没有保留完成处理程序(再次出于毫无意义的原因,因为 NSNotifications 在会话状态更改时发布),那么此方法将完美运行。
因为该应用程序不围绕 Facebook 旋转,所以我对会话状态何时更改没有任何兴趣。如果用户尝试向 Facebook 分享内容并且活动会话未打开,则登录过程将被启动,如果会话打开,则共享过程将继续。否则,将向用户显示错误消息。
有人能解释一下 Facebook 是如何期望实现这种功能的吗,因为这似乎是一个很常见的用例,在有人提到“你为什么不使用默认的 Facebook 对话框”之前,这是因为需要向用户收集用于 Open Graph 帖子的特定信息。