Facebook SDK se connecter avec Swift 3 iOS 10

J'ai installé le SDK Swift de Facebook via Cocoapods:

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

J'ai suivi les instructions de connection du SDK de Facebook ( https://developers.facebook.com/docs/swift/login ) mais je n'arrive pas à le faire fonctionner.

À l'intérieur de mon controller de vue, j'ai ce qui suit:

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

"Gestionnaire de connection: etc." imprime lorsque je clique sur le button et la vue Web s'ouvre. Je peux me connecter via Facebook, puis la vue Web devient vide et rien ne se passe. L'application apparaît dans mes applications Facebook, donc une certaine autorisation a eu lieu, mais si je clique sur le button "Terminé" dans la vue Web, le résultat du callback est .cancelled et "login user annulée". est imprimé.

J'ai ajouté Keychain Sharing à mes droits, et j'ai mis à jour mon info.plist:

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

J'ai même changé mes parameters NSAppTransportSecurity .

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

Je sais que c'est un duplicata de iOS 9 Facebook simulateur de connection -canOpenURL: échoué pour l'URL: "fbauth2: ///" – erreur: "(null)" et Comment utiliser Facebook iOS SDK sur iOS 10 mais aucune des solutions là semble fonctionner pour moi, à less que j'ai raté quelque chose? Toutes les suggestions sont appréciées.

Plusieurs erreurs sont également imprimées:

 [App] if we're in the real pre-commit handler we can't actually add any new fences due to CA ressortingction [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' 

Et quand je n'ai pas l'application FB installée sur mon appareil, j'ai:

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

Vous devez replace les methods didfinishlaunching et openurl AppDelegate par:

 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 et Swift 4

ajoutez ceci à votre 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) } 

Les bibliothèques FBSDK sont obsolètes. Les bibliothèques les plus récentes peuvent être trouvées dans le repository Github de Facebook .

Pour cette erreur particulière, implémentez les methods d'application suivantes.

 func application(_ application: UIApplication, open url: URL, sourceApplication: Ssortingng?, 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

sur votre AppDelete.swift:

 import FBSDKCoreKit import FBSDKLoginKit 

à l'intérieur de votre:

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

append:

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

puis créez une nouvelle fonction comme suit:

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

Utilisation de Cocoapods dans Swift 3.0

Installer des cocoapodes

 pod 'FacebookCore' pod 'FacebookLogin' 

dans AppDelegate.swift

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

et méthode de callback writedown

 func application(_ application: UIApplication, open url: URL, sourceApplication: Ssortingng?, 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) } 

dans votre vueController

 import FacebookCore import FacebookLogin import FBSDKLoginKit 

après cela dans votre button fblogin écrivez ce code

 @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! [Ssortingng : AnyObject] print(result!) print(self.dict) } }) } } } } } } 

et une chose plus importante ajoutez votre facebookid dans votre projet Dans la section Projet> Cible> Info> Types d'URL, définissez l'ID Facebook approprié et les schémas d'URL.

mis à jour pour swift 3:

// Dans votre AppDelegate ():

// Étape 1:

 import FacebookCore 

// Étape – 2: Dans didFinishLaunchingWithOptions ()

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

// Méthode d'instance ():

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { print("URL AbsoluteSsortingng = \(url.absoluteSsortingng)") if url.absoluteSsortingng.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 } 

Les réponses recommandnt ici d'utiliser l'implémentation suivante de l' application(_,didFinishLaunchingWithOptions:) :

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

Cependant, notez que la documentation officielle n'utilise pas la valeur de return de

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

comme valeur de return de l' application(_,didFinishLaunchingWithOptions:) .

Maintenant, même si cela peut sembler sans importance, j'ai eu de gros problèmes lors de l'intégration de Facebook SDK avec twigment en profondeur de la twig, parce que cette ligne me cause des problèmes. Par conséquent, si vous souhaitez éviter des problèmes inutiles plus tard, utilisez la solution suivante:

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