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
相关产品推荐
相关产品推荐

