web-dev-qa-db-fra.com

L'application Facebook native ne s'ouvre pas avec la connexion Facebook dans iOS 9

J'ai mis à jour l'iPhone 6 plus vers iOS 9 bêta et j'essaie de procéder à la connexion à Facebook, mais à chaque fois à son formulaire de connexion UIWebView avec Facebook.

J'ai Facebook SDK

FB_IOS_SDK_VERSION_STRING @"3.24.0"
FB_IOS_SDK_TARGET_PLATFORM_VERSION @"v2.2"

Et j'utilise les méthodes suivantes pour créer une connexion Facebook

    NSArray *permissions = @[@"email",@"user_birthday",@"public_profile"];


     FBSessionStateHandler completionHandler = ^(FBSession *session, FBSessionState status, NSError *error) {
         [self sessionStateChanged:session state:status error:error];
     };

     if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) {
     // we have a cached token, so open the session
         [[FBSession activeSession]openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                                 fromViewController:nil
                                  completionHandler:completionHandler];
     } else {

     [self clearAllUserInfo];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];

     // create a new facebook session
     FBSession *fbSession = [[FBSession alloc] initWithPermissions:permissions];
     [FBSession setActiveSession:fbSession];
     [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
              fromViewController:nil
               completionHandler:completionHandler];
     }

J'ai le réglage suivant sous le fichier plist

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fbapi</string>
        <string>fbapi20130214</string>
        <string>fbapi20130410</string>
        <string>fbapi20130702</string>
        <string>fbapi20131010</string>
        <string>fbapi20131219</string>
        <string>fbapi20140410</string>
        <string>fbapi20140116</string>
        <string>fbapi20150313</string>
        <string>fbapi20150629</string>
        <string>fb-messenger-api20140430</string>
        <string>fbauth</string>
        <string>fbauth2</string>
   <array>

S'il vous plaît laissez-moi savoir ce qui me manque ici. D'abord, il vérifie iPhone device Setting-> Facebook credentials mais n'ouvrez jamais l'application Facebook pour vous connecter. On dirait qu'il ne reconnaît pas l'application Facebook installée sur l'appareil.

52
Bhumeshwer katre

Vous trouverez ci-dessous le processus complet pour la nouvelle "connexion à Facebook".


c’est ainsi que j’ai révisé mon intégration de connexion à Facebook pour la faire fonctionner sur la dernière mise à jour.

Xcode 7.x , iOS 9 , Facebook SDK 4.x

Étape 1. Téléchargez le dernier SDK Facebook (il inclut des modifications majeures).

Étape 2. Ajoutez FBSDKCoreKit.framework et FBSDKLoginKit.framework à votre projet.

Étape 3. Maintenant, allez dans Projet> Phases de construction> ajouter SafariServices.framework

Étape 4. Il y a trois modifications dans info.plist que nous devons vérifier.

4.1 Assurez-vous que vous avez ci-dessous dans votre fichier info.plist

<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string><your fb id here eg. fbxxxxxx></string>
  </array>
  </dict>
</array>
  <key>FacebookAppID</key>
  <string><your FacebookAppID></string>
  <key>FacebookDisplayName</key>
<string><Your_App_Name_Here></string>

4.2 Maintenant, ajoutez ci-dessous pour les serveurs Facebook de la liste blanche, ceci est indispensable pour iOS 9

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>facebook.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
    <key>fbcdn.net</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
    <key>akamaihd.net</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

4.3 Ajouter des schémas d'URL

<key>LSApplicationQueriesSchemes</key>
  <array>
      <string>fbapi</string>
      <string>fb-messenger-api</string>
      <string>fbauth2</string>
      <string>fbshareextension</string>
  </array>

Étape 5 Maintenant, ouvrez le fichier AppDelegate.m

5.1 Ajouter ci-dessous les instructions d'importation (supprimer l'ancienne).

#import <FBSDKLoginKit/FBSDKLoginKit.h>
 #import <FBSDKCoreKit/FBSDKCoreKit.h>

5.2 mise à jour suivant les méthodes suivantes

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

- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

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

Étape 6. Nous devons maintenant modifier notre contrôleur de connexion, où nous effectuons la tâche de connexion.

6.1 Ajouter ces importations dans Login ViewController.m

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

6.2 Bouton Ajouter un identifiant Facebook

FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;
[self.view addSubview:loginButton];

6.3 Cliquez sur le bouton Gérer la connexion

-(IBAction)facebookLogin:(id)sender
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

    if ([FBSDKAccessToken currentAccessToken])
    {
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
        [self fetchUserInfo];
    }
    else
    {
        [login logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
         {
             if (error)
             {
                 NSLog(@"Login process error");
             }
             else if (result.isCancelled)
             {
                 NSLog(@"User cancelled login");
             }
             else
             {
                 NSLog(@"Login Success");

                 if ([result.grantedPermissions containsObject:@"email"])
                 {
                     NSLog(@"result is:%@",result);
                     [self fetchUserInfo];
                 }
                 else
                 {
                     [SVProgressHUD showErrorWithStatus:@"Facebook email permission error"];

                 }
             }
         }];
    }
}

6.4 Obtenir les informations de l'utilisateur (nom, email, etc.)

-(void)fetchUserInfo
{
    if ([FBSDKAccessToken currentAccessToken])
    {
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);

        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error)
             {
                 NSLog(@"results:%@",result);

                 NSString *email = [result objectForKey:@"email"];
                 NSString *userId = [result objectForKey:@"id"];

                 if (email.length >0 )
                 {
                     //Start you app Todo
                 }
                 else
                 {
                    NSLog(@“Facebook email is not verified");
                 }
             }
             else
             {
                 NSLog(@"Error %@",error);
            }
         }];
    }
}

Étape 7. Maintenant vous pouvez construire le projet, vous devriez obtenir en dessous de l'écran.

enter image description here

J'espère que cela vous aidera les gars.

Références : Merci aux documents Facebook, aux publications Stackoverflow et à Google.

54
swiftBoy

C'est par conception. Facebook a toujours un problème avec iOS9.

Voir l'équipe Facebook qui a répondu: https://developers.facebook.com/bugs/786729821439894/?search_id Merci

33
user3492452

Finalement, j'ai changé mon Podfichier avec la version précédente du FB:
De:

pod 'FBSDKCoreKit' pod 'FBSDKLoginKit' pod 'FBSDKShareKit'
À:

pod 'FBSDKCoreKit','~>4.5.1'
pod 'FBSDKLoginKit','~>4.5.1'
pod 'FBSDKShareKit','~>4.5.1'

De mon point de vue, Facebook devrait vérifier la dernière connexion de l'utilisateur et, en fonction de celle-ci, déclencher le bon flux de connexion.

11
Mike.R

Safari View Controller est par défaut dans le SDK de Facebook. Pour ceux d'entre vous qui veulent revenir à l'expérience précédente, voir ci-dessous. Cela ne fonctionne que pour le SDK 3.x, cela ne fonctionnera pas avec la version 4.x.

Si vous souhaitez que le SDK v3.x (testé sur v3.24.1) fonctionne comme avant (sans ouvrir Safari View Controller et laisser le commutateur d'application à la place), appelez ce code quelque part au début de l'application, par exemple. didFinishLaunchingWithOptions:

SEL useSafariSel = sel_getUid("useSafariViewControllerForDialogName:");
SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:");
Class FBDialogConfigClass = NSClassFromString(@"FBDialogConfig");

Method useSafariMethod = class_getClassMethod(FBDialogConfigClass, useSafariSel);
Method useNativeMethod = class_getClassMethod(FBDialogConfigClass, useNativeSel);

IMP returnNO = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
    return NO;
});
method_setImplementation(useSafariMethod, returnNO);

IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
    return YES;
});
method_setImplementation(useNativeMethod, returnYES);

Il balaye deux méthodes de FBDialogConfig.

N'oubliez pas d'importer l'en-tête objc/runtime.h:

#import <objc/runtime.h>

@ SimonCross, certaines personnes ne veulent tout simplement pas comprendre que Safari View Controller fournit la meilleure expérience utilisateur - elles pensent ou savent avec certitude que leurs utilisateurs ne sont pas connectés à Facebook dans Safari, mais à coup sûr connectés dans l'application Facebook

4
Andrei Radulescu

@dan a raison. Afin de fournir la meilleure expérience possible aux utilisateurs d’iOS 9, le nouveau SDK détermine automatiquement le meilleur flux de connexion. Si vous utilisez iOS 8 ou une version antérieure, le commutateur d'application sera toujours préféré.

4
Chris Pan

Après avoir défini toutes les clés .plist nécessaires mentionnées dans cette colonne, j’ai utilisé la solution suivante pour résoudre le problème de connexion.

var fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web

Pour qu'il se connecte toujours avec dans l'application.

3
user5503563

Avec la version iOS 9, Apple a introduit des changements importants dans le changement d’application. Cela a affecté les applications iOS 9 intégrées à Facebook. La plupart des gens le remarqueront dans leur expérience d’utilisation de la connexion Facebook. Dans les applications qui utiliser le dernier SDK (v4.6 et v3.24), nous allons afficher un flux à l'aide de Safari View Controller (SVC) au lieu de la commutation rapide d'application (FAS) en raison d'interstitiels de dialogue supplémentaires qui ajoutent des étapes supplémentaires au processus de connexion FAS sur iOS 9. De plus, les données que nous avons vues de plus de 250 applications indiquent qu'il s'agit de la meilleure expérience à long terme pour les utilisateurs. Veuillez lire la suite pour plus de détails. https: //developers.facebook. com/blog/post/2015/10/29/Facebook-Login-iOS9

2

Facebook a modifié le comportement de connexion de Facebook pour iOS9.

Voici la citation de blog Facebook :

Depuis le lancement d’iOS 9, nous surveillons les données et les CTR de plus de 250 applications au cours des six dernières semaines. Le taux de clics (CTR) de la connexion SVC est supérieur à celui de la connexion app-switch et a été multiplié par trois par rapport à celui de l'application app-switch. Cela indique que l'expérience SVC est meilleure pour les personnes et les développeurs d'aujourd'hui et sera probablement la meilleure solution à long terme. Pour cette raison, le dernier SDK Facebook pour iOS utilise SVC comme expérience par défaut pour la connexion.

2
Haroun SMIDA

Je sais que c'est vieux. Mais vous pouvez mettre ce code sur votre application:(UIApplication *)application didFinishLaunchingWithOptions:

SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:");
Class FBSDKServerConfiguration = NSClassFromString(@"FBSDKServerConfiguration");


Method useNativeMethod = class_getInstanceMethod(FBSDKServerConfiguration, useNativeSel);

IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
    return YES;
});
method_setImplementation(useNativeMethod, returnYES);

Et FacebookSDK se connectera via une application native lorsqu’une application est installée à la place du navigateur.

1
vien vu

Cela a fonctionné pour moi. Ajoutez ceci à votre .plist.

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fb</string>
    </array>

Pour iOS9, nous devons ajouter une clé à notre .plist pour les schémas d'URL.

1
Sushil Sharma

Mettre celui-ci dans appdelegate a résolu mon problème

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])
    }
0
Chanchal Raj