firebase - 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)
}
}
解决方案
推荐阅读
- laravel - 未找到基表或视图:1146 表“cricbangla.batter_firsts”不存在(SQL:选择计数(*)作为来自“batter_firsts”的聚合)-Laravel-8
- ios - 如何从 [Any] 数组的集合中获取所有可能值的总和
- macos - 为什么 Pakku 在 MacOS Big Sur 上使用时会因“无法找到本机库 libarchive.13.dylib”而崩溃
- node.js - 如何在 MongoDB 内的数组中添加条目
- java - 如何解决对实体“l”的错误引用必须以“;”结尾 从晨星获取时的分隔符
- javascript - 如何删除jquery中的特定按钮
- python - 底图的 drawgreatcirlces() 函数无法将浮点 NaN 转换为整数
- elasticsearch - 如何将 OAuth2 凭据应用于 Fluentd 以进行弹性摄取?
- image - 按每日多边形裁剪每日图像并提取值到点
- r - 根据 R 中具有不同数据框输入的多个条件创建列类型