Facebook SDK使用Swift 3 iOS 10login

我通过Cocoapods安装了Facebook的Swift SDK:

pod 'FacebookCore', :git => "https://github.com/facebook/facebook-sdk-swift" pod 'FacebookLogin', :git => "https://github.com/facebook/facebook-sdk-swift" 

我遵循Facebook的Swift SDK( https://developers.facebook.com/docs/swift/login )的login说明,但无法正常工作。

在我的视图控制器里面我有以下几点:

 @objc fileprivate func facebookSignIn() { let loginManager = LoginManager() print("LOGIN MANAGER: \(loginManager)") loginManager.logIn([ .publicProfile, .email ], viewController: self) { loginResult in print("LOGIN RESULT! \(loginResult)") switch loginResult { case .failed(let error): print("FACEBOOK LOGIN FAILED: \(error)") case .cancelled: print("User cancelled login.") case .success(let grantedPermissions, let declinedPermissions, let accessToken): print("Logged in!") print("GRANTED PERMISSIONS: \(grantedPermissions)") print("DECLINED PERMISSIONS: \(declinedPermissions)") print("ACCESS TOKEN \(accessToken)") } } } 

“loginpipe理员:等等” 当我点击button打开网页视图时打印。 我可以通过Facebooklogin,然后网页视图变成空白,什么也没有发生。 该应用程序显示在我的Facebook应用程序,所以一些授权已经发生,但如果我点击Web视图中的“完成”button,callback的结果是.cancelled和“用户取消login”。 被打印。

我已将Keychain Sharing添加到我的权利中,并且已更新我的info.plist:

 <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string> [ FB STRING ] </string> </array> </dict> </array> <key>FacebookAppID</key> <string>[ APP ID ]</string> <key>FacebookDisplayName</key> <string>[ APP NAME ]</string> <key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fb-messenger-api</string> <string>fbauth2</string> <string>fbshareextension</string> </array> 

我甚至改变了我的NSAppTransportSecurity设置。

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

我知道这是iOS 9 Facebooklogin模拟器的副本-canOpenURL:URL失败:“fbauth2:///” – 错误:“(null)”以及如何在iOS 10上使用Facebook iOS SDK,但没有解决scheme似乎为我工作,除非我错过了什么? 任何build议表示赞赏。

还印有几个错误:

 [App] if we're in the real pre-commit handler we can't actually add any new fences due to CA restriction [error] error: (6922) I/O error for database at /var/mobile/Containers/Data/Application/F3D8E126-B0CC-4C06-81A5-D7A7F849B3BD/Documents/OfflineModel2.sqlite. SQLite error code:6922, 'disk I/O error' 

当我的设备上没有安装FB应用程序时,我得到:

 -canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn't be completed. (OSStatus error -10814.)" 

你必须用下面的代替didfinishlaunching和openurl AppDelegate方法:

 public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) } public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return SDKApplicationDelegate.shared.application(app, open: url, options: options) } 

Swift 3Swift 4

将此添加到您的AppDelegate.swift

 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) } 

FBSDK库已被弃用。 新的库可以在Facebook的Github仓库中find 。

对于这个特定的错误,实现下面的应用程序方法。

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return SDKApplicationDelegate.shared.application(app, open: url, options: options) } 

Swift 3.0

在你的AppDelete.swift上:

 import FBSDKCoreKit import FBSDKLoginKit 

在你的:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

加:

 FBSDKApplicationDelegate .sharedInstance() .application(application, didFinishLaunchingWithOptions: launchOptions) 

然后创build一个新的func,如下所示:

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

Swift 3.0中使用Cocoapods

安装cocoapods

 pod 'FacebookCore' pod 'FacebookLogin' 

在AppDelegate.swift中

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

并loggingcallback方法

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation)return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation) } 

在你的viewController

 import FacebookCore import FacebookLogin import FBSDKLoginKit 

之后在你的fbloginbutton中写下这段代码

 @IBAction func faceBookLoginBtnAction(_ sender: Any) { let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) in if (error == nil){ let fbloginresult : FBSDKLoginManagerLoginResult = result! if fbloginresult.grantedPermissions != nil { if(fbloginresult.grantedPermissions.contains("email")) { if((FBSDKAccessToken.current()) != nil){ FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in if (error == nil){ self.dict = result as! [String : AnyObject] print(result!) print(self.dict) } }) } } } } } } 

还有一件更重要的事情就是将你的facebookid添加到你的项目中在Project> Target> Info> URL Types部分,设置正确的Facebook ID和URL Schemes。

更新为迅捷3:

//在你的AppDelegate()中:

// 步骤1:

 import FacebookCore 

//步骤-2:在didFinishLaunchingWithOptions()

  // FB Settings SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) 

//实例方法():

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { print("URL AbsoluteString = \(url.absoluteString)") if url.absoluteString.contains("fb1279300242197274") { return SDKApplicationDelegate.shared.application(app, open: url, options: options) } else { //return PDKClient.sharedInstance().handleCallbackURL(url) print("Error while open URL from app delegate facebook sign in") } return true } 

这里的答案build议使用下面的application(_,didFinishLaunchingWithOptions:)实现application(_,didFinishLaunchingWithOptions:)

 public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) } 

但是,请注意官方文档不使用返回值

 SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) 

作为application(_,didFinishLaunchingWithOptions:)的返回值application(_,didFinishLaunchingWithOptions:)

现在,虽然这可能看起来不重要,但我在将facebook SDK与分支深层链接集成时遇到了很大的问题,因为正是这一行导致了我的问题。 因此,如果以后要防止出现一些不必要的问题,请使用以下解决scheme:

 public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) // always return true return true } public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return SDKApplicationDelegate.shared.application(app, open: url, options: options) }