fbDidLogin 的问题从未调用过 iOS

Posted

技术标签:

【中文标题】fbDidLogin 的问题从未调用过 iOS【英文标题】:Problems with fbDidLogin never called iOS 【发布时间】:2011-08-12 18:06:00 【问题描述】:

我的应用保存 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 应用程序控制时,这只是行不通......它会在每次视图加载时授权,再次加载。

有人知道吗?

谢谢!

顺便说一句:我也有以下行:

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

【问题讨论】:

它是进入 Safari,还是在您的应用程序的 UIWebView 覆盖中打开? 【参考方案1】:

我刚遇到这个问题,相信我可能已经找到了您的解决方案。当您在 facebook 上创建应用程序时,您必须编辑您的应用程序设置以允许原生 ios 应用程序。所选的 ios 捆绑包 ID 必须与您正在创建的应用程序中的捆绑包 ID 完全匹配。 Facebook 声明他们会在授权您的应用程序之前检查这一点。有趣的是,如果您从设备中删除 facebook 应用程序,然后尝试使用 Web 浏览器对其进行身份验证,并且似乎完全绕过了这种“安全性”。这就是 Jos 解决方案“有效”的原因。 Facebook 不会发回错误消息,因此追踪起来很有趣。我想我会把这个答案扔在那里,希望能为一些未来的开发者省去一些麻烦。我希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

到这里

  [self authorizeWithFBAppAuth:NO safariAuth:YES]; 

在这种情况下,用户无需离开应用程序,所有内容都在弹出窗口中处理,无需使用 Facebook 应用程序。

【讨论】:

【参考方案4】:

这就是它现在所做的。如果已安装,它将退出 Facebook 应用程序,如果未安装,则退出 Safari。您可以显式使用对话框界面,但库提供的最简单的示例代码通过离开您的应用程序来完成其身份验证业务,然后在 FB 应用程序处理完身份验证后返回。它可以正常工作,一旦您对它有所了解(并对其进行正确配置以返回给您),就可以了。

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

【讨论】:

好的!但是有没有办法阻止 Facebook 应用程序的使用,因为我在我的应用程序中没有以正确的方式工作。我可以重写我认为的代码,但如果它只是使用带有弹出窗口的 safari 一切都可以!【参考方案5】:

在您的应用委托的handleOpenURL: 方法中仔细检查您的controller 引用。我感觉它可能在后台设置为nil,因此 Facebook 从未收到响应。

【讨论】:

【参考方案6】:

行: [self authorizeWithFBAppAuth:YES safariAuth:YES];

被改成

[self authorizeWithFBAppAuth:NO safariAuth:YES];

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

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

【讨论】:

以上是关于fbDidLogin 的问题从未调用过 iOS的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS FbDidLogin 未第一次调用

IOS - 未调用 Facebook SDK fbDidLogin - 初始化视图控制器。

Facebook api ios-sdk,代表不工作,没有调用 fbDidLogin

iOS startUpdatingLocation 从未调用过

Firebase Google 登录 (iOS) - 从未调用过 GIDSignInUIDelegate 方法

Facebook fbDidLogin 在 [facebook authorize:permissions] 之后被多次调用