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

React Native OneSignal Android推送Token为空及Google Play服务报错求助

排查react-native-onesignal推送token为空及Google Play服务错误问题

咱们先从Google Play服务的错误入手,这个问题基本是导致推送token为空的核心原因,尤其是Android设备上:

一、解决Google Play服务库错误

  • 更新设备上的Google Play服务:打开Google Play商店,搜索“Google Play服务”,确保它是最新版本,旧版本经常会和第三方推送库不兼容。
  • 检查项目依赖版本匹配:
    打开项目的android/build.gradle(项目级)和android/app/build.gradle(模块级),确保Google Play服务相关依赖的版本和OneSignal要求的一致。比如可以把依赖设置为:
    // 在项目级build.gradle的dependencies里
    classpath 'com.google.gms:google-services:4.3.10'
    // 在模块级build.gradle的dependencies里
    implementation 'com.google.android.gms:play-services-base:17.6.0'
    
    具体版本可以参考OneSignal官方文档的推荐,避免版本冲突。
  • 确认AndroidManifest配置:
    确保AndroidManifest.xml里添加了Google Play服务的meta-data:
    <application ...>
      <meta-data 
          android:name="com.google.android.gms.version" 
          android:value="@integer/google_play_services_version" />
    </application>
    
  • 模拟器的特殊处理:如果你用的是Android模拟器,一定要选择带Google APIs的系统镜像(不要选纯Android的镜像),否则模拟器本身就没有Google Play服务。

二、修复推送token为空的问题

在解决完Google Play服务的问题后,再调整你的代码和配置:

1. 移除不必要的方法调用

在Android平台上,OneSignal.registerForPushNotifications()是不需要手动调用的,OneSignal会自动处理推送权限的申请,手动调用反而可能导致初始化异常。把这一行代码删掉:

async componentDidMount() {
  const { currentState } = AppState;
  OneSignal.init(ONESIGNAL_APP_ID);
  OneSignal.configure();
  // 删掉下面这一行
  // OneSignal.registerForPushNotifications();
  OneSignal.addEventListener('received', this.onReceived);
  OneSignal.addEventListener('opened', this.onOpened);
  OneSignal.addEventListener('ids', this.onIds);
}

onReceived = (notification) => {
  console.log("Notification received: ", notification);
};

onOpened = (openResult) => {
  console.log('Message: ', openResult.notification.payload.body);
  console.log('Data: ', openResult.notification.payload.additionalData);
  console.log('isActive: ', openResult.notification.isAppInFocus);
  console.log('openResult: ', openResult);
};

onIds = (device) => {
  console.log('Device info: ', device);
};

2. 检查基础配置

  • 确认ONESIGNAL_APP_ID完全正确,是从OneSignal官网对应应用的设置里复制过来的,没有拼写错误。
  • 确保AndroidManifest.xml里添加了必要的权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    

3. 验证回调触发

运行项目后,查看控制台的Device info日志,如果onIds回调没有触发,说明初始化还是有问题,可以尝试:

  • 确保设备有稳定的网络连接,token需要从OneSignal服务器获取。
  • 重启设备和项目,有时候缓存会导致初始化失败。

最后测试

先解决Google Play服务的问题,再调整代码,重新运行项目,应该就能在onIds回调里看到正常的device token了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:13:40