fbDidLogin的问题从未调用iOS

时间:2011-08-12 18:06:00

标签: iphone objective-c ios fbconnect

我的应用程序保存access_token时遇到问题。问题是,当iPhone没有安装Facebook应用程序时,safari会处理这个并且没有问题。但是只要iPhone安装了Facebook应用程序。它只是不保存访问令牌,并在每次需要对Facebook做某事时打开Facebook应用程序。然后它说,你已经给了......许可......

这就是我在viewdidload中第一次询问权限并从用户默认值中接收访问令牌的行为:

facebook = [[Facebook alloc] initWithAppId:@"APPID"];


    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    NSArray* permissions =  [[NSArray arrayWithObjects:
                              @"read_stream", @"offline_access", nil] retain];

    if (![facebook isSessionValid]) {
        [facebook authorize:permissions delegate:self];
    }

这就是我在fbdidlogin中所做的事情:

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];   
}

但是从某种程度上说,当Facebook应用程序获得控制权时,这就行不通了......每次视图加载时都会授权,再次加载。

有没有人知道?

日Thnx!

btw:我也有以下一行:

(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [[controller facebook] handleOpenURL:url]; }

6 个答案:

答案 0 :(得分:5)

我刚遇到这个问题并相信我可能找到了你的解决方案。在Facebook上创建应用程序时,您必须编辑应用程序设置以允许本机ios应用程序。所选的ios软件包ID必须与您正在创建的应用程序中的软件包ID完全匹配。 Facebook声明他们在授权您的应用之前检查了这一点。有趣的是,如果您从设备中删除Facebook应用程序,然后尝试验证它使用Web浏览器,似乎完全转换这个“安全”。这就是乔斯解决方案“有效”的原因。 Facebook不会发回错误消息,因此追踪会很有趣。我想我会把这个答案扔到那里,希望能为未来的开发者节省一些麻烦。我希望这会有所帮助。

答案 1 :(得分:1)

您是否通过Info.plist在应用上禁用了多项任务? Facebook SDK使(未记录的假设)您的应用支持多任​​务。

我的意思是你有一个“应用程序不在后台运行”(UIApplicationExitsOnSuspend)设置为YES。

如果是这种情况,您将不得不通过应用内浏览器登录,我将更新帖子并提供代码示例。

答案 2 :(得分:1)

我找到了一个解决方法,使用Facebook应用程序更好。在Facebook.m文件中我改变了这个:

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

到这个

  [self authorizeWithFBAppAuth:NO safariAuth:YES]; 

在这种情况下,用户不会离开应用程序,并且所有内容都在弹出窗口内处理,而不使用Facebook应用程序。

答案 3 :(得分:0)

这就是它现在所做的。如果已经安装了Facebook应用程序,它就会退出,如果不安装,它会对Safari进行拯救。您可以显式使用对话框界面,但随库提供的最简单的示例代码通过离开您的应用程序来执行其auth业务,然后在FB应用程序处理了auth后返回。它可以正常工作,一旦你掌握了它(并正确配置它以便返回给你),它就没事了。

要防止在每个会话上重新进行身份验证,请请求权限令牌“offline_access”。

答案 4 :(得分:0)

在您的应用代表的controller方法中仔细检查您的handleOpenURL:引用。我觉得它可能在后台设置为nil,因此Facebook永远不会收到回复。

答案 5 :(得分:0)

线条: [self authorizeWithFBAppAuth:YES safariAuth:YES];

改为

[self authorizeWithFBAppAuth:NO safariAuth:YES];

只有在我们访问Facebook.m时才有可能(因为那是人们必须做出改变的地方)

如果我们使用Facebook的最新静态库,我们无法访问.m文件。在那种情况下,我们将如何实现相同的功能?