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

Ionic iOS Capacitor本地通知代理方法未触发问题咨询

解决Capacitor iOS项目中UNUserNotificationCenter代理方法不触发的问题

你的代码在原生Demo中正常运行,但在Capacitor项目里代理方法完全不触发,核心原因在于Capacitor的AppDelegate生命周期逻辑、代理覆盖风险以及权限配置差异,以下是关键修复点:

1. 修正AppDelegate的继承与父类方法调用

Capacitor的AppDelegate必须继承自CAPAppDelegate,且必须在didFinishLaunchingWithOptions中优先调用父类初始化方法,否则Capacitor的核心初始化逻辑会被打断,导致代理设置失效。修改代码如下:

@UIApplicationMain
class AppDelegate: CAPAppDelegate, UNUserNotificationCenterDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 必须先调用Capacitor父类的初始化逻辑
        super.application(application, didFinishLaunchingWithOptions: launchOptions)
        
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
            if granted {
                print("Notification authorization granted")
            } else {
                print("Notification authorization denied")
            }
        }
       
        return true
    }
}

2. 补充Info.plist权限描述

Capacitor项目中,必须在Info.plist中添加通知权限的用途描述,否则系统会静默拒绝权限请求。添加以下键值对:

  • NSUserNotificationUsageDescription:填写通知用途(例如"接收任务提醒通知")
  • NSSoundUsageDescription:若使用通知声音,补充声音用途描述(例如"通知提醒声音")

3. 规避Capacitor通知插件冲突

如果你的项目安装了@capacitor/local-notifications插件,它会自动接管UNUserNotificationCenter的代理,覆盖你自定义的实现。若要完全用原生代码处理通知,需卸载该插件:

npm uninstall @capacitor/local-notifications
npx cap sync ios

若需保留插件,可通过插件提供的JS回调处理通知,不建议强行覆盖代理(易引发逻辑冲突)。

4. 确保通知调度方法被正确触发

确认scheduleNotification方法在正确时机被调用:

  • 测试阶段可在applicationDidBecomeActive中直接调用
  • 正式场景推荐通过Capacitor自定义插件从JS侧触发调用,示例如下:
@objc(NotificationPlugin)
public class NotificationPlugin: CAPPlugin {
    @objc func scheduleLocalNotification(_ call: CAPPluginCall) {
        let title = call.getString("title") ?? "默认标题"
        let body = call.getString("body") ?? "默认内容"
        let timeInterval = call.getDouble("timeInterval") ?? 5.0
        
        self.scheduleNotification(title: title, body: body, timeInterval: timeInterval)
        call.resolve()
    }
    
    func scheduleNotification(title: String, body: String, timeInterval: TimeInterval) {
        // 你的通知调度代码
    }
}

5. 主动校验权限状态

调度通知前主动检查权限,避免因权限未授予导致代理无响应:

UNUserNotificationCenter.current().getNotificationSettings { settings in
    if settings.authorizationStatus == .authorized {
        self.scheduleNotification(title: "测试", body: "这是一条测试通知", timeInterval: 5)
    } else {
        print("通知权限未授予")
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:12:45