Facebook登录问题 - canOpenURL:失败,URL为“fbauth2:///” - 错误:“(空)”。

63

当我点击“以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: failed for URL: "fbauth2:///" - error: "(null)"
2015-09-18 18:37:51.417[21036:5050465] -canOpenURL: failed for URL: "fbauth2:///" - error: "(null)"
###### URL :
fb4554284912963222://authorize/?error_code=100&error_message=Invalid+Scope%3A+public&state=%7B%22challenge%22%3A%222ZmK6R5F05d%252F060TkCqj8SjPLjc%253D%22%2C%220_auth_logger_id%22%3A%223C79F2C8-61B9-470E-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#_=_
###### App :
Optional(com.apple.SafariViewService) nil
###### err:
Optional(Error Domain=com.facebook.sdk.core Code=8 "(null)" UserInfo={com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode=100, com.facebook.sdk:FBSDKErrorDeveloperMessageKey=Invalid Scope: public, com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey=0})

开发工具:Xcode 7
开发语言:Swift2
Facebook SDK:4.6.0
Parse:1.8.4

我已查证了.plist文件中包含所需的所有关键字,也检查了软件包标识符是否存在错别字。一切看起来都很好,Facebook也是活动状态。

需要帮助吗?


这个问题有任何更新吗?我也遇到了同样的问题,已经定义了所有密钥,但我的用户无法登录Facebook,除非使用本机iOS对话框。Web视图和应用程序切换都失败了。 - Andrew
这里有什么运气吗?我的共享对话框出问题了 :( - Mohsin Khubaib Ahmed
你能在Git上分享你的代码吗?我会检查它。 - sfbayman
我遇到了同样的问题,而这个答案拯救了我。 - wynnset
9个回答

45

我有相同的警告,但在 Facebook 文档中有答案。

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

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


38

"-canOpenURL: failed for URL" 警告是一个误导性的信息,它只是意味着FB应用程序未安装在您所运行的设备/模拟器上。

看起来您正在请求一个无效的权限,名称为 "Public"。请您提供您的代码以便检查你正在请求哪些权限?public_profile 可能是您需要的权限(如果没有提供默认为SDK)。

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


1
我的天啊,这份文档简直是一场灾难。我还以为我对Facebook的喜爱已经到了谷底。 - TylerJames

4

如果您正在使用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 集成,请查看iOS 9 的 Facebook 集成指南

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

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

3
这是一个Xcode警告,表示canOpenURL:调用返回false。只要您按照上述说明配置了plist中的LSApplicationQueriesSchemes条目,就可以忽略此警告。
转到链接,选择您的应用程序,并配置您的info.plist。
导入并将此代码添加到您的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)
}

2

我遗漏了导入 FBSDKCoreKit。后来它在模拟器上运行正常,但在 iPhone 设备上却无法运行。

另外,在 Facebook 网站上注意到以下 FAQ。为什么会看到类似于下面的控制台消息:

'canOpenURL: failed for URL: "fb...://'

或者?这是 Xcode 警告,表示 canOpenURL: 调用返回了 false。只要您已按照上述说明配置了 LSApplicationQueriesSchemes 条目在您的 plist 中,您可以忽略此警告。

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


我可以忽略这个警告,但是Facebook的视图控制器没有显示出来。 - CQM
你导入了所有必需的包吗? - sfbayman

1

我解决了我的问题。只是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)
            })
        }

        })
}

1

如果您的应用程序在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)
}

0

1
我没有使用任何URL。你说的是哪个具体的URL?我只是在.plist文件中使用了<key>LSApplicationQueriesSchemes</key><array><string>fbauth2</string></array>。 - sfbayman
我的错。我错过了导入FBSDKCoreKit。后来它在模拟器上开始工作,但是在iPhone设备上没有。还注意到Facebook网站上的以下FAQ。为什么我会看到像“canOpenURL: failed for URL: "fb...://' or ?”这样的控制台消息?这是Xcode警告,表示canOpenURL:调用返回false。只要您按照上面描述的方式配置了plist中的LSApplicationQueriesSchemes条目,您可以忽略此警告。 - sfbayman

0

这个页面已经不再活跃了。你能发布解决方案吗? - Krishna Karki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接