2017-06-14 12 views
1

私はここで同様の質問を見ましたが、問題が解決しないようです。iOS Facebook SDK:FBSDKGraphRequestは返信しません(Swift)

私は現在Facebook SDKを使用してログインしてユーザー情報を返すiOSアプリケーションを作成しています。

私は正常にFacebookにログインし、要求された情報を受け取りました。ただし、電子メールの読み取り許可を許可しているにもかかわらず、電子メールは返されません。

/******************** 
    Place Facebook login button 
    *********************/ 
    let loginButton = FBSDKLoginButton() 
    view.addSubview(loginButton) 
    loginButton.delegate = self 
    loginButton.readPermissions = ["email", "public_profile"] 
    //add button constraints 
    loginButton.center = view.center 



} 

/** 
* Functions called when user handed back from facebook login 
**/ 
func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { 
    print("Did log out of facebook") 
} 
/** 
* Functions called when user handed back from facebook login 
**/ 
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 
    if error != nil { 
     print(error) 
    } else 
    { 
     print("Successfully logged in with facebook") 
     FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start 
      { (connection, result, err) in 
      if err != nil{ 
       print("Failed to start graph request: ", err) 
       return 
      } 
      print(result) 
     } 
    } 
} 
+0

メールは、ユーザーが確認された場合にのみ返され、すでにそれを検証しています。さらに、プライバシー設定により、ユーザーが許可を与えても電子メールを返さないような稀な状況があります。あなたのアプリが絶対に電子メールを必要としている場合は、ユーザーが手動で入力できるようにするための追加ステップを実装する必要があります(もちろん検証もあなたの責任となります)...すべてのユーザーがFacebookのファイルに電子メールを持っているわけではありません。モバイルのみを使用して登録します。 – CBroe

答えて

0

Facebook Graph API toolに基づいてFBSDKGraphRequestからユーザーの電子メールを取得することはできません。 Facebookはログインに使用されたトークンのみを返します。 FirebaseでFacebookログインを使用した場合は、CurrentUser.currentEmailメソッドを使用してメールを取得できます。

let login = FBSDKLoginManager() 

    login.logIn(withReadPermissions: ["email","user_posts","public_profile"], from: self, handler: { 
     (result: FBSDKLoginManagerLoginResult?, error: Error?) in 
     if error != nil { 
      print("Process error") 
      return 
     } 
     else if (result?.isCancelled)! { 
      print("Cancelled") 
     } 
     else { 
      //Success! 
      let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 
      self.firebaseLogin(credential) 
     } 
    }) 
+0

よろしくお願いいたします。ユーザーがサインアップすると、Firebaseは電子メールアドレスを保存しないことがわかります。私はこれを回避する方法を見つけるでしょう。ありがとうございました –

+0

Swift 2と古いFirebase + Facebook SDKでは上記の方法が許可されましたが、今度は 'FIRAuth.auth()?. currentUser?.email' – Fallah

0
import FBSDKCoreKit 
     import FBSDKLoginKit 
     import FBSDKShareKit 


     @IBAction func btnFbPressed(_ sender: Any) { 

      let loginManager = FBSDKLoginManager() 

      loginManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (loginResult, error) in 

       if error != nil { 
        print(error!) 

       } 
       else { 

        if (loginResult?.grantedPermissions.contains("email"))! { 
         self.getFBUserData() 
        } 

       } 
      } 


     } 




     func getFBUserData(){ 
      if((FBSDKAccessToken.current()) != nil){ 

       UserDefaults.standard.set(FBSDKAccessToken.current().tokenString, forKey: "fbToken") 

       FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in 
        if (error == nil) { 

         print(result as Any) 

         let dictionary = result as! NSDictionary 
         print(dictionary) 

         let hud = MBProgressHUD.showAdded(to: self.view, animated: true) 
         hud.tintColor = .black 
         hud.mode = .indeterminate 
         hud.label.text = "Loading" 
         hud.animationType = .fade 
         hud.show(animated: true) 

         let postString = String(format: "login_type=facebook&email=%@&id=%@&device=0", arguments: [dictionary.value(forKey: "email") as! String, dictionary.value(forKey: "id") as! String]) 
    } 
       }) 
      } 
     } 
関連する問題