web-dev-qa-db-fra.com

La connexion Facebook revient toujours annulée. (iOS Swift)

J'essaie actuellement de mettre en œuvre la connexion à Facebook avec la version 4.0 du SDK. Cela se produit également avec la version 3. +. Lorsque j'appelle logInWithReadPermissions (version 4.0) ou openActiveSessionWithReadPermissions (version 3. +). La fermeture/le bloc est appelé immédiatement avec isCancelled (version 4.0) et ClosedFailedLogin (version 3. +) avant que l'utilisateur puisse effectuer une sélection ( annuler ou ok ). Je pensais que cela pouvait être un problème avec le schéma d'URL dans mes paramètres de pliste, mais je l'ai vérifié encore et encore et tout semble être correct. Je me demandais simplement si quelqu'un pouvait avoir des idées pour résoudre ce problème. Mon identifiant de paquet est correct, la connexion unique est activée, l'application native est activée dans la console de développement de Facebook. Voir des exemples de code et de configurations ci-dessous (version 4.0).

Login Call: Login Call

AppDélégué: AppDelegate

Pliste: Plist

18
Earl Ferguson

J'ai eu quelques problèmes mais j'ai trouvé une solution de contournement. Vous pouvez configurer le comportement de connexion du gestionnaire de connexion pour utiliser les informations de Facebook sur le téléphone. Le comportement par défaut est FBSDKLoginBehaviorSystemNative et essaie d'utiliser l'application Facebook en premier. S'il n'y est pas présent, il utilise un modal Web.

Au lieu de procéder ainsi et de contourner les URL qui ne semblent pas fonctionner, vous pouvez définir le comportement de connexion comme suit: FBSDKLoginBehaviorSystemAccount

Longue histoire courte, essayez:

let fbLoginManager = FBSDLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here
8
SasukeIsCool

Avec le Kit de développement logiciel (SDK) Facebook version 4, je n'avais qu'à l'ajouter à mon délégué d'application sur iOS 10 et Swift 3 pour que l'authentification fonctionne. Avant cela, je n'avais que des connexions annulées.

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
13
Philipp Otto

J'ai la même méthode de connexion problème toujours retourner canacelled alors j'ajoute des choses ci-dessous dans info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>akamaihd.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>facebook.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>fbcdn.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

et dans AppDelegate update didFinishLaunching et ajoutez une nouvelle méthode comme ci-dessous

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

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

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

La méthode de connexion est donnée ci-dessous: 

@objc func loginButtonClicked() {
    let  loginManager = LoginManager()
    loginManager.loginBehavior = .systemAccount
    loginManager.logIn([ .publicProfile,.userFriends,.email ], viewController: self) { loginResult in
        switch loginResult {
        case .failed(let error):
            print(error)
        case .cancelled:
            print("User cancelled login.")
        case .success(let grantedPermissions, let declinedPermissions, let accessToken):
            print("Logged in!")
            //Do further code...
        }
    }
}

cela fonctionne pour moi dans Swift 3.0 et SDK 4.17.0 , j'espère que cela fonctionnera pour vous Merci.

6
Maishi Wadhuwani

Avez-vous ajouté une fonction à AppDelegate?

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
5
Ivan

J'ai aussi ce problème. Il s'est avéré que l'identifiant de l'ensemble d'applications (dans la configuration du projet) ne correspond pas à l'identifiant d'ensemble de l'application configuré dans le tableau de bord de l'application facebook. Après avoir corrigé l'identifiant du bundle, la connexion a bien fonctionné. 

J'espère que ça aide quelqu'un.

3
Med Hajlaoui

J'ai eu un problème très similaire lors de l'ajout de LoginButton dans mon application en suivant ce tutoriel → https://developers.facebook.com/docs/Swift/login .

Après avoir cliqué sur le bouton Facebook Connect et terminé l'autorisation, il revient toujours avec le statut 'annulé'. J'ai essayé de nombreuses solutions et j'ai finalement réussi à ce qui suit:

Dans AppDelegate.Swift , ajoutez les 2 fonctions suivantes:

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

func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(application, open: url, options: options)
}
3
Kai-jie Ke

J'ai trouvé que la méthode AppDelegate incorrecte était appelée. Il appelait

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

au lieu de 

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {...

J'ai donc dû ajouter ceci à la première méthode AppDelegate (celle qui était appelée):

return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: "com.Apple.mobilesafari", annotation: nil)

Notez que je devais passer explicitement l’ID du bundle Safari, sinon le délégué du compte FB aurait isCancelled = true

2
johnnyclem

J'ai également été confronté à ce problème depuis un mois. J'intégrais Facebook Login avec Firebase dans ios 10 Swift 3. Enfin, je suis en mesure de le mettre en œuvre avec succès. Je l'ai corrigé en apportant les modifications suivantes au fichier AppDelegate.

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

        FIRApp.configure()
        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
          return true
    }


    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
        -> Bool {
            var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,  open: url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
            return shouldOpen
    }

    // for iOS below 9.0
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,open: url as URL!,sourceApplication: sourceApplication,annotation: annotation)
        return shouldOpen
    }

J'espère que cela pourrait aider les autres 

testé sur l'émulateur ios 10.2, iPhone 6 Plus fonctionnant avec 10.2

1
twister_void

Mon problème a été causé par ma présentation modale d’un contrôleur de vue de chargement, qui m’a été renvoyé lorsque la vue a disparu. Étant donné que FBSDK appelle la méthode viewWillDisappear lors de la transition vers Safari ou l'application, il fermait la vue et l'écran de connexion au FB. La même chose peut arriver si vous présentez la connexion via un UIAlertController.

1
Zach

Dans mon cas, en utilisant React-Native, FacebookSDK et Deeplink ensemble, je n'ai besoin que d'un seul openUrl dans AppDelegate.m. Des explications plus détaillées se trouvent dans https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project

0
Phan Hai Quang

J'ai eu le même problème. Ne mélangez pas FBSDKApplicationDelegate et SDKApplicationDelegate

Résolu avec le prochain code Swift 4 dans AppDelegate:

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

    SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    return true
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let appId = SDKSettings.appId
    if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.Host == "authorize" { // facebook
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    }
    return false
}
0
Nadzeya