Flutter应用集成OneSignal后前台收到通知但不显示问题求助
问题原因与解决方案
核心原因排查
- 从你提供的日志中
Notification display type: 7可以确认,OneSignal SDK当前被设置为前台接收通知后不展示,属于配置未生效导致的异常 - Android 13(API 33+)的通知权限未动态申请:即使后台能收到通知,前台弹窗需要用户主动授予
POST_NOTIFICATIONS运行时权限,未授权的情况下系统会拦截前台通知弹出,只会静默接收 - OneSignal初始化时未开启前台通知展示配置:部分版本的OneSignal Flutter SDK默认会禁用前台通知弹出,需要额外配置开启
- 通知通道配置异常:如果App的通知通道被用户手动关闭、或者通道优先级设置低于
IMPORTANCE_HIGH,前台通知不会弹出只会被系统静默接收 - 前台处理逻辑存在版本兼容问题:部分旧版本SDK下直接传递
event.notification会被识别为不展示的配置项
修复步骤
- 动态申请Android通知权限
在android/app/src/main/AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
在应用启动后的合适时机(比如首页initState)调用权限申请,可配合permission_handler库实现:
if (Platform.isAndroid && await Permission.notification.isDenied) { await Permission.notification.request(); }
- 调整OneSignal前台通知处理逻辑
修改你的前台处理回调,明确开启前台通知展示功能:
OneSignal.shared.setNotificationWillShowInForegroundHandler( (OSNotificationReceivedEvent event) { // 明确指定要展示通知,传入null则为不展示 event.complete(event.notification); } ); // 额外添加初始化时的前台展示配置,强制SDK开启该功能 OneSignal.shared.setForegroundNotificationsEnabled(true);
- 配置高优先级通知通道
在Android端MainActivity的onCreate方法中创建高优先级通知通道,确保通知能正常弹窗:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( "onesignal_default", "默认通知", NotificationManager.IMPORTANCE_HIGH ).apply { description = "应用通知推送通道" enableVibration(true) lightColor = Color.BLUE lockscreenVisibility = Notification.VISIBILITY_PUBLIC } val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) }
- 适配高版本SDK写法
如果你使用的是OneSignal Flutter SDK 5.x以上版本,前台回调方法有调整,需要对应修改:
// 5.x版本专属写法 OneSignal.Notifications.addForegroundWillDisplayListener { event -> event.notification.display() }
内容的提问来源于stack exchange,提问作者Emir Kutlugün
相关产品推荐
相关产品推荐

