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

