文章目录[隐藏]
如果你了解 iOS 开发,沙盒(Sandbox)的概念并不陌生,iOS 的安全、流畅都得益于沙盒机制。但是如果你你是前端开发者,用 Electron做了一款 App 想提交到 Mac App Store,沙盒机制可能会给你带来很大的限制,你的应用在本地跑的好好的,但是提交到 App Store 之后会被拒绝。
### **Guideline 2.4.5(i) - Performance**
Your app incorrectly implements sandboxing, or it contains one or more entitlements with invalid values. Please review the included entitlements and sandboxing documentation and resolve this issue before resubmitting a new binary.
可以参考苹果给的文档:
这时候你就开始去了解这个沙盒到底是什么,怎么满足沙盒要求等一系列问题涌上心头。
我踩过的坑
最近为了学习 Electron 练手,开发了一款 "Git Push 日历热图“的应用,起名叫GitHeat
,开发完之后,觉得顺便上架一下 Mac App Store,结果打包提交之后,第二天被拒绝了。
原因是没有按 Sandbox 要求实现,有多处错误。
后来我通过TestFlight
下载试用发现,很多功能点击无效,我打开控制台看到如下:
这是因为我在应用中,用了child_process
调用了git
命令, 看到这个错误,就想到这个是沙盒不允许的。
接下来我想着用 node.js 直接将 git 功能打包到程序中,找到了simple-git
simple-git - npm
挺好用的,该有的功能都能实现,花了大半天修改代码,提交上去发现还是报错。
从这个错来看,simple-git
底层还是用到了 git 命令,是沙盒不允许的。
到这儿,我想继续找看有没有纯净的 git
库,找到了isomorphic-git
,nodegit
, 由于isomorphic-git
是纯 js 的,安装简单,就先选用这个库进行了代码改写。
当改写到git push
的时候,我发现不对劲了,git push
需要权限认证,之前调用 git 命令不需要,现在在 Sandbox 环境下,就不得不自行认证了,自行认证对于一个 git 管理项目来说,使用起来就不会那么方便。
沙盒(Sandbox)的概念
沙盒是一种安全机制,它将应用程序限制在一个受保护的环境中,以防止应用程序对系统和其他应用程序造成潜在的威胁。在 Mac 系统中,沙盒是通过应用程序沙盒化来实现的。这意味着应用程序只能访问被系统授权的文件和资源,并且不能超出其沙盒所允许的范围。
具体来说,在 Mac 系统中,每个沙盒化的应用程序都有一个独立的安全容器,其中包含了应用程序运行所需的所有资源和文件。这个容器是由系统自动创建并管理的,包括文件系统、网络、进程间通信等方面均有限制。这样一来,即使应用程序被攻击或感染了恶意软件,也只能在其自己的沙盒中受到影响,而不会对整个系统产生影响。
总之,Mac 下沙盒机制提高了系统和用户数据的安全性,防止了恶意软件和攻击者对系统造成破坏。
MacOS App Store 下的沙盒
下面是对 macOS App Store 沙盒的简单的说明:
1. 权限限制
沙盒限制了应用程序的访问权限,以防止恶意行为和安全问题。比如,应用程序只能访问自己的文件,不能访问其他应用程序的文件,以及用户的敏感数据(如照片或文档)。这样可以确保你的应用程序不会无意间读取或修改其他应用程序的数据。
例如,你的应用程序无法访问用户的桌面上的文件,也无法访问其他应用程序存储的数据,如邮件客户端的邮件数据库。
2. 文件系统访问
沙盒中的应用程序只能访问特定的目录和文件。它们无法直接访问其他应用程序的文件或系统的关键文件。这样可以防止恶意软件修改系统文件或访问用户敏感的个人文件。
例如,你的应用程序只能访问自己的应用程序容器内的文件,如 ~/Library/Containers/com.yourapp
,而无法访问其他应用程序的容器。
3. 网络访问
沙盒应用程序的网络访问受到限制。它们只能通过系统提供的网络接口访问网络资源,并受到网络权限的限制。这可以防止应用程序进行未经授权的网络通信或尝试连接到恶意服务器。
例如,你的应用程序可能无法直接访问特定的网络端口,如数据库服务器的默认端口 3306,以保护用户的数据库安全。
4. 进程间通信
沙盒应用程序无法直接与其他应用程序进行通信。它们只能使用特定的通信方式,如 XPC(跨进程通信)或 App Group(应用程序组)。这样可以防止应用程序对其他应用程序进行恶意操作或访问其他应用程序的私有数据。
例如,你的应用程序无法直接访问其他应用程序的数据或操作系统的关键组件,如系统偏好设置。
5. 权限请求
在沙盒中,应用程序需要向用户请求权限才能访问某些敏感数据或功能。例如,访问用户的相册或相机时,应用程序需要获取用户的授权。这样可以确保用户有权决定哪些权限可以提供给应用程序,保护用户的隐私。
例如,你的应用程序在访问相机时会弹出权限请求对话框,让用户决定是否允许应用程序访问相机。
5. 安全审核
苹果的 App Store 审核团队会对应用程序进行安全审核,确保应用程序符合沙盒环境的要求,并没有恶意行为。审核过程会检查应用程序的权限请求、数据保护、隐私政策等方面,以确保用户的安全和隐私得到保护。
例如,审核团队会检查你的应用程序是否合理地请求权限,以及应用程序是否妥善处理用户的敏感数据。
以上介绍了macOS App Store 沙盒的基本概念和原则,深入了解苹果的沙盒设计和具体限制,请参考苹果的相关文档和开发者指南。
通过对上面信息的掌握,我们在开发应用之前,就可以做到心中有数,判断自己的应用是否能满足沙盒要求,如果从技术方面没法满足,则可以选择自己分发,不上 App Store,但是这样我们的 App 就只能自己推广,少了 Mac 的一个渠道。
我们的程序是否应该上架 App Store?
并不是所有的程序都选择上架 App Store
其实我们平时用的很多软件,都不是从 Mac App Store 上下载的,每个人都有自己的渠道,但是说实话,Mac App Store 下载的程序会是最安全的。
有些程序可能是没法满足 Mac 的 Sandbox 要求,比如我们经常用的 Alfred
,这个程序的功能很多都是不满足沙盒的,但是也不妨碍我们喜欢用。
有些程序选择不上架 App Store,是因为他们如果去满足 Sandbox 要求,应用将会很不好用。
目前苹果的付费方式也比较单一,还有 30%的分成,所以对一些程序来说,可能也不会选择上架 Mac App Store
需要考虑的原因会很多,希望以上的内容,可以给你提供一个思路,提前了解之后,避免做一些无用功。
尾声
最后,我的第一款 Electron 应用GitHeat放弃上架 Mac App Store。
从这次的事件学习到了提前掌握平台限制是多么重要,能避免多次尝试的消耗。
发表回复