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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:15:32