iOS 3D Touch小组件点击自动启动主App,寻求恢复原有行为方案
解决3D Touch唤起的Today小组件点击后自动打开主App的问题
我之前也碰到过完全一样的情况——升级iOS、macOS和Xcode后,通过3D Touch点击App图标唤起的Today Extension小组件,只要点击任意区域就会自动跳转到主App,但在Today视图里使用时却完全正常。后来折腾了几个方法终于搞定了,分享给你试试:
1. 拦截系统默认的点击跳转逻辑
现在系统对3D Touch唤起的小组件默认添加了点击跳转主App的规则,我们可以通过添加全屏手势识别器来拦截这个行为:
在你的TodayViewController的viewDidLoad方法里添加以下代码:
override func viewDidLoad() { super.viewDidLoad() // 添加全屏点击手势,拦截系统默认跳转 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleWidgetTap)) tapGesture.cancelsTouchesInView = false // 确保不影响小组件内部控件的正常交互 view.addGestureRecognizer(tapGesture) } @objc private func handleWidgetTap() { // 这里可以放置你小组件的功能逻辑,或者什么都不做 // 核心是不要调用任何打开主App的代码,拦截系统的默认跳转 }
这个手势会优先处理点击事件,阻止系统触发跳转主App的操作,同时cancelsTouchesInView = false能保证你小组件内部的按钮、交互控件依然可以正常工作。
2. 检查Extension的Info.plist配置
打开Today Extension的Info.plist文件,查看NSExtension -> NSExtensionAttributes节点下有没有设置WidgetURL或其他与跳转相关的属性。如果存在这类属性,直接删除即可——因为它会强制点击小组件打开指定URL,进而触发主App启动。
3. 临时验证版本适配问题(可选)
如果上面的方法没生效,可以尝试把Extension的Deployment Target暂时降到你之前功能正常的版本(比如iOS 15),验证是不是新版本系统的强制行为。不过这只是临时排查手段,长期来看还是前两个方法更稳妥。
亲测第一个方法就能解决问题,你可以先试试这个,应该就能恢复原来的行为——小组件完成所有功能但不会打开主App。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

