2016-09-02 7 views
1

Facebook SDK 4.15およびGoogle Firebaseの最新バージョンを使用してユーザーを認証しています。私はここに書類に従っています:https://firebase.google.com/docs/auth/ios/facebook-loginGoogle FirebaseによるiOS Swift Facebook認証 - 余分な権限を引き出す方法は?

これは私のために働いています。

しかし、私はFacebookのユーザーから電子メールのような特別な権限を引き出したいと思います。私はFacebookがFacebookから私のアプリを承認する際に、電子メールの許可を求めるダイアログを確認してもらうこれにより

@IBOutlet var facebookButton : FBSDKLoginButton! 


override func viewDidLoad() { 
/... 
    facebookButton.readPermissions = ["email","public_profile"] 
... 
} 

:私はそうのようなコードを変更しました。そうです。

は、しかし、私のコールバックにユーザの電子メールアドレスは常にnilです:GoogleのFirebase認証を使用している間

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError?) { 
    if let error = error { 
    print(error.localizedDescription) 
    return 
    } 

    let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString) 
    FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in 
    // ... 
    if let error = error { 
     print(error.localizedDescription) 
     return 
    } 

    print("user.uid \(user!.uid)") 
    print("user.photoURL \(user!.photoURL)") 
    print("user.providerID \(user!.providerID)") 
    print("user.email \(user!.email)") 
    print("user.displayName \(user!.displayName)") 

は、どのように私はFacebookのログインを通じて電子メールのような余分な権限を引くことができますか?

+0

私は同じ問題があります。あなたはそれを解決しましたか? –

答えて

2

第三者認証を使用する場合は、認証トークンを取得してから、ユーザーをアプリに署名します。このトークンを使用すると、Firebase Authはユーザーの電子メールアドレスを抽出することができます。しかし、あなたの場合、FBのログイン後にユーザーの電子メールアドレスを取得する場合は、FacebookのGraph APIを使用する必要があります。以下のように、あなたが求める情報を含むGraphRequestを作成するだけです。

スウィフト2

struct FacebookPermission 
{ 
    static let ID: String = "id" 
    static let NAME: String = "name" 
    static let EMAIL: String = "email" 
    static let PROFILE_PIC: String = "picture" 
    static let LAST_NAME: String = "last_name" 
    static let FIRST_NAME: String = "first_name" 
    static let USER_FRIENDS: String = "user_friends" 
    static let PUBLIC_PROFILE: String = "public_profile" 
} 

func getFacebookData() 
{ 
    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "\(FacebookPermission.NAME), \(FacebookPermission.FIRST_NAME), \(FacebookPermission.LAST_NAME), \(FacebookPermission.EMAIL), \(FacebookPermission.PROFILE_PIC).type(large)"]) 

    graphRequest.startWithCompletionHandler { (connection: FBSDKGraphRequestConnection!, result:AnyObject!, error: NSError!) in 

     if error == nil 
     { 
      if let userName = result.valueForKey(FacebookPermission.NAME) as? String 
      { 
       self.currentUser.userName = userName 
      } 

      if let firstName = result.valueForKey(FacebookPermission.FIRST_NAME) as? String 
      { 
       self.currentUser.firstName = firstName 
      } 

      if let lastName = result.valueForKey(FacebookPermission.LAST_NAME) as? String 
      { 
       self.currentUser.lastName = lastName 
      } 

      if let email = result.valueForKey(FacebookPermission.EMAIL) as? String 
      { 
       self.currentUser.email = email 
      } 

      if let profilePic = result.valueForKey(FacebookPermission.PROFILE_PIC) 
      { 
       let facebookImageURL = profilePic.valueForKey("data")?.valueForKey("url") as? String 

       if let unwrappedURL = facebookImageURL 
       { 
        let imageData: NSData = NSData(contentsOfURL: NSURL(string: unwrappedURL)!)! 
        self.currentUser.profileImage = UIImage(data: imageData)! 
       } 
      } 
     } 
     else 
     { 
      print("Facebook Graph Request Error") 
     } 
    } 
} 

スウィフト3

func getFacebookData() 
{ 
    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "\(FacebookPermission.NAME), \(FacebookPermission.FIRST_NAME), \(FacebookPermission.LAST_NAME), \(FacebookPermission.EMAIL), \(FacebookPermission.PROFILE_PIC).type(large)"]) 

    graphRequest.start { (connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in 

     if error == nil 
     { 
      if let facebookData = result as? NSDictionary 
      { 
       if let userName = facebookData.value(forKey: FacebookPermission.NAME) as? String 
       { 
        self.currentUser.userName = userName 
       } 

       if let firstName = facebookData.value(forKey: FacebookPermission.FIRST_NAME) as? String 
       { 
        self.currentUser.firstName = firstName 
       } 

       if let lastName = facebookData.value(forKey: FacebookPermission.LAST_NAME) as? String 
       { 
        self.currentUser.lastName = lastName 
       } 

       if let email = facebookData.value(forKey: FacebookPermission.EMAIL) as? String 
       { 
        self.currentUser.email = email 
       } 

       if let profilePic = facebookData.value(forKey: FacebookPermission.PROFILE_PIC) 
       { 
        let facebookImageURL = ((profilePic as AnyObject).value(forKey: "data") as AnyObject).value(forKey: "url") as? String 

        if let unwrappedURL = facebookImageURL 
        { 
         let imageData: Data = try! Data(contentsOf: URL(string: unwrappedURL)!) 
         self.currentUser.profileImage = UIImage(data: imageData)! 
        } 
       } 
      } 
     } 
     else 
     { 
      print("Facebook Graph Request Error") 
     } 
    } 
} 

その情報をつかんした後、あなたが先に行くこととあなたのFirebaseデータベースに格納します。

Here's Facebookの権限についての詳細。 乾杯!

+0

私のために働いていない。 : –

+0

Swift 3を追加しました – eshirima

+0

結果は0です。 /pastebin.com/L9Aa6kUu –

1

私はthis

Firebaseのみメール+パスワードユーザーのリストを格納しました。ソーシャルプロバイダ(Facebookなど)で署名された、あなたのアプリのユーザーのためのデータは保存されません。

関連する問題