我已将我的应用从Facebook SDK 2升级到3.1。
我在RecordsScreen上有一个Post按钮。如果用户未登录Facebook,则会显示登录页面,如果用户已登录,则会加载另一个笔尖以提示用户输入用于发布到他/她自己墙上的消息。
我已经登录了。之后,每次单击“发布”按钮时,有关该应用程序的页面已经过授权,并通过单击“确定”显示是否继续。单击“确定”后,应用程序将终止并从头开始重新启动。每次单击“发布”按钮时,都会再次显示相同的页面。它看起来无法找到有效的会话或令牌丢失。
我在模拟器和设备上测试了这个。同样的事情发生。部署目标是iOS5.1。
我没有输入的唯一参数是iPhone App Store ID。这会影响上述行为吗?
我已经尝试了很多次但找不到解决方案。
感谢任何帮助。
谢谢!
的AOB
1月4日编辑:
我发现每次调用openSessionWithAllowLoginUI。返回状态FBSessionStateClosedLoginFailed。登录有问题。但是,自“已经授权”页面出现以来,用户已经登录了。
原因是applicationWillTerminate在openSessonWithAllowLoginUI之后立即执行。有人能说清楚这个吗?
在appDelegate.h中,我导入了FacebookSDK / FacebookSDK.h,在appDelegate.m中,实现了以下内容:
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FBSession.activeSession handleOpenURL:url);
}
-(void)applicationDidBecomeActive:(UIApplication *)application {
[FBSession.activeSession handleDidBecomeActive];
}
-(void)applicationWillTerminate:(UIApplication *)application {
[FBSession.activeSession close];
}
mainViewController是一个可以切换笔尖的多视图控制器。
我已经实现了一个类FBHandler来处理Facebook登录/注销。 FBHandler.h包含#import“Facebook.h”,FBHandler是一个包含
的类-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error {
switch(state) {
case FBSessionStateOpen:
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
default:
break;
}
[[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session];
// If there is an error, display the alert view. I have skipped this code.
}
-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
其中一个笔尖 - RecordsScreen.xib包含Facebook登录/注销按钮。在RecordsScreen.m(用户可以看到他/她的分数以及登录或从Facebook注销)的地方,以下内容被添加到viewDidLoad:
fbHandler = [[FBHandler alloc] init];
[fbHandler openSessionWithAllowLoginUI:NO];
// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad. Code is skipped here.
// The implementation of sessionStateChanged in RecordsScreen:
-(void)sessionStateChanged:(NSNotification *)notification {
if (FBSession.activeSession.isOpen) {
if (self.facebook == nil) {
self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil];
self.facebook.accessToken = FBSession.activeSession.accessToken;
self.facebook.expirationDate = FBSession.activeSession.expirationDate;
}
} else {
self.facebook = nil;
}
}
在RecordsScreen.m中,如果用户单击登录按钮,
if (!FBSession.activeSession.isOpen) {
// Login to Facebook.
[fbHandler openSessionWithAllowLoginUI:YES];
} else {
// If user is login, post to wall.
[self postScoreToWall];
}
答案 0 :(得分:4)
我发现了问题。在plist中,“应用程序不在后台运行”设置为YES。设置为NO解决了问题。
答案 1 :(得分:2)
在您显示的代码中,您只获取会话的基本读取权限集。需要至少调用reauthorizeWithPublishPermissions:
来传递适当的权限。
我遇到了类似的问题,我通过更改两件事来解决这个问题,在登录时我没有使用Facebook建议的两步权限升级方法,但我尝试使用{{获取登录时所需的权限1}}。
在尝试再次调用sdk之前,还需要确保在Facebook登录过程结束时调用openActiveSessionWithPublishPermissions
。如果您有一系列执行此过程的各个步骤的块,则可能不会发生这种情况。
我没有使用这个sdk的旧版本,但它似乎更直观。