2017-06-21 2 views
0

J'essaye d'ajouter la connexion avec facebook dans l'application iOS écrite en swift. Le problème ici est que lorsque je remplis le processus de connexion dans SSFSafariViewController et que je clique sur Terminé, cela ouvre de nouveau la boîte de dialogue de connexion dans SSFSafariViewController et continue de le faire pour toujours.Swift iOS Facebook SDK boucle sur la connexion avec safari view controller

voici mon code:

// Loads user data if he is logged in, othewise asks him to login 
static func login(ViewController controller: UIViewController) -> Bool { 
    // If user has logged in before: dont ask him to login again 
    // use previus login data 
    if(AccessToken.current != nil){ 
     // Load user data 
     create(); 
     return true; 
    } 
    // If user is'nt logged in: ask him to login 
    else { 
     var result: Bool = false; 
     let loginManager = LoginManager() 
     loginManager.logIn([ .publicProfile, .userFriends, .email], viewController: controller) { loginResult in 
      switch loginResult { 
      case .failed(let error): 
       print(error) 
       result = false; 
      case .cancelled: 
       result = false; 
      case .success(_, _, _): 
       result = true; 
      } 
     } 

     // If user has logged in: laod his data 
     if(result){ 
      create(); 
     } 

     return result; 
    } 
} 
+0

Comment appelez-vous cette fonction? pouvez-vous mettre à jour dans votre question? –

+0

à partir d'un viewcontroller dans viewDidAppear, cette fonction est dans une autre classe destinée à gérer la connexion –

Répondre

0

J'ai résolu mon problème, On dirait que c'était un problème avec le délégué où SSFSafariViewController présenté par Facebook SDK ne rappelait pas! et le SDK n'a jamais obtenu le résultat du SSFSafariViewController alors il essayait de résoudre le problème en reprenant la vue de connexion SSFSafariViewController et ce qui a enveloppé la boucle encore et encore.

donc la solution était d'ajouter cette fonction à AppDelegate:

@available(iOS 9.0, *) 
func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool { 
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: UIApplicationOpenURLOptionsKey.sourceApplication.rawValue, annotation: UIApplicationOpenURLOptionsKey.annotation); 
} 

alors tout fonctionne sur!

0

Essayez ceci:

Vous pouvez retourner la valeur alors que vous avez utilisé la fermeture dans la méthode. de sorte que vous devez créer la fonction de fermeture comme ci-dessous:

Note: vous devez résoudre l'erreur de support

func login(ViewController controller: UIViewController, callback: (_ isResult: Bool) -> Void) -> Void { 
     if(AccessToken.current != nil){ 
     // Load user data 
      callback(true) 
    } 
    // If user is'nt logged in: ask him to login 
    else { 
     var result: Bool = false; 
     let loginManager = LoginManager() 
     loginManager.logIn([ .publicProfile, .userFriends, .email], viewController: controller) { loginResult in 
      switch loginResult { 
      case .failed(let error): 
       print(error) 
       callback(false) 
      case .cancelled: 
       callback(false) 
      case .success(_, _, _): 
       callback(true) 
      } 
     } 
    } 

Appel de la méthode

self.login(ViewController: self) { (isResult) in 
      // isResult your boolean 
      if(isResult){ 
      create(); 
     } 
     } 
+0

merci, votre réponse m'a vraiment aidé à contrôler le flux de mon application! mais ce n'était pas la solution pour la boucle sans fin de 'SSFSafariViewController' présentée par facebook. J'ai posté la solution, mais après tout j'ai remplacé ma version par la vôtre. merci beaucoup –

+0

et vérifiez le schéma de l'URL pour ce problème. – KKRocks

+0

Lorsque j'ai commencé à utiliser votre version, j'ai remarqué que certaines valeurs qui étaient destinées à créer une fonction interne étaient nulles dans le bloc d'achèvement de la fonction de connexion lorsque je l'appelle dans viewDidLoad et seulement dans viewDidLoad. avez-vous une idée? –