2016-02-04 26 views
8

Mam problem z korzystaniem z pakietu Facebook SDK (4.9.1), który otwiera się w przeglądarce aplikacji w celu zalogowania się, jeśli nie ma konta systemowego.Logowanie nie działa/zatrzymane przy użyciu najnowszego zestawu SDK Facebook

Logowanie z systemu Konto na Facebooku działa dobrze. Używam następujący kod

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); 
      } 
}]; 

mam poprawnie wykonane wszystkie wymagane ustawienia Info.plist zdefiniowane here.

Problem polega na tym, że loguje się przy użyciu przeglądarki InPatch, w rzeczywistości używając SafariViewController znalezionego przez debugowanie. Rozumie się samo przez cały proces logowania, ale w końcu to stucks w białym pustym ekranie i nie odwołuje, patrz zrzut ekranu poniżej

enter image description here

Próbowałem wszystkie możliwe kroki, ale nie jest w stanie dostać się nad nim. Ale kiedy przygotowałem nowy projekt, który nie zawierał nic powyżej powyższego kodu logowania i odpowiednich ustawień, wszystko działało dobrze.

Jedyną różnicą w świeżym Project i oryginalny projekt jest wiele różnych struktur wykorzystywanych w aplikacji, jak Crashlytics, Fabric, Instabug, Google Ram itp Czy jest jakiś powód, że powinienem podejrzewam, że te ramy powodują problem, myślę, że NIE. Więc, co może być problemem, każdy, kto stanął w obliczu tego samego problemu i może mi pomóc, zostanie bardzo doceniony.

Dziękuję.

+0

Czy to jakoś zadziałało? Mam ten sam problem ... –

+0

@ MariusKažemėkaitis Brak partnera, którego jeszcze nie mogliśmy rozwiązać .. Wygląda na to, że brakuje jakiegoś ustawienia, ponieważ nie działa w konkretnej aplikacji, ale nie mogliśmy zrozumieć, co .. – iphonic

Odpowiedz

5

Miałem ten sam problem. Dodaj to do swojej AppDelegate:

W AppDelegate.m

  1. W application:didFinishLaunchingWithOptions:

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
        [[FBSDKApplicationDelegate sharedInstance] application:application 
             didFinishLaunchingWithOptions:launchOptions]; 
    } 
    
  2. Dodaj następującą metodę do 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]; 
    } 
    

Nie wiem, czy SafariViewController czeki dla application:openURL:sourceApplication:annotation ale ten pracował dla mnie. Spróbuj. Mam nadzieję, że to zadziała dla ciebie.

Źródło: https://developers.facebook.com/docs/ios/getting-started

+0

Potrzebujesz tego importu> #import . A także zapomniałem zwrócić TAK wewnątrz didFinishLaunchingWithOptions (ale to jest dorozumiane: P) – Axort

2

Tak Wystąpił problem przy logowaniu Ty możesz spróbować jak to

-(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

Czym różni się twój kod? – iphonic

+0

Logowanie zostanie otwarte w pop-up. –

+0

Zmiana hasła FBSDKLoginManager loginBehavior na FBSDKLoginBehaviorWeb dla mnie. Z nową domyślną metodą opartą na SFSafariViewController coś poszło. – arton

0

dla mnie, miałem Branch SDK instalowane i moje metody delegata openURL: aplikacji zostały pomieszane.

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

było otwierane tylko Branch linki, a

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

otwierał zarówno Facebook i Branch linki.

Sprawdź, czy logika w obu metodach (iOS9 i < = iOS8) jest poprawnie skonfigurowana.

0

Niestety ja nie "mówić" cel C, ale trzeba zastąpić OpenURL. Tutaj jest 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); 
    } 
Powiązane problemy