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 3和Swift 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) }