web-dev-qa-db-fra.com

Se connecter à Facebook SDK 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 connexion du kit de développement logiciel Swift SDK de Facebook ( https://developers.facebook.com/docs/Swift/login ), mais je ne parviens pas à le faire fonctionner.

Dans mon contrôleur de vue, j'ai les éléments suivants:

@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 connexion: etc." s'imprime lorsque je clique sur le bouton et que la vue Web s'ouvre. Je peux me connecter via Facebook. La vue Web devient alors vide et rien ne se passe. L'application apparaît dans mes applications Facebook. Une autorisation a donc été émise. Si je clique sur le bouton "Terminé" dans la vue Web, le résultat du rappel est .cancelled et "Connexion annulée de l'utilisateur". est imprimé.

J'ai ajouté le partage de trousseau à mes droits et j'ai mis à jour mon 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>

J'ai même modifié mes paramètres NSAppTransportSecurity.

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

Je sais que ceci est un duplicata de Simulateur de connexion Facebook pour iOS 9 -canOpenURL: échec de l'URL: "fbauth2: ///" - erreur: "(null)" et Comment utiliser le kit de développement logiciel (SDK) Facebook iOS sur iOS 10 mais aucune des solutions ne semble fonctionner pour moi, à moins d’avoir oublié 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 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'

Et lorsque l'application FB n'est pas installée sur mon appareil, je reçois:

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

Vous devez substituer les méthodes AppDelegate par didfinishlaunching et openurl par ci-dessous:

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

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)
}
19
Pan Mluvčí

Les bibliothèques FBSDK sont obsolètes. Les bibliothèques les plus récentes se trouvent dans le référentiel Github de Facebook .

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

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)

}
9
Thomas Oropeza

Swift 3.0

sur votre AppDelete.Swift:

import FBSDKCoreKit
import FBSDKLoginKit

dans votre:

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

ajouter: 

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)
}
5
David Sanford

Utilisation de Cocoapods in 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 callback méthode de callback

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

dans votre vueController 

import FacebookCore
import FacebookLogin
import FBSDKLoginKit

après cela dans votre bouton 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! [String : AnyObject]
                                print(result!)
                                print(self.dict)
                            }
                        })
                    }   
                }
            }
        }
    }
}

et une autre chose importante: ajoutez votre facebookid à votre projet. Dans la section Projet> Cible> Info> Types d’URL, définissez le bon identifiant Facebook et les schémas d’URL.

2
User558

La première chose que vous devez créer une application pour utiliser la connexion Facebook dans votre application. Vous pouvez créer une application sur facebook à partir de ici

Vous devez définir URL types, FacebookAppID, FacebookDisplayName et LSApplicationQueriesSchemes dans votre info.plist.

  1. Ajoutez manuellement le cadre de connexion Facebook ou utilisez les cabosses de cacao comme suit ...

     pod 'FacebookCore' //latest one
     pod 'FacebookLogin' // for fb login
     pod 'FacebookShare' //for sharing on fb
    

    puis la commande pod install pour installer les modules pour votre application.

  2. import FacebookCore dans votre application déléguer à utiliser la connexion Facebook

  3. Configurez les éléments suivants dans le fichier AppDelegate.Swift:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
      return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    
       if url.absoluteString.contains(<Your FBAppID>) {
          return SDKApplicationDelegate.shared.application(app, open: url, options: options)
        } else {
           debugPrint("Error in openURL from AppDelegate Facebook Sign in")
        }
    
        return true
    
     }
    

Et maintenant, vous avez configuré avec succès la connexion Facebook à votre application.

Dans votre contrôleur de vue, vous devez effectuer les opérations suivantes:

import FacebookLoginKit

Dans votre méthode IBAction, procédez comme suit:

@IBAction func btnFacebookSignInTapped(_ sender: UIButton) {

    let fbManager = FBSDKLoginManager()
    fbManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (result, error) in

        if let loginResult = result, error == nil {

            if let permissions = loginResult.grantedPermissions {

                if permissions.contains("email") || permissions.contains("public_profile")  {

                    if FBSDKAccessToken.current() != nil {

                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, graphResult, error) in

                            if error == nil {
                                debugPrint("Result: \(graphResult!)")
                                if let data = graphResult as? [String: Any] {
                                    print("User details from FB: \(data)")
                                }
                            }
                        })

                    } else {
                        print("Invalid FB access token");
                    }
                }

            } else {
                print("Fail to login using facebook.")
            }

        } else {
            print("Error in facebook login")
        }
    }
}

Ce faisant, vous pourrez vous connecter à Facebook.

1
Mahendra GP

Les réponses recommandées ici utilisent l’implémentation suivante de 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 retour de 

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

comme valeur de retour de application(_,didFinishLaunchingWithOptions:).

Bien que cela puisse sembler sans importance, j’ai eu de gros problèmes lors de l’intégration du SDK de Facebook avec une liaison en profondeur, car cette ligne me cause des problèmes. Par conséquent, si vous souhaitez éviter ultérieurement certains problèmes inutiles, 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)
}
0
Milan Nosáľ

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 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
}
0
Kiran jadhav

Autre moyen de le faire . J'espère que cette vidéo vous sera utile https://youtu.be/bOS4jqRc8Io

Contenu de cette vidéo: Didacticiel d'intégration du kit de développement logiciel (SDK) Facebook avec Swift en 2018 Configuration d'un nouveau projet Xcode pour Xcode Connexion de l'application Swift iOS avec le didacticiel Facebook Fonction de connexion Facebook dans l'application iOS Ajouter Facebook à l'application Swift iOS Connexion Facebook dans l'application iOS

Étapes: 1. Créez un nouveau projet Swift Xcode simple. 2- Connectez-vous à la page de développement de Facebook pour créer le même nom. APP 3- Ajoutez une connexion avec le bouton Facebook, les méthodes de connexion et de déconnexion. 4- Modifiez la configuration, créez un en-tête de pontage pour C, configurez AppDelegate. , 5- Lancer l'application et tester avec simulateur

0
David Ta