简体   繁体   中英

iOS link two firebase account

I'm trying to link two firebase accounts, usually the user would be logged in with social media or email or anonmus account and then a user would sign in with phone. I need to link these two accounts.

parent view

a function in the parent view would be called to sign up with phone number

class welcomeView: UIViewController, FUIAuthDelegate {

 //stores current user
 var previosUser = FIRUser()


 override func viewDidLoad() {
    super.viewDidLoad()
  if let user = Auth.auth().currentUser {
        previosUser = user 
    }else{
        Auth.auth().signInAnonymously() { (user, error) in

            if error != nil {
                //handle error
            }
            previosUser = user!
        }
    }

 }






 func signUpWithPhone(){ 
    let vc = signUpWithPhoneView()
    vc.authUI?.delegate = self
    vc.auth?.languageCode = "ar"
    self.present(vc, animated: true) 

  }


}

in the child view (signUpWithPhoneView) I present the FUIPhoneAuth

phoneProvider.signIn(withPresenting: self)

child view

import UIKit
import FirebaseAuthUI
import FirebasePhoneAuthUI

class signUpWithPhoneView: UIViewController {

 fileprivate(set) var authUI = FUIAuth.defaultAuthUI()
 var didload = false

 override func viewDidLoad() {
    super.viewDidLoad()
 }


 override func viewWillAppear(_ animated: Bool) {
    if !didload { // stops from looping 
        didload = !didload

        guard let authUI = self.authUI else {return}
        let phoneProvider = FUIPhoneAuth.init(authUI: authUI)
        self.authUI?.providers = [phoneProvider] 
     >> phoneProvider.signIn(withPresenting: self)

    }
 }


}

when the user signs in, the child view will be dismissed automatically and I have didSignInWith function that will be Called in the parents view. I need to link the previous user account and the user phone account

parent view

    func authUI(_ authUI: FUIAuth, didSignInWith user: FirebaseAuth.User?, error: Error?) {

    if let user = user{

        // link the the two accounts

    }else{

    }

}

I tried to link by using

        let provider = PhoneAuthProvider.provider(auth: authUI.auth!)
        let credential = PhoneAuthProvider.credential(provider)


        previosUser.link(with: credential, completion: { (user, error) in
            if error != nil {
                print("this is linking two acounts error : " , error)
            }
        })

but there was error in credential

in ...previosUser.link(with: *credential*, completion: ...

Cannot convert value of type '(String, String) -> PhoneAuthCredential' to expected 
argument type 'AuthCredential'

any help would be appreciated thanks

You are getting the provider with authUI.auth and then not using it to get the credential and you are currently using the static reference of the instance method credential .

The instance method itself takes two strings and returns an AuthCredential which is why you're seeing (String, String) -> AuthCredential . You must create the credential using a verification ID and code that you must collect from the user.

guard let auth = authUI.auth else { return }

let provider = PhoneAuthProvider.provider(auth: auth)
let credential = provider.credential(
   withVerificationID: "XXXXXXXXXXXX", 
   verificationCode: "XXXXXX"
)

// ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM