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

React Native中Firebase与APNS令牌不一致及推送实现方案咨询

令牌不一致的原因

两种方式获取的令牌属于不同类型的推送标识:

  • React Native端通过firebase.messaging().getAPNSToken()拿到的是Firebase处理后的FCM兼容APNS令牌,格式为带冒号的Base64字符串(如你输出的f0sns4E3NxxxxxxxxTd:APA00bG-...)。Firebase会对苹果返回的原始APNS令牌做格式转换,生成符合FCM跨平台推送协议的标识。
  • iOS原生代码获取的是苹果APNS服务直接返回的原始设备令牌,格式为纯十六进制字符串(如你输出的XXXXXXXX51b9aeXXXXX...),这是未经过第三方转换的原生设备标识。
基于Firebase实现推送的正确做法

直接使用React Native Firebase提供的getAPNSToken()方法获取的令牌即可,理由如下:

  • Firebase Cloud Messaging (FCM) 服务仅接受经过其适配的令牌格式,RN端返回的令牌已经是处理好的,直接上传到你的后端服务,调用FCM推送API时使用该令牌就能正常向iOS设备发送推送。
  • 若使用原生原始令牌,还需要额外调用Firebase的API将其转换为FCM令牌,增加不必要的开发步骤。
  • 注意:确保iOS端已完成Firebase配置——在Firebase控制台上传正确的APNs证书,且RN项目已正确集成@react-native-firebase/messaging依赖。

代码示例整理

React Native端获取FCM兼容令牌的代码:

const getDeviceToken = await firebase.messaging().getAPNSToken();
if (getDeviceToken) {
  console.log('FCM兼容的APNS令牌:', getDeviceToken);
  // 将此令牌上传至后端存储,用于后续推送调用
}

iOS原生获取原始APNS令牌的代码(仅作参考,无需用于Firebase推送流程):

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *strDeviceToken = [self fetchDeviceToken:deviceToken];
    NSLog(@"原始APNS令牌 =>%@", strDeviceToken);
}

- (NSString *)fetchDeviceToken:(NSData *)deviceToken {
    NSUInteger len = deviceToken.length;
    if (len == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(len * 2)];
    for (int i = 0; i < len; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:05:25