我正在将 Ionic/Angular 应用程序从使用 Firebase 和 Angular/Fire 命名空间兼容库的组合迁移到 Angular/Fire 模块化库。
更新后的代码,使用@angular/fire模块化库,通过
ionic serve
在本地网络浏览器和Android设备/模拟器上运行良好。但是当在 iOS 设备或模拟器上运行相同的代码时,我遇到了以下问题
onAuthStateChanged
的调用不会返回任何内容,包括在第一次调用时不返回空值signInWithCustomToken
的调用挂起 - 通常在成功登录后,它将触发 onAuthStateChanged 但不会像上面 (1) 中那样响应,并挂起调用的地方,就好像等待 onAuthStateChanged 来触发。在应用程序启动时调用的 onAuthStateChanged 代码是
import { getAuth, onAuthStateChanged, signInWithCustomToken, UserCredential } from '@angular/fire/auth';
export class LoginService {
loginInit() {
const auth = getAuth();
this.unsubscribeFn = onAuthStateChanged(auth, async (user) => {
if(!user) {
this.loginUser();
} else {
// Initialize user account
}
}
async loginUser() {
// Get custom token from backend after validation
this.loginToken = this.getCustomToken();
const auth = getAuth();
const creds: UserCredential = await signInWithCustomToken(auth, this.loginToken);
}
}
我对所有 Firebase 调用都使用
@angular/fire
,在本例中使用 onAuthStateChanged
和 signInWithCustomToken
调用。我尝试了不同版本的 firebase(11.0.2、9.22.1 和 8.10.1)以及 @angular/fire(7.6.1 和 16.0.0)的版本,看看是否有帮助。
我在app.module中使用以下代码来初始化
provideFirebaseApp(() => initializeApp(environment.firebase)),
provideAuth(() => getAuth()),
provideDatabase(() => getDatabase())],
我的
ionic info
输出包含在下面。
Ionic:
Ionic CLI : 7.2.0 (/Users/username/.nvm/versions/node/v22.11.0/lib/node_modules/@ionic/cli)
Ionic Framework : @ionic/angular 6.7.5
@angular-devkit/build-angular : 16.2.16
@angular-devkit/schematics : 16.2.16
@angular/cli : 16.2.16
@ionic/angular-toolkit : 12.1.1
Capacitor:
Capacitor CLI : 6.2.0
@capacitor/android : 6.2.0
@capacitor/core : 6.2.0
@capacitor/ios : 6.2.0
Cordova:
Cordova CLI : not installed
Cordova Platforms : not available
Cordova Plugins : not available
Utility:
cordova-res : not installed globally
native-run : 2.0.1
System:
ios-sim : 8.0.2
NodeJS : v22.11.0 (/Users/username/.nvm/versions/node/v22.11.0/bin/node)
npm : 10.9.0
OS : macOS Unknown
Xcode : Xcode 16.0 Build version 16A242d
鉴于相同的代码适用于 Android 设备/模拟器和 Web,这似乎表明 iOS 缺少一些设置/配置。我重新安装了 ionic 的 iOS 平台,但这也没有帮助。
我一直在尝试各种组合,但没有错误,并且不确定如何调试或解决此问题。感谢社区的任何帮助/指导。
分辨率 对于遇到这个问题的人,我可以通过更改 app.module 中的这行代码来解决这个问题
provideAuth(() => getAuth())
到
provideAuth(() => {
if (Capacitor.isNativePlatform()) {
return initializeAuth(getApp(), {
persistence: indexedDBLocalPersistence
})
} else {
return getAuth()
}
})
对于遇到此问题的人,我可以通过更改 app.module 中的这行代码来解决此问题
provideAuth(() => getAuth())
到
provideAuth(() => {
if (Capacitor.isNativePlatform()) {
return initializeAuth(getApp(), {
persistence: indexedDBLocalPersistence
})
} else {
return getAuth()
}
})