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

如何在用户关闭系统通知设置时强制推送Local Notification?

嘿,这个问题我熟!你的代码之所以只有用户手动开了通知设置才生效,核心原因是iOS 10+ 要求应用必须先获得用户的通知权限授权,而你的代码里漏掉了权限请求的关键步骤。下面给你一步步解决:

完整解决方案

1. 先请求用户的通知权限

在发送任何通知前,必须先向用户申请权限。你可以在App启动时(比如AppDelegate的didFinishLaunchingWithOptions方法里),或者用户第一次完成录制这类需要触发通知的操作时执行这个请求:

import UserNotifications

@available(iOS 10.0, *)
func requestNotificationAuthorization() {
    let notificationCenter = UNUserNotificationCenter.current()
    // 请求弹窗、音效、角标权限,可根据需求调整选项
    notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
        if let error = error {
            print("请求通知权限出错:\(error.localizedDescription)")
        }
        // 可将granted结果存到本地,方便后续快速判断权限状态
    }
}

2. 完善通知发送逻辑,先检查权限再发送

在你原有的notifyUserNotification方法里,加上权限检查步骤,确保只有授权后才发送通知:

@available(iOS 10.0, *)
func notifyUserNotification() {
    let notificationCenter = UNUserNotificationCenter.current()
    
    // 先获取当前的通知设置状态
    notificationCenter.getNotificationSettings { settings in
        guard settings.authorizationStatus == .authorized else {
            // 权限未授权,这里可以提示用户去设置开启
            print("通知权限未开启,无法发送提醒")
            return
        }
        
        // 权限没问题,继续创建并发送通知
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let content = UNMutableNotificationContent()
        content.title = "You have a new Recording !!"
        content.subtitle = "You have recorded 10mins recording"
        content.sound = UNNotificationSound.default // 加上默认音效,提升用户感知
        
        // 给通知请求设置唯一ID,方便后续取消或更新通知
        let request = UNNotificationRequest(identifier: "NewRecordingAlert", content: content, trigger: trigger)
        
        notificationCenter.add(request) { error in
            if let error = error {
                print("添加通知请求失败:\(error.localizedDescription)")
            } else {
                print("录制提醒已成功安排")
            }
        }
    }
}

3. 引导用户前往设置开启权限

如果用户之前拒绝了权限,你可以在权限未通过的分支里,弹窗引导用户跳转到应用的通知设置页面:

// 把这段代码加到权限未授权的guard分支里
DispatchQueue.main.async {
    let alert = UIAlertController(
        title: "通知权限未开启",
        message: "请前往设置开启通知权限,这样你就能及时收到录制完成的提醒啦",
        preferredStyle: .alert
    )
    alert.addAction(UIAlertAction(title: "取消", style: .cancel))
    alert.addAction(UIAlertAction(title: "去设置", style: .default) { _ in
        guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return }
        if UIApplication.shared.canOpenURL(settingsURL) {
            UIApplication.shared.open(settingsURL)
        }
    })
    // 获取当前显示的ViewController弹窗,适配iOS 13+场景
    if let topVC = UIApplication.shared.connectedScenes
        .compactMap({ $0 as? UIWindowScene })
        .first?.windows
        .first?.rootViewController {
        topVC.present(alert, animated: true)
    }
}

几个关键提醒

  • iOS的通知权限完全由用户掌控,应用无法强制开启,只能友好引导用户手动设置
  • 建议在用户第一次触发需要通知的操作时请求权限(比如第一次录制完成时),而非App一启动就弹请求,这样用户更容易同意授权
  • 每次发送通知前都检查权限状态,避免代码执行失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:36