2015-01-10 3 views
2

Получите некоторые проблемы с Parse и Swift. Я пытаюсь использовать Facebook Login с классом Parse PFFacebookUtils. Вот код:Проблемы с Swift и Parse (и xCode)

// LOG IN or SIGN UP with FACEBOOK 


@IBAction func FacebookLogin() { 
    PFFacebookUtils.logInWithPermissions(permissions, {(user: PFUser!, error: NSError!) -> Void in 
     if error == nil { 
      if user == nil { 
       NSLog("Uh oh. The user cancelled the Facebook login.") 
       let userCancelledAlert = UIAlertController(title: "Error", message: "You cancelled the Facebook Login", preferredStyle: .Alert) 
       let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil) 
       userCancelledAlert.addAction(okButton) 
       let cancelButton = UIAlertAction(title: "Cancel", style: .Default, handler: nil) 
       userCancelledAlert.addAction(cancelButton) 
       self.presentViewController(userCancelledAlert, animated: true, completion: nil)    
      } else if user.isNew { 
       NSLog("User signed up and logged in through Facebook!") 
       FBRequestConnection.startWithGraphPath("me?fields=email", completionHandler: { (connection, result, error) -> Void in 
        if error == nil { 
         let fbGraphicObject = result as FBGraphObject 
         println(fbGraphicObject) 
        } 
       }) 
      } else { 
       NSLog("User logged in through Facebook!")    
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        var homeViewController = self.storyboard?.instantiateViewControllerWithIdentifier("homePage") as HomeViewController 
        self.presentViewController(homeViewController, animated: true, completion: nil) 
       }) 
      // end login (success) 
      } 
     } else { // if login doesnt work 
      println(error!) 
      /* 
      let facebookError = UIAlertController(title: "Error", message: "Cant connect to Facebook, check your connectivity", preferredStyle: .Alert) 
      let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil) 
      facebookError.addAction(okButton) 
      let cancelButton = UIAlertAction(title: "Cancel", style: .Default, handler: nil) 
      facebookError.addAction(cancelButton) 
      self.presentViewController(facebookError, animated: true, completion: nil) 
      */ 
     } 
    }) 
} 

Так что теперь мой вопрос: почему я не могу видеть то, что права доступа, когда я зарегистрироваться? Я имею в виду, что разрешения - это массив.

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

Но когда я подписаться на сообщение является что-то вроде «[APP-NAME] хочет получить доступ к вашей основной информации и списка друзей. Почему бы не адрес электронной почты или user_birthday. Тогда, как я могу храня эту информацию в моей базе данных Parse? Я имею в виду, я вижу идентификатор, имя пользователя, пароль (очевидно, у меня нет), authData и т. д. У меня есть поле электронной почты, но оно пусто. Я предполагаю, что в коде что-то не так. Любой может найти? Наконец, не знаю почему, но xCode autocompletion для класса Parse (я использую Swift) не работает. Я импортировал фреймворк (я добавил заголовок моста), и он работал несколько дней назад.

+0

Как раз перед входом в logInWithPermissions вы можете 'println (permissions)' видеть, что внутри? Что касается XCode, это может быть связано с http://stackoverflow.com/questions/24006206/sourcekitservice-terminated – Kalzem

+0

@BabyAzerty, разрешения содержат «[email, user_birthday]», как я установил. Да, я читал это сообщение раньше, но это не моя проблема. У меня нет сообщений или черного окна. Просто редактор xCode не предлагает мне ничего о структуре Parse (классы, методы или свойства) –

ответ

1

Я работал над этим же, пытаясь заставить Parse хранить электронную почту Facebook в качестве имени пользователя вместо автоматически генерируемого идентификатора. Поскольку Facebook обновил Graph API до версии 2.0, похоже, что там не так много, чтобы рассказать вам, как это сделать. Это то, что я сделал:

Сначала я установил правильные разрешения для получения электронной почты от Facebook. Это делается в методе «didLoginUser».

func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) { 
    if !PFFacebookUtils.isLinkedWithUser(user) { 
     let facebookLinkSuccess : (succeeded: Bool, error: NSError?) -> Void = { succeeded, error in 
      if(succeeded){ 
       println("PF User linked with facebook") 
      } 
     } 
     PFFacebookUtils.linkUserInBackground(user, withReadPermissions: ["public_profile", "email", "user_friends","user_birthday","user_location"], block: facebookLinkSuccess) 
    } ... 

Во-вторых, я нашел это StackOverflow, который поможет вам сделать API вызова FB Graph, а затем обновить объект Анализировать PFUser с требуемыми значениями: Facebook iOS SDK & Swift - How do I create dependent batch requests?

настроить вызов следующим образом:

 if (FBSDKAccessToken.currentAccessToken() != nil){ 
      var userProfileRequestParams = [ "fields" : "id, name, email"] 
      let userProfileRequest = FBSDKGraphRequest(graphPath: "me", parameters: userProfileRequestParams) 
      let graphConnection = FBSDKGraphRequestConnection() 
      graphConnection.addRequest(userProfileRequest, completionHandler: { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in 
       if(error != nil){ 
        println(error) 
       } 
       else { 
        let fbEmail = result.objectForKey("email") as! String 
        let fbUserId = result.objectForKey("id") as! String 
        if(fbEmail != "") { 
         PFUser.currentUser()?.username = fbEmail 
         PFUser.currentUser()?.saveEventually(nil) 
        } 
        println("Email: \(fbEmail)") 
        println("FBUserId: \(fbUserId)") 
       } 
      }) 
      graphConnection.start() 
     } 

Я ставлю этот код в Func logInViewController (LoginController: PFLogInViewController, didLogInUser пользователь: PFUser) {...

Если у вас есть вопросы по этой части, ознакомьтесь с этим видео, у него есть аналогичная идея, но с Twitter. https://www.youtube.com/watch?v=lnf7KHHeiO0

Надеюсь, это поможет кому-то. Я потратил почти 5 часов на это.

Смежные вопросы