2016-04-30 15 views
1

Ich habe eine Startseite, die Benutzer mit Facebook Login einloggen müssen.Aber wenn ich den Facebook-Button antippen - es leitet mich auf Safari-Seite, und es wird automatisch beendet und auf den Startbildschirm zurückzukehren .Nicht einloggen mit Facebook SDK

Ich habe alle Tutorials versucht und den Code geändert. Aber nichts hat für mich funktioniert. Bitte hilf mir - warum passiert das?

import UIKit 
import FBSDKCoreKit 
import FBSDKLoginKit 

class LoginViewController: UIViewController, UIAlertViewDelegate, GIDSignInDelegate, GIDSignInUIDelegate 
{ 

    @IBOutlet weak var UsernameEmailTextField: UITextField? // init username/email text field 
    @IBOutlet weak var PasswordTextField: UITextField? // init password text field 
    @IBOutlet var FbLoginButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.navigationBar.barTintColor = UIColor.redColor() 
     self.navigationController?.navigationBar.tintColor = UIColor.whiteColor() 

     if (FBSDKAccessToken.currentAccessToken() != nil) { 
      // User is already logged in, do work such as go to next view controller. 
      print("User Already Logged In") 
     } else { 
      print("User Not Logged In") 
     } 

     let dismiss: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(LoginViewController.DismissKeyboard)) 
     view.addGestureRecognizer(dismiss) 
    } 

    //keyboard dismiss function for input's 
    func DismissKeyboard() { 
     view.endEditing(true) 
    } 

    //facebook sign in 
    @IBAction func FbLoginButtonTapped(sender: AnyObject) { 
     let facebookLogin = FBSDKLoginManager() 
     facebookLogin.logInWithReadPermissions(["email","public_profile","user_location"], fromViewController:self, handler:{(facebookResult, facebookError) -> Void in 

       if facebookError != nil { 
        print("Facebook login failed. Error \(facebookError)") 
       } else if facebookResult.isCancelled { 
        print("Facebook login was cancelled.") 
       } else { 
        if((FBSDKAccessToken.currentAccessToken()) != nil) { 
         FBSDKGraphRequest(graphPath: "me", 
          parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email, user_location"]).startWithCompletionHandler({ 
           (connection, result, error) -> Void in 

           if (error != nil) { 
            print(error) 
           } else { 
            let Email = result.valueForKey("email") as! String 
            let IdasPassword = result.valueForKey("id") as! String 
            self.MakeLogin(Email, SocialPassword: IdasPassword) 
           } 
          }) 
        } 

       } 
     }) 

    } 

    func MakeLogin(SocialEmail: String, SocialPassword: String) { 
     //Adding Headers 
     let headers = ["content-type": "application/x-www-form-urlencoded"] 
     //Concatenating the email/username field with postdata 
     let ConcatEmail = "email="+SocialEmail 
     //Concatenating the password field with postdata 
     let ConcatPassword = "&password="+SocialPassword 
     //assigning concatenated values in postData 
     let postData = NSMutableData(data: ConcatEmail.dataUsingEncoding(NSUTF8StringEncoding)!) 
     postData.appendData(ConcatPassword.dataUsingEncoding(NSUTF8StringEncoding)!) 
     //assigning request values 
     let request = NSMutableURLRequest(URL: NSURL(string: "http login url”)!) 
      //declaring POST Method 
      request.HTTPMethod = "POST" 
      //declaring header fields 
      request.allHTTPHeaderFields = headers 
      //Adding postData as HTTPBody 
      request.HTTPBody = postData 
     //declaring the session for url 
     let session = NSURLSession.sharedSession() 
     //assigning task to get response data 
     let task = session.dataTaskWithRequest(request, completionHandler: { (ResposeData, response, error) -> Void in 
      if(ResposeData != nil) { 
       //declaring completion handler to check whether login. 
       do { 
        if let jsonData = try NSJSONSerialization.JSONObjectWithData(ResposeData!, options: []) as? NSDictionary { 
         //assigning success jsonData 
         if let success = jsonData["success"] as? Int { 
          //If login success 
          if(success == 1) { 
           //assign access_token value from jsonData 
           let access_token = jsonData["token"] 
           // loading menu 
           dispatch_async(dispatch_get_main_queue()) { 
            let appdelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
            _ = appdelegate.window!.rootViewController 
            let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
            let mainViewController = mainStoryBoard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController 
            let leftViewController = mainStoryBoard.instantiateViewControllerWithIdentifier("MenuViewController") as! MenuViewController 
            let leftSideNav = UINavigationController(rootViewController: leftViewController) 
            let centerNav = UINavigationController(rootViewController: mainViewController) 
            let centerContainer:MMDrawerController = MMDrawerController(centerViewController: centerNav, leftDrawerViewController: leftSideNav) 
            centerContainer.openDrawerGestureModeMask = MMOpenDrawerGestureMode.PanningCenterView; 
            centerContainer.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.PanningCenterView; 
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "ISSOCIALLOGGEDIN") 
            NSUserDefaults.standardUserDefaults().setValue(access_token, forKey: "access_token") 
            NSUserDefaults.standardUserDefaults().synchronize() 
            appdelegate.centerContainer = centerContainer 
            appdelegate.window!.rootViewController = appdelegate.centerContainer 
            appdelegate.window!.makeKeyAndVisible() 
           } 

           //dismissing the current view 
           self.dismissViewControllerAnimated(true, completion: nil) 
          } else { 
           let ServerMessage = jsonData["message"] as? String 
           print(ServerMessage) 
           dispatch_async(dispatch_get_main_queue(), { 
            let alert = UIAlertController(title: "Error", message: ServerMessage, preferredStyle: UIAlertControllerStyle.Alert) 
            // add an action (button) 
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
            // show the alert 
            self.presentViewController(alert, animated: true, completion: nil) 
           }) 
          } 
         } 
        } else { 
         let jsonStr = NSString(data: ResposeData!, encoding: NSUTF8StringEncoding) 
         // No error thrown, but not NSDictionary 
         print("Error could not parse JSON: \(jsonStr)") 
        } 

       } catch let parseError { 
        print(parseError) 
        // Log the error thrown by `JSONObjectWithData` 
        let jsonStr = NSString(data: ResposeData!, encoding: NSUTF8StringEncoding) 
        print("Error could not parse JSON: '\(jsonStr)'") 
        dispatch_async(dispatch_get_main_queue(), { 
         let alert = UIAlertController(title: "Error", message: "No Data Received, Please contact Admin/Dev", preferredStyle: UIAlertControllerStyle.Alert) 
         // add an action (button) 
         alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
         // show the alert 
         self.presentViewController(alert, animated: true, completion: nil) 
        }) 
       } 
      } else { 
       print("Error: No Response Data") 
       dispatch_async(dispatch_get_main_queue(), { 
        let alert = UIAlertController(title: "Invalid Username or Password", message: "No Response from server, You might be facing internet failure or try with different values", preferredStyle: UIAlertControllerStyle.Alert) 
        // add an action (button) 
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
        // show the alert 
        self.presentViewController(alert, animated: true, completion: nil) 
       }) 
      } 
     }) 
     task.resume() 
    } 
} 
+0

irgendein Protokoll ???????? –

+0

Kein Protokoll, kam nur um sich einzuloggen oder Irgendwann ist es nur in Safari Seite – user5513630

+0

bedeutet, dass es abgestürzt ist oder nicht ... –

Antwort

0

Zuerst nehme ich an, dass Sie die neueste Version des Facebook SDK in Ihrem Projekt haben. Erstens gehen durch alle Schritte auf der Facebook-Entwickler-Website in Bezug auf die SDK-Installationen erwähnt,

This werden Sie für den Fall, helfen Sie nicht Objective-C-Code in Swift umwandeln kann.

Moving forward, implementieren Sie die Funktionen in yourViewController wie func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) für immer wissen, was passiert, wenn der Benutzer die Login-Taste gedrückt hat, wie folgt aus:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     if (error != nil) { 
      print(error.localizedDescription) 
     } else if result.isCancelled { 
      print("User Cancelled The Login") 
     } else { 
      if result.grantedPermissions.contains("email") { 
       print("Got email access") 
      } 
     } 
    } 

Sobald Sie die E-Mail erhalten Zugriff, können Sie eine andere Funktion aufrufen, um die angeforderten Benutzerdetails abzurufen; das ist, wie:

func graphRequestToReturnUserData(graphParameters: Dictionary<String, String>) { 
     let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: graphParameters) 
     graphRequest.startWithCompletionHandler({ 
      (connection, result, error) -> Void in 
      if ((error) != nil) { 
       print("Error: \(error.localizedDescription)")  //Error Handling 
      } else { 
       self.facebookD = result as! NSDictionary 
      } 
     }) 
    } 

Ihren eigenen Knopf erstellen und dann für die Details zu gehen ist kein guter Ansatz, wenn alles ist bereits im SDK. Abgesehen davon müssen Sie auch die Berechtigungen angeben, die Sie benötigen.

+0

wenn ich Seperare Projekt, My fb Login funktioniert gut.Aber wenn ich in diesem Projekt.Ist nicht funktioniert.Ok von Ihrem Vorschlag - wenn ich Delegate-Protokoll verwenden und wenn diese Delegate-Methode in meinem Code bedeutet, wie das zu tun.Ich meine, wie man das neu einprogrammieren mein Code !!!! – user5513630

+0

Implementieren Sie einfach Delegaten. – Fennec

+0

Mit meinem derzeitigen Code, wenn ich Delegate implementieren, wird es funktionieren? – user5513630

Verwandte Themen