我的应用程序保存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]; }
答案 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文件。在那种情况下,我们将如何实现相同的功能?