FinderSync扩展与主应用:扩展通知无法被主应用接收
解决FinderSync扩展(沙箱化)与未沙箱化主应用的分布式通知互通问题
问题分析
核心矛盾在于:沙箱化的FinderSync扩展与未沙箱化的主应用之间,仅配置相同App Groups无法实现分布式通知互通。这是因为沙箱环境对分布式通知的发送、接收有额外限制,非沙箱应用的通知接收逻辑也和沙箱应用存在差异。
关键解决方案
1. 规范通知命名空间
扩展发送的通知名称必须以你的App Group ID作为前缀,确保通知被限定在指定的App Group范围内。例如你的App Group是group.com.iliakan.FinderMenu,通知名称可设为group.com.iliakan.FinderMenu.menuItemClicked。
2. 扩展端发送通知的正确写法
在扩展中调用DistributedNotificationCenter时,必须添加.deliverImmediately选项——沙箱环境下默认的通知投递策略会导致通知被过滤或延迟:
let notificationName = Notification.Name("group.com.iliakan.FinderMenu.menuItemClicked") DistributedNotificationCenter.default().post( name: notificationName, object: nil, userInfo: ["item": "clickData"], options: .deliverImmediately )
3. 主应用端接收通知的配置
主应用(未沙箱化)无需额外配置App Group相关的通知中心参数,直接使用默认的DistributedNotificationCenter注册通知即可,但要保证通知名称与扩展发送的完全一致:
let notificationName = Notification.Name("group.com.iliakan.FinderMenu.menuItemClicked") DistributedNotificationCenter.default().addObserver( self, selector: #selector(handleMenuClick(_:)), name: notificationName, object: nil ) @objc func handleMenuClick(_ notification: Notification) { // 处理扩展发来的点击事件 if let userInfo = notification.userInfo { print("收到扩展通知:\(userInfo)") } }
4. 验证App Groups配置的正确性
即使主应用未沙箱化,也必须在其授权文件(*.entitlements)中添加App Groups权限并勾选正确的组ID,确保和扩展的配置完全一致:
- 主应用授权文件需包含:
<key>com.apple.security.application-groups</key> <array> <string>group.com.iliakan.FinderMenu</string> </array> - 扩展的授权文件中同样要有完全相同的配置,且已开启沙箱权限。
5. 调试与验证步骤
- 确认FinderSync扩展已正确加载:打开Finder,右键点击文件/文件夹,查看是否显示你的扩展菜单项。
- 主应用需处于运行状态(后台也可),避免被系统挂起导致无法接收通知。
- 在发送、接收代码中添加日志,确认通知是否被发送、主应用是否触发回调。
内容的提问来源于stack exchange,提问作者Ilya Kantor
相关产品推荐
相关产品推荐

