You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic/Angular中Capacitor capacitorDidRegisterForRemoteNotifications事件未触发

解决Capacitor Push Notifications iOS端注册失败问题

问题现象

Ionic Angular应用使用Capacitor官方推送插件实现双平台推送,Android端功能正常,但iOS端始终无法触发capacitorDidRegisterForRemoteNotifications事件,Xcode终端报错:

[error] - ERROR {"errorMessage":"event capacitorDidRegisterForRemoteNotifications not called.  Visit https://capacitorjs.com/docs/apis/push-notifications for more information"}

导致无法完成推送注册及令牌同步到后端。

修复步骤

1. 修正AppDelegate.swift的令牌传递逻辑

Capacitor需要原始APNS设备令牌而非Firebase FCM令牌,且异步回调可能导致事件丢失。修改didRegisterForRemoteNotificationsWithDeviceToken方法:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // 将APNS令牌传给Firebase
    Messaging.messaging().apnsToken = deviceToken
    
    // 直接转换APNS令牌为字符串,同步发送Capacitor注册事件
    let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: tokenString)
    
    // 可选:单独获取Firebase令牌用于后端(如需)
    Messaging.messaging().token(completion: { (fcmToken, error) in
        if let error = error {
            print("获取Firebase令牌失败: \(error.localizedDescription)")
        } else if let fcmToken = fcmToken {
            print("Firebase令牌: \(fcmToken)")
            // 可在此处同步FCM令牌到后端
        }
    })
}

2. 移除重复的监听器注册

app.component.ts中已初始化推送监听器,登录逻辑里重复注册会引发冲突,删除submit函数内以下代码:

await PushNotifications.addListener('registration',(token: Token) => {
  Device.getId().then((id:DeviceId) => {
      _self.userService.registerFcm(token, id)
    }
  )
});
await PushNotifications.addListener('registrationError',(error:any) => {
  console.log('PUSH NOTIFICATION ERROR', error.error);
});

3. 验证iOS项目核心配置

  • 在Xcode的Signing & Capabilities中确认已添加Push Notifications能力
  • 确认GoogleService-Info.plist已正确导入项目,且文件中BUNDLE_ID与项目Bundle ID完全匹配
  • 使用真实iOS设备测试(模拟器不支持远程推送)
  • 确保用户已授予App推送权限(requestPermissions返回receive: 'granted')

4. 调整推送注册时机

在App初始化阶段提前完成权限检查与注册,保证监听器先于注册生效。修改app.component.ts的initializeApp方法:

async initializeApp() {
    // 原有多语言初始化逻辑...

    // 非Web端处理推送
    const deviceInfo = await Device.getInfo();
    if (deviceInfo.platform !== "web") {
        const permissionStatus = await PushNotifications.checkPermissions();
        if (permissionStatus.receive === 'granted') {
            await PushNotifications.register();
        } else {
            const requestResult = await PushNotifications.requestPermissions();
            if (requestResult.receive === 'granted') {
                await PushNotifications.register();
            }
        }
    }
}

登录成功后无需重复调用注册,监听器会自动捕获令牌并同步到后端。

内容的提问来源于stack exchange,提问作者BarBarBinks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:17:35