2014-09-18 3 views
7

나는 페이스 북 로그인/가입 기능을 신속하게 만들려고 애 쓰고있다. 튜토리얼을 찾고 있었지만 아무것도 찾을 수 없었습니다. 그래서 나는 그것을 직접 해보려고 노력했다. 그것은 작동하지만, 왜 내 facebookName, 성별 및 이미지를 데이터베이스에 저장하지 않는 것? 시뮬레이터에 저장하고 있지만 ios 8 장치를 사용할 때가 아닙니다.facebook parse sign up swift

내가이 로그 메시지를 수신하고있어 "사용자 가입 및 페이스 북을 통해 로그인!", 새로운 사용자는 구문 분석 클래스에 추가되어 있지만 이름, 이미지, 성별 ...

@IBAction func login(sender: UIButton!) { 




    var permissionArray = ["user_about_me", "user_relationships", "user_birthday", "user_location"] 

    PFFacebookUtils.initializeFacebook() 

    PFFacebookUtils.logInWithPermissions(permissionArray, block: { (user: PFUser!, error: NSError!) in 
     println(user) 
     if user == nil { 
      println(error.localizedDescription) 


     } else { 



      if user.isNew { 



       var userQuery = PFUser.query() 
       userQuery.getObjectInBackgroundWithId(PFUser.currentUser().objectId) { 
        (userObject: PFObject!, error: NSError!) -> Void in 


        var fbRequest = FBRequest.requestForMe() 
        fbRequest.startWithCompletionHandler { (connection: FBRequestConnection!, result:AnyObject!, error: NSError!) in 


         if error == nil { 

          //FACEBOOK DATA IN DICTIONARY 
          var userData = result as NSDictionary 
          var faceBookId = userData.objectForKey("id") as NSString 
          var faceBookName = userData.objectForKey("first_name") as NSString 
          var faceBookMiddle = userData.objectForKey("middle_name") as NSString 
          var faceBookGender = userData.objectForKey("gender") as NSString 

          var url:NSURL = NSURL.URLWithString(NSString(format:"https://graph.facebook.com/%@/picture?width=320", faceBookId)) 
          var err: NSError? 
          var imageData :NSData = NSData.dataWithContentsOfURL(url, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err) 

          var imageFile = PFFile(name: "image.jpg", data: imageData) as PFFile 

          println(userData) 

          userObject.setObject(faceBookName, forKey: "name") 
          userObject.setObject(imageFile, forKey: "file") 
          userObject.setObject(faceBookGender, forKey: "gender") 

          userObject.saveInBackground() 



          var sharedInstance:userSingleton = userSingleton.sharedInstance 

          sharedInstance.userName = (userObject.objectForKey("name") as NSString) 
          sharedInstance.userGender = (userObject.objectForKey("gender") as NSString) 


          (userObject.objectForKey("file") as PFFile).getDataInBackgroundWithBlock { 
           (theImageData: NSData!, error: NSError!) -> Void in 

           println(error) 
           if error == nil { 

            sharedInstance.userImage = UIImage(data:theImageData) 
           } 
           self.performSegueWithIdentifier("LoginSegue", sender: self) 
          } 


         } 
        } 
       } 





       println("User signed up and logged in through Facebook!") 
      } else { 



       println("User logged in through Facebook!") 
      } 


     } 

    }) 

} 

} 

답변

4

구문 분석을 사용한다고 가정하면 여기에 입니다. 수행 방법은입니다.

class Utils { 

    class func notLoggedIn() -> Bool { 
     let user = PFUser.currentUser() 
     // here I assume that a user must be linked to Facebook 
     return user == nil || !PFFacebookUtils.isLinkedWithUser(user) 
    } 
    class func loggedIn() -> Bool { 
     return !notLoggedIn() 
    } 


    class func logInWithFacebook() { 
     PFFacebookUtils.logInWithPermissions(["public_profile", "user_friends"]) { 
      (user: PFUser!, error: NSError!) -> Void in 
      if user == nil { 
       NSLog("The user cancelled the Facebook login (user is nil)") 
      } else { 
       NSLog("The user successfully logged in with Facebook (user is NOT nil)") 
       // HERE I SET A USER POINTER TO THE INSTALLATION 
       // That way we can send push notifications to specific users 
       if let installation = PFInstallation.currentInstallation() { 
        installation["user"] = PFUser.currentUser() 
        installation.saveEventually() 
       } 
       // THEN I GET THE USERNAME AND fbId 
       Utils.obtainUserNameAndFbId() 
      } 
     } 
    } 


    class func obtainUserNameAndFbId() { 
     if notLoggedIn() { 
      return 
     } 
     let user = PFUser.currentUser() // Won't be nil because is logged in 
     // RETURN IF WE ALREADY HAVE A USERNAME AND FBID 
     // Note that we check the fbId because Parse automatically fills in the username with random numbers 
     if let fbId = user["fbId"] as? String { 
      if !fbId.isEmpty { 
       println("we already have a username and fbId -> return") 
       return 
      } 
     } 
     // REQUEST TO FACEBOOK 
     println("performing request to FB for username and IDF...") 
     if let session = PFFacebookUtils.session() { 
      if session.isOpen { 
       println("session is open") 
       FBRequestConnection.startForMeWithCompletionHandler({ (connection: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in 
        println("done me request") 
        if error != nil { 
         println("facebook me request - error is not nil :(") 
        } else { 
         println("facebook me request - error is nil :)") 
         println(result) 
         // You have 2 ways to access the result: 
         // 1) 
         println(result["name"]) 
         println(result["id"]) 
         // 2) 
         println(result.name) 
         println(result.objectID) 
         // Save to Parse: 
         PFUser.currentUser().username = result.name 
         PFUser.currentUser().setValue(result.objectID, forKey: "fbId") 
         PFUser.currentUser().saveEventually() // Always use saveEventually if you want to be sure that the save will succeed 
        } 
       }) 
      } 
     } 
    } 

} 

그런 다음 당신은 단순히 Utils.logInWithFacebook() 때를 호출 할 수 있습니다 : 개인적으로 나는 내가 다시 사용하려는 모든 재료를 넣어 Utils.swift가 (또는 내 ViewControllers에 갖고 싶어하지 않는) 클래스를 생성 당신은 로그인을 수행하고자합니다.

페이스 북 요청이 실패 할 수 있기 때문에 사용자 이름 및 페이스 북 ID를 구문 분석에 저장할 수 있다고 보장 할 수 없습니다. 그래서 내가 이라는 메쏘드를 만들었는데, 나는 application(_: didFinishLaunchingWithOptions)으로 전화를 걸었다. (성공할 때까지 FB에 대한 요청 만 수행하기 때문에 매번 호출 할 수있다.)

관련 문제