OneSignal后台/关闭状态收不到推送及编译错误求助
问题解决:OneSignal编译报错+后台/关闭状态无法接收推送
一、先解决编译报错问题
编译报错的核心原因是缺少必要的Java类导入,你的NotificationServiceExtension.java中使用了多个未导入的Android/Java类,只需在文件顶部添加对应import语句即可修复:
1. 添加缺失的导入语句
在NotificationServiceExtension.java的package声明之后,添加以下代码:
import java.math.BigInteger; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.graphics.Color;
2. 修正后的完整示例代码
package com.bonfire.cdis; import com.onesignal.OSNotificationReceivedEvent; import com.onesignal.OneSignal; // 新增的导入语句 import java.math.BigInteger; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.graphics.Color; public class NotificationServiceExtension implements OneSignal.OSNotificationReceivedHandler { @Override public void notificationReceived(OSNotificationReceivedEvent event) { var notification = event.getNotification(); var builder = notification.getNotificationCompatBuilder(); // 设置通知图标颜色 builder.setColor(new BigInteger("FF00FF00", 16).intValue()); // 修改标题颜色为红色 Spannable spannableTitle = new SpannableString(notification.getTitle()); spannableTitle.setSpan(new ForegroundColorSpan(Color.RED), 0, notification.getTitle().length(), 0); builder.setContentTitle(spannableTitle); // 修改内容颜色为蓝色 Spannable spannableBody = new SpannableString(notification.getBody()); spannableBody.setSpan(new ForegroundColorSpan(Color.BLUE), 0, notification.getBody().length(), 0); builder.setContentText(spannableBody); // 完成通知处理 event.complete(builder.build()); } }
二、解决后台/应用关闭时无法接收推送的问题
1. 检查Manifest配置完整性
确保AndroidManifest.xml中包含OneSignal所需的全部权限和组件:
<!-- 基础权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Android 13+ 通知权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- OneSignal核心服务与接收器 --> <service android:name="com.onesignal.GcmIntentService" /> <service android:name="com.onesignal.SyncService" android:stopWithTask="false" /> <service android:name="com.onesignal.NotificationRestoreService" /> <receiver android:name="com.onesignal.BootUpReceiver" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> <!-- 已配置的Extension元数据,确认包名类名完全匹配 --> <meta-data android:name="com.onesignal.NotificationServiceExtension" android:value="com.bonfire.cdis.NotificationServiceExtension" />
2. 配置通知渠道(Android 8.0+)
确保应用初始化时正确配置通知渠道,OneSignal默认会创建,但需保证渠道处于启用状态:
// Flutter端初始化代码示例 import 'package:onesignal_flutter/onesignal_flutter.dart'; void initOneSignal() async { await OneSignal.shared.init( "你的OneSignal App ID", iOSSettings: { OSiOSSettings.autoPrompt: true, OSiOSSettings.inAppLaunchUrl: true } ); // 可选:自定义通知渠道(如果需要) await OneSignal.shared.setNotificationChannelSettings( OSNotificationChannel( id: "default_channel", name: "默认通知", description: "接收所有推送通知", importance: OSNotificationChannelImportance.High, enableVibration: true ) ); }
3. 解除设备后台限制
国产安卓厂商(小米、华为、OPPO等)会默认限制应用后台运行,需引导用户开启:
- 关闭电池优化(设置→电池→应用电池优化→找到你的应用→选择不优化)
- 开启自启动权限(设置→应用管理→你的应用→权限→自启动)
- 允许后台弹出界面(部分厂商需要此权限才能在后台显示通知)
4. 确保推送消息优先级
在发送推送时设置高优先级,保证后台/关闭状态下能唤醒设备:
- OneSignal控制台发送:选择「High」优先级
- API发送:添加参数
android_priority: "high"
5. 版本兼容性检查
你使用的OneSignal Flutter SDK 3.4.2需确保对应Android原生SDK版本兼容,若问题仍存在,建议升级到最新稳定版本(需注意版本适配)。
内容的提问来源于stack exchange,提问作者VDTe
相关产品推荐
相关产品推荐

