web-dev-qa-db-fra.com

La connexion au SDK de Facebook ne rappelle jamais mon application sur iOS 9

J'ai suivi le guide this pour mettre à jour mon application afin qu'elle utilise le kit de développement logiciel Facebook 4.6 afin de fonctionner correctement lorsqu'elle est construite avec le kit de développement iOS 9.

Lorsque j'appuie sur le bouton de connexion maintenant, un contrôleur de vue Safari est présenté (ne devrait-il pas être redirigé vers l'application Facebook?), Mais après avoir accepté l'autorisation, le contrôleur de vue Safari n'est jamais renvoyé. Il charge une nouvelle page vierge et reste assis à ne rien faire. Si je tape sur le bouton Terminé, le FBSDKLoginManagerLoginResult retourné isCancelled est vrai.

Est-il normal que le SDK choisisse le contrôleur de vue Safari plutôt que l'application Facebook? Et pourquoi je ne reçois pas de rappel une fois la connexion établie?

65
Hesham Abd-Elmegid

Il s'avère que sur iOS 9 lorsque UIApplicationDelegate's application:openURL:options: est implémenté, application:openURL:sourceApplication:annotation: ne sera pas appelé.

Donc, ce que je devais faire, c'est appeler FBSDKApplicationDelegate's application:openURL:sourceApplication:annotation: de UIApplicationDelegate de application:openURL:options:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {
    return [[FBSDKApplicationDelegate sharedInstance] application:app
                                                      openURL:url
                                            sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                   annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
132
Hesham Abd-Elmegid

Pour Swift cela fonctionnait pour moi (ajoutez-le dans AppDelegate.Swift):

@available(iOS 9.0, *)
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])
}

et

@available(iOS, introduced=8.0, deprecated=9.0)
func application(application: UIApplication,openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {  
return FBSDKApplicationDelegate.sharedInstance().application(application,
     openURL: url,
     sourceApplication: sourceApplication!,
     annotation: annotation)
}

Dans chaque cas, n'oubliez pas d'ajouter import FBSDKCoreKit avec les autres import déclarations.

C'est essentiellement ce que Google SignIn utilise. Si cela ne fonctionne toujours pas, vous devez définir les délégués et votre info.plist comme indiqué dans les documents FaceBook. J'espère que ça aide!

32
David

Pour Swift 3 & Facebook SDK 4.16.0:

Ajoutez le code suivant à AppDelegate.Swift

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
15
Johnny Tsoi

Pour ceux d'entre vous rencontrant le même problème avec iOS10, j'ai ajouté ceci:

@available(iOS 9.0, *)
func application(_ application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

Cela devrait fonctionner, mais pour l’instant, c’est juste une solution de contournement.

5
CommittedEel

Je viens de rencontrer ce problème, merci @Hesham pour le correctif.

Voici le correctif Swift3:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(
        app,
        open: url,
        sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
        annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
3
RichAppz

pour les utilisateurs de xamarin:

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {

            OnUrlProtocolDetected(url.ToString());
            if (url.AbsoluteString.StartsWith("fb"))
            {
                return ApplicationDelegate.SharedInstance.OpenUrl(application, url, sourceApplication, annotation);
            }

}
3
Abdullah Tahan

Pour les débutants Swift comme moi), le problème était une autre implémentation de la méthode application ():

Version de travail:

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

Version non fonctionnelle (copiée quelque part)

func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(
        application,
        open: url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}
1
victor

Avez-vous suivi ces étapes?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 return [[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
}

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

Je pense que vous manquez le moment où vous devez appeler le délégué aux applications dans App delegate. La seconde méthode est vitale car elle rappelle à votre application le login que l'utilisateur a fini en safari par l'utilisateur

1
Saheb Roy

J'utilisais la version ancienne version 3.24 et sur iOS 9, Je rencontrais un problème similaire.

Trouvé que dans appDelegate méthode - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

était

return [FBSession.activeSession handleOpenURL:url];

au lieu de

return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];

1
Jakub Truhlář