Ionic 3中OneSignal推送通知:如何后台无需点击获取数据?
解决Ionic 3中OneSignal后台无需点击通知获取数据的问题
我来帮你搞定这个问题!在Ionic 3里使用OneSignal时,后台状态下不用点击通知就能拿到数据,核心是要调整通知的发送配置和客户端的事件监听逻辑,下面一步步来实现:
1. 确认客户端的OneSignal初始化与事件监听
首先,确保你在Ionic项目里正确初始化了OneSignal,并且同时监听了handleNotificationReceived和handleNotificationOpened两个事件——前者会在通知被接收时触发(不管前台/后台,只要配置正确),后者是点击通知时触发。
示例初始化代码(可以放在app.component.ts的platform.ready()里):
import { OneSignal } from '@ionic-native/onesignal'; constructor(private oneSignal: OneSignal) { platform.ready().then(() => { // 初始化OneSignal this.oneSignal.startInit('YOUR_APP_ID', 'YOUR_GOOGLE_PROJECT_NUMBER'); // 监听通知接收事件(关键:后台也能触发的前提是通知配置正确) this.oneSignal.handleNotificationReceived().subscribe((notification) => { console.log('通知已接收(后台/前台都可能触发):', notification); // 在这里处理你的通知数据,比如保存到本地、更新UI等 this.processNotificationData(notification.payload.additionalData); }); // 监听通知点击事件(保留这个处理点击的场景) this.oneSignal.handleNotificationOpened().subscribe((openedResult) => { console.log('通知被点击:', openedResult); this.processNotificationData(openedResult.notification.payload.additionalData); }); this.oneSignal.endInit(); }); } // 封装数据处理逻辑 private processNotificationData(data: any) { if (data) { // 这里写你的业务逻辑,比如推送本地通知、更新页面数据等 console.log('处理通知数据:', data); } }
2. 调整服务器端的通知发送配置
这是关键!默认情况下,OneSignal发送的是显示通知,后台状态下只会弹出通知,不会触发handleNotificationReceived。你需要在发送通知时添加以下参数,让通知在后台也能被客户端直接接收:
针对Android:
- 设置
priority: high:确保通知能被后台的应用接收 - 包含
additionalData字段:存放你需要传递的自定义数据
针对iOS:
- 设置
content_available: true:开启后台通知接收权限 - 设置
mutable_content: true(如果需要处理富媒体通知) - 同样包含
additionalData字段
示例服务器端发送的JSON payload(以OneSignal REST API为例):
{ "app_id": "YOUR_APP_ID", "included_segments": ["All"], "contents": {"en": "前台显示的通知内容"}, "headings": {"en": "通知标题"}, // 关键参数:让后台能接收 "content_available": true, "priority": 10, // 你的自定义数据 "data": { "type": "update", "message": "这是后台就能拿到的自定义数据" } }
3. 确认应用的后台权限配置
Android:
确保你的AndroidManifest.xml里已经添加了必要的权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
iOS:
在config.xml里添加推送权限配置:
<feature name="OneSignal"> <param name="ios-package" value="OneSignal" /> </feature> <platform name="ios"> <config-file parent="UIBackgroundModes" platform="ios" target="*-Info.plist"> <array> <string>remote-notification</string> </array> </config-file> </platform>
4. 测试注意事项
- 测试后台状态时,要确保应用完全退到后台(不是在前台最小化,而是按Home键退出)
- iOS设备需要开启“通知”权限,并且允许“后台刷新”(在设置->你的应用里开启)
- Android设备要确保应用没有被系统杀死(有些厂商的后台管理会限制推送接收)
这样配置后,当应用处于后台时,只要服务器发送的通知包含了content_available和priority参数,客户端的handleNotificationReceived事件就会自动触发,你就能在无需点击通知的情况下获取并处理通知数据啦!
内容的提问来源于stack exchange,提问作者Nupur
相关产品推荐
相关产品推荐

