2016-02-04 22 views
8

Ho riscontrato un problema con l'utilizzo di Facebook SDK (4.9.1) che si apre nel browser dell'app per l'accesso se nessun account di sistema è presente.Accesso non funzionante/bloccato con l'ultimo SDK di Facebook

Il login dall'account Facebook di sistema funziona correttamente. Sto usando il seguente codice

FBSDKLoginManager *manager = [[FBSDKLoginManager alloc] init]; 
    manager.loginBehavior = FBSDKLoginBehaviorSystemAccount; 
    [manager logInWithReadPermissions:@[@"public_profile",@"email",@"user_friends"] fromViewController:controller handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
      if (error) { 
       success(kFacebookStatusFailed); 
      } else if (result.isCancelled) { 
       success(kFacebookStatusCancelled); 
      } else { 
       success(kFacebookStatusSuccess); 
      } 
}]; 

ho fatto correttamente tutte le impostazioni Info.plist richieste definite here.

Il problema si verifica quando si effettua l'accesso utilizzando il browser inapp, utilizzando in realtà SafariViewController trovato tramite debug. Si passa attraverso tutto il processo di login, ma alla fine è stucks in uno schermo bianco in bianco e non respingere, vedi immagine sotto

enter image description here

Hanno provato tutte le misure possibili, ma non in grado di ottenere su di esso. Ma quando ho installato un nuovo progetto che non aveva niente solo il codice di login e le impostazioni corrette, tutto funzionava bene.

L'unica differenza nel Progetto fresco e originale progetto è il numero di diversi sistemi utilizzati in app, come Crashlytics, tessuto, Instabug, Google Frameworks ecc v'è alcuna ragione che avrei dovuto sospetto che questo quadro che sta causando problemi, penso NO. Quindi, quale potrebbe essere il problema, chiunque abbia affrontato lo stesso problema e possa aiutarmi sarà molto apprezzato.

Grazie.

+0

In qualche modo ha funzionato? Ho lo stesso problema ... –

+0

@ MariusKažemėkaitis Nessun compagno non siamo riusciti a risolverlo ancora .. Sembra che ci sia qualche impostazione che ci manca, perché non funziona in un'applicazione specifica, ma non siamo riusciti a capire cosa .. – iphonic

risposta

5

Avevo lo stesso problema. Aggiungi questo al vostro AppDelegate:

In AppDelegate.m

  1. In application:didFinishLaunchingWithOptions:

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
        [[FBSDKApplicationDelegate sharedInstance] application:application 
             didFinishLaunchingWithOptions:launchOptions]; 
    } 
    
  2. Aggiungere il seguente metodo per il vostro AppDelegate.m:

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

non so se i SafariViewController controlli per la application:openURL:sourceApplication:annotation, ma questo ha funzionato per me. Fai un tentativo. Spero che funzioni per te.

Fonte: https://developers.facebook.com/docs/ios/getting-started

+0

È necessaria questa importazione> #import . E ho anche dimenticato di inserire il ritorno YES all'interno di didFinishLaunchingWithOptions (ma questo è implicito: P) – Axort

2

Sì, c'è un problema con il collegamento .È possibile provare come questo

-(IBAction)fbAction:(id)sender 

{ 

    FBSDKLoginManager *manager = [[FBSDKLoginManager alloc] init]; 
    manager.loginBehavior=FBSDKLoginBehaviorWeb; 

    if ([FBSDKAccessToken currentAccessToken]) 
    { 
     [manager logOut]; 
     NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]); 

     [self fetchUserInfo]; 
    } 
    else 
    { 
     [manager 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]; 

       } 
      } 
     }]; 
    } 

} 

-(void)fetchUserInfo 

{ 

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

      [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}] 
      //[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, first_name, last_name, picture.type(large), 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) 
        { 

         NSLog(@"email %@,userid %@",email,userId); 
        } 
        else 
        { 
         NSLog(@"Facebook email is not verified"); 
        } 
       } 
       else 
       { 
        NSLog(@"Error %@",error); 
       } 
      }]; 
     } 

} 
+0

Cosa c'è di diverso nel tuo codice? – iphonic

+0

Il login si aprirà in popup. –

+0

Modifica del comportamento di login di FBSDKLoginManager su FBSDKLoginBehaviorWeb ha funzionato per me. C'era qualcosa di rotto con il nuovo metodo predefinito basato su SFSafariViewController. – arton

0

Per quanto mi riguarda, ho avuto la Branch SDK installato ei miei openURL: app metodi delegato erano in disordine.

- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary <NSString *, id> *)options 

era sola apertura Branch collegamenti, mentre

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

stava aprendo entrambi Facebook e Branch collegamenti.

Verificare che la logica in entrambi i metodi (iOS9 e < = iOS8) sia impostata correttamente.

0

Mi dispiace non "parlare" obiettivo C, ma si deve ignorare OpenUrl. Ecco C#:

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation) 
    { 
     // Facebook - We need to handle URLs by passing them to their own OpenUrl in order to make the SSO authentication works. 
     return ApplicationDelegate.SharedInstance.OpenUrl(application, url, sourceApplication, annotation); 
    }