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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:22