You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS开发疑问:能否将下载文件存放至App沙盒外供其他App访问?

在iOS中把文件存到App沙盒外是否可行?

你好!先直接给你结论:普通Objective-C iOS App没法直接把文件存到自己沙盒之外的任意目录。这是iOS核心的沙盒安全机制在起作用——每个App都有自己独立的封闭沙盒空间,默认只能读写自己沙盒内的文件,目的就是隔离App间的数据,防止恶意App窃取或篡改用户数据,保障系统和隐私安全。

不过如果你的需求是让其他App能访问你下载的文件,还是有合规的实现方式的:

  • 同开发者App共享:通过配置App Groups,让你名下的多个App共用一个共享容器目录,这些App之间可以自由访问这个容器里的文件,但仅限同开发者的App。
  • 开启文件共享功能:在App的Info.plist里添加UIFileSharingEnabled(对应“Application supports iTunes file sharing”)和LSSupportsOpeningDocumentsInPlace这两个键并设为YES。开启后,用户可以通过iTunes或者系统的“文件”App访问你沙盒里的Documents目录,其他App也能通过“文件”App来打开你存储的文件。
  • 让用户选择存储位置:用UIDocumentPickerViewController组件,让用户自行选择把文件保存到iCloud Drive或者其他支持的共享存储位置,这样其他App就能访问这些公共存储区域里的文件了。

再说说浏览器的实现逻辑:
像Safari、Chrome这类浏览器能让其他App访问下载文件,完全是走了iOS允许的合规路径:

  1. 存到可共享的沙盒子目录:浏览器会把下载文件存在自己沙盒内的Documents或类似可共享目录,同时开启了上面说的文件共享功能,这样系统的“文件”App就能索引到这些文件,其他App自然可以通过“文件”App来打开它们。
  2. 提供File Provider扩展:不少主流浏览器会实现File Provider扩展,这样它们的下载文件会直接在“文件”App里显示成一个独立的文件夹,就像访问本地文件一样,其他App可以通过这个扩展直接访问下载内容。
  3. 系统分享框架支持:浏览器都内置了分享功能,用户可以直接把下载的文件通过UIActivityViewController(系统分享面板)发送给其他App,这本质上是把文件临时传递或者复制到目标App的沙盒中,实现跨App访问。

内容的提问来源于stack exchange,提问作者Ankit Maurya

火山引擎 最新活动