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

WatchOS自定义动态通知界面仅接收时生效,如何禁用默认界面

解决WatchOS自定义通知界面在程序坞打开时显示默认界面的问题

我之前也碰到过一模一样的情况,折腾了好一阵才摸清楚几个关键的解决点,你可以按下面的步骤逐一排查:

1. 确认Info.plist的配置正确性

首先要确保WatchKit Extension的Info.plist里已经正确指定了自定义的通知界面控制器。找到WKUserNotificationInterfaceControllerClassName这个键,它的值应该是你的自定义类的完整路径,比如$(PRODUCT_MODULE_NAME).NotificationController——这里用$(PRODUCT_MODULE_NAME)是为了自动适配你的模块名,别直接写死,避免后续改模块名出问题。

如果这个配置错了或者压根没加,系统就会自动 fallback 到默认界面,尤其是从程序坞打开这种非实时接收的场景。

2. 绑定自定义控制器到静态界面(如果使用的话)

如果你项目里保留了Notification.storyboard这个静态通知界面,一定要把这个界面的ViewController关联到你的NotificationController类。很多人容易忽略这一点:实时接收通知时系统会优先调用动态控制器,但从程序坞打开时可能会先加载静态界面,如果静态界面没绑定自定义类,就会直接显示默认的操作栏。

要是你完全用代码实现动态界面,也可以直接删掉这个storyboard,减少系统 fallback 的可能性。

3. 完全接管界面与操作的实现

在你的NotificationController里,要确保彻底接管界面渲染和操作逻辑,不让系统有机会显示默认元素:

  • 重写didReceiveNotification:方法,在这里加载你自定义的界面内容,比如添加自定义视图、设置文本等,别依赖系统的默认布局。
  • 重写willActivate方法,在这里隐藏默认的操作按钮或者替换成你自己的操作控件:
override func willActivate() {
    super.willActivate()
    // 隐藏默认操作栏(根据你的实际布局调整尺寸)
    self.preferredContentSize = CGSize(width: self.contentFrame.width, height: self.contentFrame.height)
    // 或者直接添加自定义操作按钮到界面
    let customActionBtn = WKButton()
    customActionBtn.setTitle("我的自定义操作", for: .normal)
    customActionBtn.addTarget(self, action: #selector(customActionTapped), for: .touchUpInside)
    self.addSubview(customActionBtn)
    // 记得给按钮添加合适的约束
}

@objc private func customActionTapped() {
    // 处理自定义操作逻辑
    self.dismiss()
}

4. 配置自定义通知类别

系统的默认操作是和通知类别绑定的,所以你需要注册自己的通知类别,只包含你想要的操作,这样系统就不会显示那些你不想要的默认操作了:

// 在WatchKit Extension的初始化代码里(比如ExtensionDelegate的applicationDidFinishLaunching)
let customAction = UNNotificationAction(
    identifier: "myCustomAction",
    title: "自定义操作",
    options: []
)
let customCategory = UNNotificationCategory(
    identifier: "myNotificationCategory",
    actions: [customAction],
    intentIdentifiers: [],
    options: []
)
UNUserNotificationCenter.current().setNotificationCategories([customCategory])

然后发送通知的payload里要指定这个category字段,比如:

{
    "aps": {
        "alert": "测试通知",
        "category": "myNotificationCategory"
    }
}

这样不管是实时接收还是从程序坞打开,系统都会使用你的自定义类别对应的界面和操作。

5. 清理缓存与重新部署

有时候模拟器或设备的缓存会导致配置不生效,试试这些操作:

  • 重启Watch模拟器(或真机)
  • 删除设备上的应用,重新安装
  • 清理Xcode的Derived Data(Xcode -> Settings -> Locations -> Derived Data -> 点击箭头打开文件夹后删除对应项目的文件夹)

按这些步骤走下来,应该就能解决从程序坞打开通知时显示默认界面的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:58