Flutter应用后台关闭后无法接收OneSignal通知的问题排查
华为设备关闭/划走应用后仍无法接收OneSignal通知,已尝试现有方案求补充配置
我遇到的问题和Stack Overflow上的《华为设备上应用关闭或划走后无法接收通知?》重复,已经试过该问题下的所有解决方案,但关闭应用后还是收不到OneSignal通知,想问问是不是还有遗漏的配置?
以下是我的Gradle配置:
android/build.gradle
buildscript { ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() gradlePluginPortal() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.10, 0.99.99]' } } allprojects { repositories { google() mavenCentral() jcenter() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(':app') } task clean(type: Delete) { delete rootProject.buildDir }
android/app/build.gradle
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin' buildscript { repositories { // ... maven { url 'https://plugins.gradle.org/m2/' } // Gradle Plugin Portal } dependencies { // ... // OneSignal-Gradle-Plugin classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.10, 0.99.99]' } } android { compileSdkVersion 32 ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.onesignal_notif" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 21 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug } } } flutter { source '../..' } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.onesignal:OneSignal:[4.0.0, 4.99.99]' }
可能遗漏的配置项
1. 华为系统权限手动配置
华为设备后台进程限制严格,必须引导用户开启以下权限:
- 自启动权限:进入手机设置「应用管理」→ 你的应用 →「启动管理」,关闭「自动管理」,开启「手动管理」并勾选「允许自启动」「允许后台活动」「允许关联启动」
- 后台锁定:多任务界面长按应用卡片,选择「锁定」,避免被系统主动清理
2. OneSignal华为推送集成补充
OneSignal依赖HMS Core实现华为设备后台通知,需完成以下配置:
- 在
android/app/build.gradle的defaultConfig中添加华为App ID:manifestPlaceholders = [ onesignal_app_id: "你的OneSignal App ID", onesignal_google_project_number: "REMOTE", huawei_app_id: "你的华为开发者平台App ID" ] - 将华为开发者平台下载的
agconnect-services.json文件放置在android/app目录下
3. 通知渠道配置(Android 8.0+)
Android 8.0及以上系统必须配置通知渠道,可在初始化代码中手动添加:
// 在Flutter的MainActivity中添加 OneSignal.initWithContext(this) OneSignal.setAppId("你的OneSignal App ID") // 创建高优先级通知渠道 val channel = NotificationChannel( "onesignal_default", "OneSignal通知", NotificationManager.IMPORTANCE_HIGH ) channel.description = "接收OneSignal推送通知" val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel)
4. Release包混淆规则
如果是Release编译包,需在android/app/proguard-rules.pro中添加混淆规则:
# OneSignal相关 -keep class com.onesignal.** { *; } -dontwarn com.onesignal.** # HMS Core相关 -keep class com.huawei.** { *; } -dontwarn com.huawei.**
5. OneSignal初始化时机检查
确保在应用启动时尽早初始化OneSignal,比如在Flutter的main()函数中:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await OneSignal.shared.setAppId("你的OneSignal App ID"); runApp(MyApp()); }
6. 依赖版本更新
当前使用的OneSignal版本范围[4.0.0, 4.99.99]虽兼容targetSdkVersion 31,但建议更新到最新稳定版(如4.15.0),避免版本兼容问题
内容的提问来源于stack exchange,提问作者wahyu
相关产品推荐
相关产品推荐

