facebook 登录问题 - canOpenURL:URL 失败:“fbauth2:///” - 错误:“(null)”

Posted

技术标签:

【中文标题】facebook 登录问题 - canOpenURL:URL 失败:“fbauth2:///” - 错误:“(null)”【英文标题】:facebook login issue - canOpenURL: failed for URL: "fbauth2:///" - error: "(null)" 【发布时间】:2015-12-16 06:34:16 【问题描述】:

当我点击使用 Facebook 登录按钮时,它正在打开 safari 浏览器并立即关闭。注意到控制台上的错误。

应用委托方法:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool 
    print("###### URL : ")
    print(url)
    print("###### App : ")
    print(app)
    print(options["UIApplicationOpenURLOptionsSourceApplicationKey"])
    return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url,  sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as! String,
            annotation: nil)

2015-09-18 18:37:51.410 [21036:5050465]-canOpenURL:URL 失败:“fbauth2:///”-错误:“(null)” 2015-09-18 18:37:51.417[21036:5050465]-canOpenURL:URL 失败:“fbauth2:///”-错误:“(null)” ###### 网址: fb4554284912963222://authorize/?error_code=100&error_message=Invalid+Scope%3A+public&state=%7B%22challenge%22%3A%222ZmK6R5F05d%252F060TkCqj8SjPLjc%253D%22%2C%220_auth222C70_id%22%3A% AE1B-E1C68435DB83%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22%7D&e2e=%7B%22init%22%3A145973.000512302%7D#_=_ ###### 应用程序 : 可选(com.apple.SafariViewService) 零 ###### 呃: 可选(错误域=com.facebook.sdk.core Code=8 "(null)" UserInfo=com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode=100, com.facebook.sdk:FBSDKErrorDeveloperMessageKey=无效范围:public,com.facebook。 sdk:FBSDKGraphRequestErrorCategoryKey=0)

IDE:xcode 7 语言:Swift2 Facebook SDK:4.6.0 解析:1.8.4

我还验证了 .plist 是否拥有所有必需的密钥。 还验证了包标识符是否存在拼写错误。看起来都不错。 Facebook 处于活动状态。

有什么帮助吗?

【问题讨论】:

这有什么更新吗?我在同一条船上,定义了所有密钥,我的用户无法登录 Facebook,除非它是原生 ios 对话框。 Web 视图和应用切换均失败。 运气好吗?我的分享对话框搞砸了:( 你能在 git 上分享你的代码,我会检查它。 我被困在同一个问题上,this answer 救了我 【参考方案1】:

您的网址“fbauth2:///”中有一个额外的“/”。

然后您可以在 url 中看到“error_message=Invalid+Scope”,您应该检查一下您的应用的权限: https://developers.facebook.com/docs/facebook-login/permissions/v2.4

【讨论】:

我没有使用任何网址。您正在谈论的任何特定网址?我刚刚在 .plist 文件中使用了 LSApplicationQueriesSchemesfbauth2 我的错。我错过了导入 FBSDKCoreKit。后来它开始在模拟器上工作,但不在 iPhone 设备上。还注意到 Facebook 网站上的以下常见问题解答。为什么我会看到控制台消息,例如 'canOpenURL: failed for URL: "fb...://' 或?这是一个 Xcode 警告,指示 canOpenURL: 调用返回 false。只要您在您的配置中配置了 LSApplicationQueriesSchemes 条目plist 如上所述,您可以忽略此警告【参考方案2】:

该问题是由于 iOS 9 中引入的 App Transport Security 造成的。

有两种解决方案,都用于修复您的 info.plist 文件

这是一个指南http://discoverpioneer.com/blog/2015/09/18/updating-facebook-integration-for-ios-9/

【讨论】:

此页面不再有效。你能发布解决方案吗?【参考方案3】:

我错过了导入FBSDKCoreKit。后来它开始在模拟器上工作,但不在 iPhone 设备上。

还注意到 Facebook 网站上的以下常见问题解答。为什么我会看到类似

的控制台消息

'canOpenURL: 失败的 URL: "fb...://'

或 ?这是一个 Xcode 警告,指示 canOpenURL: 调用返回 false。只要你在你的plist中配置了LSApplicationQueriesSchemes条目如上所述,你可以忽略这个警告

关于不能在 iPhone 设备上运行,请参考: Parse API - Facebook login not working on the iPhone device

【讨论】:

我可以忽略警告,但 Facebook 的视图控制器不显示。 你导入了所有需要的包吗?【参考方案4】:

我有同样的警告,但在 Facebook Docs 中有一个答案。

这是一个 Xcode 警告,指示 canOpenURL: 调用返回 false。只要你按照上面的描述在你的 plist 中配置了 LSApplicationQueriesSchemes 条目,你就可以忽略这个警告

https://developers.facebook.com/docs/ios/ios9

【讨论】:

【参考方案5】:

如果您使用 iOS SDK 9.0 重新编译,如果您使用的是 Facebook SDK v4.6.0 或更高版本,请将以下内容添加到应用程序的 plist:

   <key>LSApplicationQueriesSchemes</key>
   <array>
          <string>fbapi</string>
          <string>fb-messenger-api</string>
          <string>fbauth2</string>
          <string>fbshareextension</string>
   </array>

要准备支持 iOS 9 的 facebook 集成,请通过Facebook Integraion for iOS 9 guidelines

要检查 facebook SDK 的版本,请使用以下代码行:

   print("SDK version \(FBSDKSettings .sdkVersion())")

【讨论】:

【参考方案6】:

“-canOpenURL:URL 失败”警告是一条红鲱鱼,仅表示您正在运行的设备/模拟器上未安装 FB 应用程序。

您似乎正在请求“公共”的无效范围(又名权限)。您能否包含包含您要求的权限的代码? public_profile 可能是你想要的(如果没有提供,SDK 默认是什么)。

更重要的是,将 fbauth2 添加到您的 CFBundleURLSchemes 中,因为这会破坏登录流程。正如 Himanshu 指出的那样,这些条目应该在我们的 plist 中的 LSApplicationQueriesSchemes 下输入。

【讨论】:

天哪,这方面的文档绝对是一场灾难。我想我不能再喜欢 Facebook了。【参考方案7】:

如果您的应用运行在iOS9或更高版本上,则需要添加此方法。

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 
return [[FBSDKApplicationDelegate sharedInstance] application:app
                                                  openURL:url
                                        sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                               annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];

如果您需要 Swift 版本:

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
    return SDKApplicationDelegate.shared.application(app,
                                                     open: url,
                                                     sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                     annotation: options[UIApplicationOpenURLOptionsKey.annotation] as Any)

【讨论】:

【参考方案8】:

这是一个 Xcode 警告,指示 canOpenURL: 调用返回 错误的。只要你配置了LSApplicationQueriesSchemes 如上所述在您的 plist 中输入,您可以忽略此警告。

转到此Link 选择您的应用,然后配置您的info.plist

import 并将此代码添加到您的AppDelegate

import FBSDKCoreKit .  
import FBSDKLoginKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
     return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)


func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
      return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)

【讨论】:

【参考方案9】:

我发现了我的问题。这只是 loginButtonClicked 函数中的语法。错误消息导致我走错了路。这是工作代码。

@objc func loginButtonClicked() 
    self.login = FBSDKLoginManager()

    self.login.logIn(withReadPermissions: ["public_profile"], from: self, handler: (result, error) -> Void in
        if error != nil 
            print("Process error")
        
        else if (result?.isCancelled)! 
            print("Cancelled")
        
        else 
            print("Logged in")
            DispatchQueue.main.async(execute: 
                let viewController:UIViewController = self.storyboard?.instantiateViewController(withIdentifier: "UITabBarController") as! UITabBarController
                self.present(viewController, animated: true, completion: nil)
            )
        

        )

【讨论】:

以上是关于facebook 登录问题 - canOpenURL:URL 失败:“fbauth2:///” - 错误:“(null)”的主要内容,如果未能解决你的问题,请参考以下文章

Parse - 通过 Facebook 应用程序登录 Facebook

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

iOS facebook 登录问题

解析facebook登录问题?

Android Facebook 登录问题

使用 Facebook 登录登录网页的问题: