最近在做一个SwiftUI与UIKit混合开发的测试demo时需要使用到SnapKit这个库,但是当我使用pod引入完成却出现了编译错误,具体错误信息如下:
****
Sandbox: rsync.samba(20803) deny(1) file-read-data /Users/zm/Library/Developer/Xcode/DerivedData/SwiftUIAndUIKitMixDemo-dkwokcbxrbbsefclzmcydjcrmwzs/Build/Products/Debug-iphonesimulator/SwiftUIAndUIKitMixDemo.app/Frameworks/SnapKit.framework/SnapKit_Privacy.bundle
经过分析Sandbox、permitted等关键词,大致猜测到是和沙盒访问权限有关,于是搜索相关文档发现,可以通过如下方式解决:选中项目文件 -> Targets -> Build Settings -> 搜索UserScriptSandboxing 然后将值设置 NO, clean一下,即可运行正常。
可是UserScriptSandboxing这个配置项到底什么意思,为什么配置后就不报错了,报错具体原因是什么?接下来给大家具体分析一下。
在 Xcode 的 Build Settings 里,UserScriptSandboxing 选项用于控制用户脚本执行时的沙盒机制。那关于什么是沙盒机制呢,相信大部分iOS开发人员都知道,我们复习一下:沙盒是一种安全机制,它为应用程序或脚本提供了一个受限的运行环境,限制其对系统资源(如文件系统、网络等)的访问,从而增强系统的安全性,防止恶意脚本或有潜在风险的脚本对系统造成损害。
那苹果官方在项目创建是默认设置UserScriptSandboxing为YES的作用是什么呢?
- 限制文件系统访问:当 UserScriptSandboxing 启用时,用户脚本只能访问其被允许访问的文件和目录。例如,脚本无法随意读取或修改系统关键文件(如 /etc 目录下的配置文件),也不能在未经授权的情况下创建或删除文件。这可以防止脚本意外或恶意地破坏系统文件,保护系统的稳定性和安全性。
- 限制网络访问:脚本的网络访问也会受到限制。它不能随意连接到外部服务器,发起网络请求。这有助于防止脚本将敏感数据泄露到外部,或者成为网络攻击的载体,如发起分布式拒绝服务(DDoS)攻击等。
- 系统资源使用限制:沙盒机制可以限制脚本对系统资源(如 CPU、内存等)的使用。例如,脚本不能无限制地占用 CPU 资源,导致系统性能下降。如果脚本试图进行资源密集型操作,超过了沙盒所允许的范围,系统会对其进行限制或终止,从而保证整个系统的正常运行。
- 减少外部干扰:通过限制脚本的访问权限,可以减少脚本与外部环境的交互,使构建过程更加可预测。因为脚本只能在一个相对封闭的环境中运行,不会受到外部因素(如网络状况、文件系统变化等)的过多影响,从而提高构建的稳定性和一致性。
- 当UserScriptSandboxing字段启用(YES):当设置为 YES 时,用户脚本将在沙盒环境中运行,上述的安全限制和资源管理机制将生效。
- 当UserScriptSandboxing字段禁用(NO):当设置为 NO 时,脚本将以不受沙盒限制的方式运行。这种情况下,脚本可以自由访问系统资源,但同时也增加了安全风险,一般不建议在生产环境中使用。