在用户已登录 Facebook 的设备上登录时如何跳过 Facebook 的权限页面

Posted

技术标签:

【中文标题】在用户已登录 Facebook 的设备上登录时如何跳过 Facebook 的权限页面【英文标题】:How to skip Facebook's permission page when logging in on a device that a user is already logged into Facebook 【发布时间】:2015-05-04 19:34:48 【问题描述】:

我正在用 Swift 编写一个 ios8 应用程序。我正在尝试使用 Facebook 登录,并且正在使用 Facebook iOS SDK 4.1。我没有使用 Facebook 按钮。我有自己的简单按钮。单击按钮,调用我编写并粘贴在下面的 facebookLogin 方法。我在已登录 Facebook 的计算机上运行该应用程序。第一次运行时,它会询问权限,在我按 OK 后,它会登录,一切都很好。在以后的运行中,当我仍然在同一台计算机上登录时,应用程序再次显示权限页面,这一次表示用户已经授权了应用程序并给出了确定和取消选项。按确定,继续登录。我附上下面的截图。我的问题是我不想在以后的这些运行中获得权限页面。我认为它应该静默进行而不跳到 Facebook 应用程序/网站。在手机上尝试也有类似的行为。它没有显示权限页面,但会弹跳到 Facebook 应用程序,并且几乎立即返回。

let fbLoginManager = FBSDKLoginManager()

func facebookLogin() 

    var token = FBSDKAccessToken.currentAccessToken()
    if (token != nil) 
        return
    

    fbLoginManager.logInWithReadPermissions(["public_profile"], handler:  (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
        if ((error) != nil) 
            // Process error
         else if (result.isCancelled) 
            // Handle cancellations
         else 
            if (result.grantedPermissions.contains("public_profile"))  
                // Handle the result
            
        
    )

这是 AppDelegate 中的相关部分:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool 

    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)

感谢您的帮助。我看过很多关于这个主题的帖子,但没有太多帮助,特别是关于新的 Facebook SDK。谢谢!

【问题讨论】:

我对 Swift 不太熟悉,但你这样称呼正确吗? return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; 谢谢!您的评论实际上是我的问题的解决方案。我没有覆盖应用程序:didFinishLaunchingWithOptions。我在另一个线程中讨论过这个问题,@VijayMasiwal 帮助我找到了你在这里提到的确切解决方案。这是该主题的链接 [***.com/questions/30042905/…. 很高兴听到这已为您解决!我会把它放在一个真实的答案中,这样你就可以接受了。这样一来,如果其他人发现了这个问题,他们可以很快看到解决方案是什么。 【参考方案1】:

您应该在调用logInWithReadPermissions 之前检查一个有效的FBSDKAccessToken

if FBSDKAccessToken.currentAccessToken != nil

  // already logged in with the requested permissions

else

  // login here

请记住,如果您决定请求一些新权限,您可能应该通过检查访问令牌的 permissions 属性 (NSSet) 来专门检查这些权限,而不仅仅是检查是否存在令牌。

【讨论】:

我已经在我的方法开始时检查令牌: var token = FBSDKAccessToken.currentAccessToken() if (token != nil) return 当我重新启动应用程序时,令牌是nil,所以它会调用登录名。但我认为,由于我已经在该设备上登录,它不应该向我显示权限页面。 能否尝试获取当前访问令牌的tokenString,如:***.com/questions/29914852/… 您是在进行硬重启(删除应用程序或杀死模拟器),还是用户正常执行的方式?在正常情况下,Facebook 数据应该会保存到磁盘中。 @Dima 我正在硬重启。我的问题现在解决了。请看我上面的评论。我应该重写应用程序:didFinishLaunchingWithOptions。如果不调用 Facebook 的 application:didFinishLaunchingWithOptions 方法,则不会加载 currentAccessToken 并且会保持为零,因此检查对我没有帮助。感谢您跟进此事! @user2732722 嗨。每次我在杀死我的应用程序时检查用户是否已登录时,我都会遇到 nil (使用 currentAccessToken)。 FBSDKApplicationDelegate.sharedInstance().application(application,openURL: url, sourceApplication: sourceApplication, annotation: annotation) 似乎起到将其转移到另一页面的作用,我可以知道你做什么检查用户是否已经登录?【参考方案2】:

(这本来是我的评论,但结果也是解决方案)

您需要确保您正在调用(相当于 Swift 的)以下内容:

return [[FBSDKApplicationDelegate sharedInstance] 
         application:application 
         didFinishLaunchingWithOptions:launchOptions];

这是 SDK 正确启动所必需的。这记录在这里:

https://developers.facebook.com/docs/reference/ios/current/class/FBSDKApplicationDelegate/#instance_methods

从 [UIApplicationDelegate] 调用此方法 AppDelegate 的 application:didFinishLaunchingWithOptions:] 方法 为您的应用程序。应该调用它以正确使用 Facebook SDK。

【讨论】:

以上是关于在用户已登录 Facebook 的设备上登录时如何跳过 Facebook 的权限页面的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录(网络)看不到通过 facebook 设备应用程序登录的用户

查看设备是不是已使用 Facebook 登录

Facebook 登录在某些 iOS 设备上总是出错

Facebook Unity SDK 测试用户登录

如何知道用户已经在 iOS 应用上完成 Facebook 登录

Hybridauth Facebook 使用本机应用程序在移动设备上登录