Ionic Capacitor部署iOS时AngularFireAuth signInWithEmailAndPassword无回调
iOS端signInWithEmailAndPassword无回调问题解决方案
问题根因排查&修复步骤
- 修复代码逻辑错误:原有代码中路由跳转逻辑写在
else分支下的result != null判断内,当成功拿到用户对象时永远不会触发跳转,需要将跳转逻辑移动到用户存在的判断分支中。 - 移除冗余Promise包装:额外包裹的
new Promise会导致Zone.js在iOS端事件循环中可能无法正确捕获回调触发,改用async/await简化代码逻辑,避免嵌套Promise导致的执行异常。 - 手动指定Firebase Auth持久化策略:iOS端WebView默认的智能跟踪预防(ITP)会限制Firebase默认的会话存储策略,在调用登录方法前手动设置持久化类型为
local,规避存储限制导致的回调丢失。 - 调整Ionic WebView配置:
- Capacitor项目在
capacitor.config.ts中添加配置,关闭App Bound Domains限制:
ios: { limitsNavigationsToAppBoundDomains: false, webView: { allowFileAccessFromFileURLs: true, allowUniversalAccessFromFileURLs: true } }- 在iOS项目的
Info.plist中添加ATS配置,允许Firebase相关域名访问:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> <key>NSExceptionDomains</key> <dict> <key>firebaseapp.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>googleapis.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSAllowsArbitraryLoads</key> <true/> </dict> </dict> </dict> - Capacitor项目在
修复后参考代码
import { AngularFireAuth } from "@angular/fire/compat/auth"; async loginWithEmail(email: string, password: string) : Promise<void> { try { // 预先设置持久化策略解决iOS存储限制 await this.afAuth.setPersistence('local'); const res = await this.afAuth.signInWithEmailAndPassword(email, password); const user = res.user; if (user) { this._user.next(user); // 拿到用户后触发路由跳转 this.zone.run(() => { this.router.navigate(['tabs', 'home']); }); } } catch (error: any) { this.toastService.present({ message: error?.message || "Something has gone wrong. Please try again.", duration: 3000, color: "warning" }); console.error(error?.message); throw error; } }
内容的提问来源于stack exchange,提问作者d3Roux
相关产品推荐
相关产品推荐

