2 votes

Le bloc d'achèvement de la connexion Facebook n'est pas appelé

J'ai essayé d'implémenter la connexion Facebook avec un bouton de connexion personnalisé, j'ai effectué toutes les étapes de configuration et lorsque je touche le bouton, la vue web s'affiche et me demande de fournir la permission.

Cependant, si j'appuie sur Done (en haut à gauche du contrôleur de vue web), le bloc d'achèvement est appelé mais lorsque j'appuie sur Annuler ou OK, le contrôleur de la vue Web se ferme mais le bloc d'achèvement n'est jamais appelé ? enter image description here Voici le code que j'ai utilisé :

    let fbLoginManager = FBSDKLoginManager()
    fbLoginManager.loginBehavior = .Native
    fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) in
        // put a breakpoint here but it won't stop here if I tap OK
        if error != nil {
            print(error.localizedFailureReason)
        } else if result.isCancelled {
            // dismiss view
        } else {
            let token = result.token.tokenString
            // do something with the token
        }
    }

EDIT 1

Voici la méthode d'ouverture de l'url dans AppDelegate :

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    return application(app, openURL: url, sourceApplication: nil, annotation: [:])
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    if url.scheme == Key.FACEBOOK_URL_SCHEME {
        let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        return handled
    }
    let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
    if let dynamicLink = dynamicLink {
        if let url = dynamicLink.url {
            if let paths = url.pathComponents{
                if paths.count > 2 {
                    let slug = paths[2]
                    if let book = AppManager.instance.findBookBySlug(slug) {
                        // Open detail book
                        self.openDetailBook(book)
                    } else {
                        self.openDetailBookWithSlug(slug)
                    }
                }
            }
        }
    }
    if url.scheme == Key.DEEP_LINK_URL_SCHEME {
        if let paths = url.pathComponents, host = url.host {
            if host == "truyen" {
                if paths.count > 1 {
                    let slug = paths[1]
                    if let book = AppManager.instance.findBookBySlug(slug) {
                        // Open detail book
                        self.openDetailBook(book)
                    } else {
                        self.openDetailBookWithSlug(slug)
                    }
                }
            }
        }
    }
    return true
}

2voto

Mr.T Points 4344

Si vous êtes confronté à cette situation, déboguez vous-même car le SDK de Facebook est open source. La fenêtre que vous voyez est la SFSafariViewController . Lorsque vous tapez sur l'un de ces boutons, le rappel est géré par la fonction de rappel de l'appareil. SFSafariViewController . Cherchez le SFSafariViewController delegate dans le sdk de Facebook.

Mettez un point d'arrêt après avoir appelé le code de connexion, et allez étape par étape, il vous mènera à la classe qui utilise SFSafariViewController.

Dans l'un de ces delegate vous trouverez un appel à la méthode open url. Implémentez la même méthode open url dans la méthode du délégué de l'application.

Dans votre cas, le problème vient de l'utilisation d'une mauvaise méthode openURL. La méthode correcte devrait être

func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, 
     openURL: url, 
     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
     annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}

2voto

Zaid Khan Points 15

Swift 3 ,La suppression de cette méthode a fonctionné pour moi,

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

0voto

Monika Patel Points 946

Ajoutez la méthode Open url dans votre fichier AppDelegate.m et mettez un point d'arrêt dans cette méthode.

- (BOOL)application:(UIApplication *)application openURL:( NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication  annotation:annotation];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X