2017-06-21 61 views
0

我想添加Facebook登錄在iOS應用程序寫入迅速。Swift iOS Facebook SDK循環與Safari瀏覽器視圖控制器登錄

這裏的問題是,當我在SSFSafariViewController中填寫登錄過程並單擊完成後,它將重新打開SSFSafariViewController中的登錄對話框,並一直保持這種狀態。

這裏是我的代碼:

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

你是怎麼調用這個函數的?你能更新你的問題嗎? –

+0

from viewcontroller in viewDidAppear,這個函數是在另一個類中,用來處理登錄 –

回答

0

我已經解決了我的問題,看起來像是代表問題,其中Facebook SDK提供的SSFSafariViewController未被回叫!和SDK從來沒有得到SSFSafariViewController的結果,因此它試圖通過重新呈現登錄視圖SSFSafariViewController和什麼是一遍又一遍循環的循環來解決問題。

因此該解決方案是這一功能添加到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); 
} 

然後每一件事情的作品了!

0

試試這個:

,而你使用的方法內關閉您可以返回值。所以你需要與封閉物,下面創建功能:

注意:您需要解決支架錯誤

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

調用方法

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

謝謝,你的回答真的幫我控制了我的app的流程!但它不是Facebook提供的無限循環'SSFSafariViewController'的解決方案。我已經發布瞭解決方案,但畢竟我用你的版本替換了我的版本。非常感謝 –

+0

並檢查此問題的網址方案。 – KKRocks

+0

當我開始使用你的版本時,我注意到一些值,當打算在viewDidLoad裏面調用它時,我在裏面函數中創建了哪裏nil在登錄函數的完成塊中,只有在viewDidLoad裏面。你有什麼主意嗎? –

相關問題