FBSession:尝试对未打开的会话重新授权权限

我正在按照这个教程来实现在Facebook SDK 3.1的视图预览post,但是当我调用这个方法…

// Ask for publish_actions permissions in context if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) { // No permissions found in session, ask for it [FBSession.activeSession reauthorizeWithPublishPermissions: [NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error) { if (!error) { // If permissions granted, publish the story [self publishStory]; } }]; } else { // If permissions present, publish the story [self publishStory]; } 

返回以下错误:

*终止应用程序由于未捕获的exception'com.facebook.sdk:InvalidOperationException',原因:'FBSession:试图对未打开的会话重新授权权限'

发生了什么事情? 谢谢!

编辑:冉我的朋友,非常感谢你,但仍然有一个细节…当他第一次发布他要求授权的应用程序,我授权这块秋天

/ * *用发布权限打开一个新的会话* /

  [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceOnlyMe allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if (!error && status == FBSessionStateOpen) { [self publishStory]; }else{ NSLog(@"error"); //Here I get the error mentioned below } }]; } 

与错误:错误:

domain = com.facebook.sdk,code = 5

错误表示FBSession未打开。 所以你应该在尝试重新授权之前检查会话是否打开。

 if ([[FBSession activeSession] isOpen]) { /* * if the current session has no publish permission we need to reauthorize */ if ([[[FBSession activeSession] permissions]indexOfObject:@"publish_actions"] == NSNotFound) { [[FBSession activeSession] requestNewPublishPermissions:[NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session,NSError *error){ [self postPhoto]; }]; }else{ [self publishStory]; } }else{ /* * open a new session with publish permission */ [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceOnlyMe allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if (!error && status == FBSessionStateOpen) { [self publishStory]; }else{ NSLog(@"error"); } }]; } 

请确保一致地请求相同的权限,这应该是publish_actions (介意复数forms)。

AppDelegate中还需要另一个方法:

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // attempt to extract a token from the url return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication fallbackHandler:^(FBAppCall *call) { NSLog(@"In fallback handler"); }]; } 

这将处理urlcallback,如果在Safari浏览器中完成身份validation。 之后,FBSession将会开放。