应用运行于/Applications目录时FileProvider无法加载问题咨询
问题表现
- 基于新版
NSFileProviderReplicatedExtension实现的功能完整应用,部署前从Xcode构建产物目录、~/Desktop目录启动时,FileProvider扩展运行正常,可正常添加域 - 将应用部署到
/Applications目录启动后,调用添加域接口失败,调用代码如下:
返回错误信息:[NSFileProviderManager addDomain:fileProviderDomain completionHandler:^(NSError * _Nullable error){}];Error Domain=NSFileProviderErrorDomain Code=-2001 "The application cannot be used right now." UserInfo={NSLocalizedDescription=The application cannot be used right now.} - 调用
addDomain的时间点,控制台会输出其他启动路径不会出现的沙盒报错:kernel Sandbox: fileproviderd(448) deny(1) file-read-data /Applications/TestFileProvider.app - 调整所有代码签名、沙盒相关构建设置,分别使用Objective-C、Swift两种语言实现验证,问题复现情况完全一致。
根因
macOS对/Applications目录下的应用执行更严格的沙盒访问校验,fileproviderd进程仅能读取通过系统安全校验的应用包。手动拷贝至/Applications的开发构建包,会因携带Quarantine隔离扩展属性、包结构不符合规范、签名校验不通过等问题,被沙盒拦截读取,最终触发域添加失败。桌面、Xcode构建产物目录不属于系统级应用目录,校验规则更宽松,因此不会出现该问题。
解决步骤
- 校验扩展包嵌入路径:确认FileProvider扩展正确嵌入到主应用包的
Contents/Extensions/目录下,不要错放到Plugins或其他目录,路径错误会直接导致fileproviderd无法在规范位置找到扩展二进制。 - 清除应用隔离属性:将应用放到
/Applications目录后,执行终端命令清除Quarantine扩展属性:sudo xattr -dr com.apple.quarantine /Applications/TestFileProvider.app - 确认签名合规:不要使用ad-hoc签名给部署到
/Applications的测试包,必须使用有效的开发/分发证书做递归签名,确保主应用与扩展的权限、App ID关联关系配置正确。 - 重启服务清缓存:执行命令重启
fileproviderd,清除之前的失败校验缓存:killall fileproviderd - 延迟接口调用:应用第一次从
/Applications启动时,不要启动后立刻调用addDomain接口,预留1-2秒等待系统完成应用的扩展注册流程,再执行域添加操作。
内容的提问来源于stack exchange,提问作者Marcel Vyberal
相关产品推荐
相关产品推荐

