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要求的一致。比如可以把依赖设置为:
具体版本可以参考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' - 确认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
相关产品推荐
相关产品推荐

