首页 > 解决方案 > SwiftUI Firebase 电话身份验证更改显示名称

问题描述

SessionStore类内部监听函数中addStateDidChangeListener函数的user参数中的displayName返回nil。但我正在使用 createProfileChangeRequest 函数更改 displayName。我有一个问题。当我更改 DisplayName 时,当我第一次使用电话号码登录时,displayName 返回为空。但是,当我在后台关闭应用程序的情况下登录时,显示名称已满。这是什么原因?我在哪里做错了?

在此处输入图像描述

模型:

struct User {
    var uid: String
    var displayName: String?
    var phoneNumber: String?
    var isAdmin: Bool
}

会话存储:

class SessionStore : ObservableObject {
    
    var didChange = PassthroughSubject<SessionStore, Never>()
    var handle: AuthStateDidChangeListenerHandle?
    
    @Published var user: User?
    @Published var uid: String = ""
    @Published var errorMessage: String = ""
    @Published var showAlert: Bool = false
    @Published var isOpenHomePage: Bool = false
    @Published var code: String = ""
    
    func listener() {
        handle = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
                self.user = User(uid: user.uid, displayName: user.displayName, phoneNumber: user.phoneNumber ?? "", isAdmin: false)
            } else {
                self.user = nil
            }
        }
    }
    
    func verifyPhoneNumber(phoneNumber: String) {
        PhoneAuthProvider.provider().verifyPhoneNumber("+90\(phoneNumber)", uiDelegate: nil) { ID, error in
            if error != nil {
                self.errorMessage = error?.localizedDescription ?? ""
                self.showAlert = true
                print("erroroo: \(self.errorMessage)")
                return
            }
            self.uid = ID ?? ""
        }
    }
    
    func credentialProviderPhoneNumber() {
        let credential = PhoneAuthProvider.provider().credential(withVerificationID: uid, verificationCode: code)
        Auth.auth().signIn(with: credential) { result, error in
            if error != nil {
                self.errorMessage = error?.localizedDescription ?? ""
                print("error mesajı: \(self.errorMessage)")
                return
            }
            self.isOpenHomePage = true
        }
    }
    
    func signOut () {
        do {
            try Auth.auth().signOut()
            self.user = nil
        } catch {
        }
    }
    
    func unbind () {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
    func createProfileChangeRequest() {
        let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
        changeRequest?.displayName = "Test 123"
        changeRequest?.commitChanges(completion: { error in
            print("hata: \(error?.localizedDescription)")
        })
    }
}

登录视图:

struct SignInView: View {
    @State var phoneNumber: String = ""
    @State var code: String = ""
    @State var didGetCode: Bool = false
    @EnvironmentObject var session: SessionStore
    var body: some View {
        NavigationView {
            VStack {
                TextField("Telefon Numarası", text: $phoneNumber)
                    .padding(15)
                    .background(Color(UIColor.secondarySystemBackground))
                    .cornerRadius(15)
                    .padding(.horizontal)
                    .keyboardType(.numberPad)
                    .opacity(didGetCode ? 0.5 : 1)
                    .disabled(didGetCode ? true : false)
                
                TextField("Kod", text: $code)
                    .padding(15)
                    .background(Color(UIColor.secondarySystemBackground))
                    .cornerRadius(15)
                    .padding(.horizontal)
                    .textContentType(.oneTimeCode)
                    .keyboardType(.numberPad)
                    .opacity(didGetCode ? 1 : 0.5)
                    .disabled(didGetCode ? false : true)
                
                Button(action: {
                    if code == "" && phoneNumber != "" {
                        session.verifyPhoneNumber(phoneNumber: phoneNumber)
                        didGetCode = true
                    } else {
                        session.code = code
                        session.credentialProviderPhoneNumber()
                        session.createProfileChangeRequest()
                    }
                }) {
                    Text(didGetCode ? "Doğrula" : "Kod Al")
                }
                NavigationLink(
                    destination: HomeView(),
                    isActive: session.user != nil ? .constant(true) : $session.isOpenHomePage,
                    label: {
                        Text("")
                    })
            }
            .onAppear {
                session.listener()
            }
        }
    }
}

主页视图:

struct HomeView: View {
    @EnvironmentObject var session: SessionStore
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        
        VStack {
            Text("Hello User Id: \(session.user?.uid ?? "")")
            Text("Tel No: \(session.user?.phoneNumber ?? "")")
            Text("Display Name: \(session.user?.displayName ?? "")")
            Button(action: {
                session.signOut()
                presentationMode.wrappedValue.dismiss()
            }) {
                Text("Çıkış Yap")
            }
        }
        .onAppear {
            session.createProfileChangeRequest() -> here
        }
        .navigationBarHidden(true)
        .navigationBarBackButtonHidden(true)
    }
}

标签: firebaseauthenticationswiftuifirebase-authentication

解决方案


推荐阅读