2017-02-16 21 views
0

В принципе, у меня есть один класс под названием facebookLogin.swift, страница входа и ViewController.Swift на главной странице. Я правильно закодировал все материалы для входа в Facebook, и все это работает, я могу войти в систему и выйти из нее с помощью кнопки, которую предоставляет FBSDK, а также настраиваемой кнопки, которую я определил. Тем не менее, я не могу понять, как перейти на страницу ViewController.swift, если пользователь вошел в системуКак программно запустить в другой viewController, если ваш пользователь зарегистрировался через Facebook

Вот код facebookLogin.swift:.

import UIKit 
import FBSDKCoreKit 
import FBSDKLoginKit 

class facebookLogin: UIViewController, FBSDKLoginButtonDelegate { 
    var loginStatus = false; 

    @IBOutlet weak var facebookOutlet: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     super.viewDidLoad() 
     let loginButton = FBSDKLoginButton() 
     view.addSubview(loginButton) 
     loginButton.center = view.center 
     loginButton.delegate = self; 
     loginButton.readPermissions = ["email","public_profile"] 
    } 

    @IBAction func facebookAction(_ sender: Any) { 
     customFBLogin() 
     if (FBSDKAccessToken.current() != nil) { 
      NSLog("it works") 
     } 
    } 

    func customFBLogin() { 
     FBSDKLoginManager().logIn(withReadPermissions: ["email","public_profile"], from: self) { (result, err) in 
      if err != nil { 
       print("Facebook Login Error Failed \(err)") 
       return; 
      } 
      self.showEmailAddress(); 
      self.loginStatus = true; 
     } 
    } 



    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { 
     print("Did log out of Facebook") 
    } 

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 
     if error != nil { 
      print(error) 
      return; 
     } else { 
      print("Successfuly logged into Facebook"); 
      showEmailAddress() 

     } 
    } 

    func showEmailAddress() { 
     FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start(completionHandler: { (connection, result, err) in 

      if err != nil { 
       print("Failed to start graph request \(err)") 
       return; 
      } 
      print(result) 

     }) 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

Вот соответствующий код из AppDelegate .swift файл:

import UIKit 
import CoreData 
import Firebase 
import FBSDKCoreKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 
     FIRApp.configure() 
     FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 

     let mainStoryBoard = UIStoryboard.init(name: "Main", bundle: nil) 
     self.window = UIWindow(frame: UIScreen.main.bounds) 
     var initialViewController: UIViewController 

     if(FBSDKAccessToken.current() != nil) { 
      let vc = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
      initialViewController = vc 
     } else{ 
      initialViewController = mainStoryBoard.instantiateViewController(withIdentifier: "facebookLogin") 
     } 

     self.window?.rootViewController = initialViewController 

     self.window?.makeKeyAndVisible() 

     return true 
    } 

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 
     let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 

     return handled; 
    } 

в первой функции приложения в классе AppDelegate.swift, я нашел еще один учебник по StackOverflow, который предложил использовать этот код. Я ввел код и преобразовал синтаксис в swift3, но приложение ломается, когда я его запускаю. Это означает, что он знает, что я вошел в систему, но по какой-то причине segue не загружается, и это ломает приложение. Ошибка, которую я получаю, это Thread 1: sigabrt.

Вот как соответствующие пункты в истории правления выглядят, на первый начальный вид контроллера находится на левой стороне, и если пользователь вошел в систему, я хочу, чтобы приложение, чтобы начать с ViewController на правой 1

+0

есть вы определили раскадровка идентификаторы? –

+0

Вы используете реальное устройство? –

ответ

0

Ваш код выглядит нормально. Вы должны рассмотреть возможность проверки идентификатора раскадровки вашего ViewController в разделе Identity на экране дизайна раскадровки. Вы должны указать идентификатор раскадровки как «ViewController». Идентификатор раскадровки экрана входа в систему должен быть «facebookLogin» в соответствии с вашим кодом.

+0

Да, я уже это сделал – pbokey

+0

Не могли бы вы пробовать код ниже за кнопкой после успешного входа? 'let vc = self.storyboard? .instantiateViewControllerWithIdentifier (« ViewController ») как! UIViewController; self.presentViewController (vc, animated: true, completion: nil); ' –

0

Ваш текущий токен доступа равен нулю. попробуйте проверить реальное устройство, потому что последний FBSDK не хранит токен доступа в симуляторе. он будет печатать «Падение обратно маркера доступа нагрузки от NSUserDefaults из-за ошибки тренажере» в консоли

---- Редактировать ----

здесь, если ваш текущий маркер доступа равен нулю, чем он будет идти к экрану входа в систему. в соответствии с вашим требованием изменить следующее условие:

if(FBSDKAccessToken.current() != nil) { 
     let vc = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
     initialViewController = vc 
} 
else { 
    initialViewController = mainStoryBoard.instantiateViewController(withIdentifier: "facebookLogin") 
} 

изменить первоначальный контрольПросмотр как ваше требование.

---- Обновление ----

Вы можете проигнорировать это предупреждение, это жестко закодированы в FacebookSDK при использовании IOS Simulator. SDK действительно содержит ошибку, которая не позволяет симулятору кэшировать токен доступа.

Вы можете это исправить, добавив следующую строку в FBSDKKeychainStore.m: 94 и FBSDKKeychainStore.m: 135 раз перед:

let key = String(format: "%@_fix", key) 
UserDefaults().set(key, forKey: value) 
+0

, поэтому, если он не сохраняет значение в симуляторе, по характеру операторов if if else не должен по умолчанию использоваться для экрана входа в систему ? – pbokey

0

Swift 3 код

// Проверяем Последний AccesToken

if let accessToken = AccessToken.current { 
     print("Last AccesToken -\(accessToken)") 

     // Redirect to next screen 
     self.performSegue(withIdentifier:"NextScreen", sender: self) 
    } 
    else { 

     let loginManager = LoginManager() 
     loginManager.loginBehavior = LoginBehavior.web 
     loginManager.logIn([ .publicProfile , .email, .userFriends], viewController: self) { loginResult in 
      switch loginResult { 

      case .failed(let error): 
       print(error) 
       break 
      case .cancelled: 
       print("User cancelled login.") 
       break 
      case .success(let grantedPermissions, let declinedPermissions, let accessToken): 
       print("Logged in! \(grantedPermissions) \(accessToken) \(declinedPermissions)") 

       // Save Current UserInfo 
       let params = ["fields":"id,name,email,picture"] 
       let graphRequest = GraphRequest(graphPath: "me", parameters: params) 
       graphRequest.start { (urlResponse, requestResult) in 
        switch requestResult { 
        case .failed(let error): 
         print(error) 
        case .success(let graphResponse): 
         if let responseDictionary = graphResponse.dictionaryValue { 

          print("\(String(describing: graphResponse.dictionaryValue))") 

          UserDefaults.standard.set(responseDictionary, forKey: "userInfo") 
         } 
        } 
       } 

       self.performSegue(withIdentifier: "NextScreen", sender: self) 
       break 
      } 
     } 
    }