2016-03-27 5 views
0

Ich versuche, einige sehr einfache (wie ich dachte) Funktionalität in meine Anwendung, die Parse.com Service verwendet bereitstellen. Was ich brauche, ist nur erlauben Benutzer ein Konto über Facebook zu erstellen und sie erneut über Facebook einloggen.PFFacebookUtils. Wie kann ich zwischen Anmeldung und Anmeldung unterscheiden?

Das Problem ist, dass PFFacebookUtils Login-Methoden nicht nur Benutzer über Facebook anmelden, sondern auch eine neue PFUser erstellen. Warum ist es ein Problem für mich? Aber natürlich. Ich kann unterscheiden zwischen Anmeldung und in isNew Feld, aber es hilft nicht wirklich.

Betrachten Sie folgendes: Benutzer versucht sich über Facebook anzumelden (er hat noch keine PFUser), er loggt sich ein, ein neuer Benutzer wird erstellt. Ich sehe, dass der Benutzer neu ist (d. H. Der Benutzer war vorher nicht registriert) und ich muss diese Anmeldung ablehnen. Ok, ich lehne ihn ab, ich sage "Du wurdest noch nicht registriert, geh und melde dich an". Der Benutzer meldet sich an (über die gleiche Login-Methode) und diesmal wird PFUser zurückgegeben, das erstellt wurde, als der Benutzer sich anzumelden versuchte. Ich sehe, dass der Benutzer nicht neu ist, er wurde bereits registriert und ich muss ihn daher ablehnen Benutzer, da das Konto bereits existiert und es nicht möglich ist, dasselbe Konto erneut zu erstellen.

Verstehen Sie das Problem? Bin ich idiotisch, wenn ich nicht weiß, wie ich mit PFFacebookUtils Kontoerstellung und Anmeldung umgehen soll oder PFFacebookUtils wer eine idiotische API anbietet? Wie machen Sie das? Wie löst man das von mir beschriebene Problem? Wirklich, es muss so einfach sein, aber ich kann kein gutes Beispiel finden

Antwort

1

Ich habe Login-und Anmelde-Code in Swift, die überprüft, ob ein Benutzer neu in der Anmeldung und Anmeldung ist. Hier ist mein Code:

LOGIN

let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    spinningActivity.label.text = "Just a Moment" 
    spinningActivity.detailsLabel.text = "Logging in" 

    if reachabilityStatus == kNOTREACHABLE { 

     spinningActivity.hideAnimated(true) 

     self.displayError("No Internet Connection", message: "Please connect to the internet before continuing") 

    } else { 

     let permissions = ["public_profile"] 

     PFFacebookUtils.logInInBackgroundWithReadPermissions(permissions) { (user:PFUser?, error:NSError?) -> Void in 



      if error != nil { 

       spinningActivity.hideAnimated(true) 

       self.displayError("Error", message: error!.localizedDescription) 

      } else if let user = user { 
       if user.isNew { 

        spinningActivity.hideAnimated(true) 

        PFUser.currentUser()?.deleteInBackground() 

        self.displayNoticeWithTwoActions("Account Not Found", message: "This Facebook account is not in our system. You have to sign up first.", firstButtonTitle: "Sign Up",closeButtonTitle: "Ok", segue: "dontHaveAccountSegue") 

       } else { 

        spinningActivity.hideAnimated(true) 

        self.performSegueWithIdentifier("successfulLoginSegue", sender: self) 



       } 
      } else { 

       PFUser.currentUser()?.deleteInBackground() 

       spinningActivity.hideAnimated(true) 

       self.displayError("Error", message: "Unless you tapped on 'Cancel' or 'Done', something went wrong. Please try again.") 

      } 

     } 

    } 

SIGNUP

Ich habe eine Anmeldetaste und dann eine Funktion, die in den Login-Button implementiert wird als "loadFacebookUserDetails"

let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    spinningActivity.label.text = "Just a Moment" 
    spinningActivity.detailsLabel.text = "Loading Details" 


    if reachabilityStatus == kNOTREACHABLE { 

     spinningActivity.hideAnimated(true) 

     self.displayError("No Internet Connection", message: "Please connect to the internet before continuing") 

    } else { 

     let permissions = ["public_profile", "email"] 

     PFFacebookUtils.logInInBackgroundWithReadPermissions(permissions) { (user:PFUser?, error:NSError?) -> Void in 

      if let user = user { 

       if !user.isNew { 

        spinningActivity.hideAnimated(true) 

        PFUser.logOut() 


        self.displayNoticeWithTwoActions("Account Found", message: "This Facebook account already in our system. You have to log in first.", firstButtonTitle: "Log In", closeButtonTitle: "Cancel", segue: "haveAccountSegue") 



       } else if error != nil { 

        spinningActivity.hideAnimated(true) 

        self.displayError("Error", message: error!.localizedDescription) 



       } else if error == nil { 

        spinningActivity.hideAnimated(true) 

        self.loadFacebookUserDetails() 

       } 

      } 

     else { 

       spinningActivity.hideAnimated(true) 

       self.displayError("Something Went Wrong", message: "Unless you tapped on 'Cancel' or 'Done', something went wrong. Please try again") 

      } 



     } 


    } 

func loadFacebookUserDetails() { 

    let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    spinningActivity.mode = MBProgressHUDMode.AnnularDeterminate 
    spinningActivity.label.text = "Just a Moment" 
    spinningActivity.detailsLabel.text = "Loading Details" 

    let requestPerameters = ["fields": "id, email, first_name, last_name, name"] 

    let userDetails = FBSDKGraphRequest(graphPath: "me", parameters: requestPerameters) 

    userDetails.startWithCompletionHandler { (connection, result, error:NSError!) -> Void in 

     if error != nil { 

      spinningActivity.hideAnimated(true) 

      self.displayError("Error", message: error!.localizedDescription) 

      PFUser.logOut() 

     } else { 

     let userID:String = result["id"] as! String 
     let userEmail:String = result["email"] as! String 
     let userFirstName:String = result["first_name"] as! String 
     let userLastName:String = result["last_name"] as! String 


     // Get Facebook Profile Picture 

     let userProfile = "https://graph.facebook.com/" + userID + "/picture?type=large" 

     let usernameLink = "https://graph.facebook.com/" + userID 

     let username = usernameLink.stringByReplacingOccurrencesOfString("https://graph.facebook.com/", withString: "") 

     let profilePictureUrl = NSURL(string: userProfile) 

     let profilePictureData = NSData(contentsOfURL: profilePictureUrl!) 

     if profilePictureData != nil { 

      let profilePictureObject = PFFile(data: profilePictureData!) 
      PFUser.currentUser()?.setObject(profilePictureObject!, forKey: "profile_picture") 

     } 

     PFUser.currentUser()?.setObject(userFirstName, forKey: "first_name") 
     PFUser.currentUser()?.setObject(userLastName, forKey: "last_name") 
     PFUser.currentUser()?.setObject(username, forKey: "facebook_link") 

     if userEmail == userEmail { 

      PFUser.currentUser()?.email = userEmail 

     } 

     PFUser.currentUser()?.saveInBackgroundWithBlock({ (success:Bool, error:NSError?) -> Void in 

      if error != nil { 

       spinningActivity.hideAnimated(true) 

       self.displayError("Error", message: error!.localizedDescription) 

       PFUser.logOut() 

      } else if success == true { 

       if !userID.isEmpty { 

        spinningActivity.hideAnimated(true) 

       NSUserDefaults.standardUserDefaults().setObject("authData", forKey: "facebookAuth") 

        NSUserDefaults.standardUserDefaults().synchronize() 

        self.performSegueWithIdentifier("facebookUserDetailsSegue", sender: self) 



       } 

      } else { 

       spinningActivity.hideAnimated(true) 

       self.displayError("Something Went Wrong", message: "Please try again") 

       PFUser.logOut() 

      } 

     }) 

    } 

} 

} 

Wenn Sie Probleme mit der Umstellung auf Objective-C, ich wette, dass Sie YouTube-Videos auf, wie dies zu tun finden.