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

Flutter Local Notification在iOS上通知遗漏/停止问题求助

iOS端flutter_local_notifications调度通知失效问题排查与解决

针对你遇到的iOS端通知初始正常、后续遗漏直至完全停止的问题(Android端正常),结合flutter_local_notifications 13.0.0的特性和iOS系统限制,给出以下排查方向和解决方案:

核心排查方向(iOS系统特有限制)

1. 通知ID重复导致调度任务被覆盖

iOS系统中,若使用相同ID调度多个本地通知,新的调度会直接覆盖旧的任务,导致旧任务无法触发。

  • 检查你的调度逻辑:确保4天内的每日通知使用唯一ID(例如第1天用1,第2天用2,以此类推)。
  • 代码示例调整:
    // 为每日通知分配唯一ID
    await zonedScheduleNotification(1, "Day1通知", "内容...", scheduledDay1, "key1");
    await zonedScheduleNotification(2, "Day2通知", "内容...", scheduledDay2, "key2");
    await zonedScheduleNotification(3, "Day3通知", "内容...", scheduledDay3, "key3");
    await zonedScheduleNotification(4, "Day4通知", "内容...", scheduledDay4, "key4");
    

2. iOS后台权限未配置,系统清理调度任务

iOS对后台应用的限制严格,若未开启后台刷新权限,系统可能会清理应用的本地通知调度任务。

  • 配置步骤:
    1. 打开Xcode,进入项目target的Signing & Capabilities标签;
    2. 添加Background Modes能力,勾选Background fetch和Remote notifications;
    3. 在Info.plist中添加以下配置:
      <key>UIBackgroundModes</key>
      <array>
          <string>fetch</string>
          <string>remote-notification</string>
      </array>
      

3. 时区配置或调度时间错误

虽然你调用了_configureLocalTimeZone,但需确认时区初始化和调度时间的正确性:

  • 确保_configureLocalTimeZone中正确执行了时区初始化:
    Future<void> _configureLocalTimeZone() async {
      await tz.initializeTimeZones();
      final location = await tz.getLocation('Asia/Shanghai'); // 替换为你的时区
      tz.setLocalLocation(location);
    }
    
  • 确认scheduleDateTime是未来的有效时间,避免设置为过去时间导致调度直接失效。

4. 通知权限状态异常

即使初始权限已授予,用户后续可能在系统设置中关闭通知权限,或权限请求未完全生效:

  • 在应用启动时主动检查并重新请求权限:
    final settings = await flutterLocalNotificationsPlugin.getNotificationAppSettings();
    if (!settings.alertPermission || !settings.soundPermission) {
      await flutterLocalNotificationsPlugin.requestPermissions(
        iOS: const DarwinNotificationPermissions(
          alert: true,
          sound: true,
          badge: true,
        ),
      );
    }
    
  • 在Info.plist中添加权限申请描述(避免被系统拒绝权限):
    <key>NSLocalNotificationUsageDescription</key>
    <string>需要发送通知提醒您完成每日任务</string>
    <key>NSNotificationSettingsUsageDescription</key>
    <string>需要访问通知设置以确保提醒正常推送</string>
    

5. 系统重启或应用重装导致调度丢失

iOS系统重启、应用卸载重装后,所有本地通知调度会被清除,需在应用启动时重新调度未触发的通知:

  • 将需要调度的通知信息(日期、标题、内容等)存储在本地(如SharedPreferences、Hive);
  • 应用启动时读取存储的信息,重新调用zonedSchedule生成调度任务。

额外优化建议

  • 升级flutter_local_notifications到最新稳定版本:13.0.0可能存在iOS端的调度bug,后续版本已修复部分问题;
  • 避免过度依赖InterruptionLevel.timeSensitive:该特性仅支持iOS 15+,若用户设备系统版本较低,需降级处理;
  • 检查是否有代码主动取消通知:确认未在后台逻辑中调用cancelAllNotifications或cancel(int id)导致任务被清除。

内容的提问来源于stack exchange,提问作者abd_1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:51