NativeScript+Angular开发:iOS端如何访问用户可及的外部存储路径
iOS 端实现用户可访问下载文件的NativeScript落地方法
首先明确大前提:iOS 没有安卓那种无沙盒限制的全局外部存储根目录,系统从底层强制做了应用沙盒隔离,任何非越狱设备上的应用,都不可能直接读写系统级别的根目录路径。你要实现的“让用户能直接拿到应用下载的文件”,本质是靠iOS系统提供的官方共享机制实现的,不存在能直接拿到系统全局可写根路径的合法实现。
下面是经过实际项目验证、完全合规上架的可落地方案,不需要额外第三方插件:
方案1:零成本改造现有下载逻辑,开启应用文档目录的用户可访问权限
你现在用knownFolders.documents().path拿到的应用私有文档目录,本身是可以开放给用户直接访问的,完全不需要更换存储路径:
- 只需要在项目的
App_Resources/iOS/Info.plist配置文件里加入两个权限配置项:<!-- 开启iTunes/访达文件共享 --> <key>UIFileSharingEnabled</key> <true/> <!-- 允许系统文件App索引应用内的文档目录 --> <key>LSSupportsOpeningDocumentsInPlace</key> <true/> - 配置完成后,你原来写的所有下载文件存储逻辑完全不用改,存在这个目录下的所有文件,会直接出现在系统自带的「文件」App的对应应用名称条目下,用户可以直接浏览、复制、导出这些文件,没有任何额外访问限制
方案2:直接获取系统预置的公共共享目录路径
如果你不想用应用专属的共享文档目录,可以直接通过NativeScript核心模块拿到iOS系统预置的、会被系统文件App直接索引的公共目录路径,这些路径下存的文件,用户可以在全局文件App的对应分类下直接找到:
- 核心模块直接提供了iOS专属的目录枚举,不需要自己拼接字符串路径:
import { knownFolders, path } from '@nativescript/core'; // 获取系统公共下载目录路径 const publicDownloadsPath = knownFolders.ios.downloads.path; // 拼接要存储的下载文件完整路径 const savedFilePath = path.join(publicDownloadsPath, '用户手册.pdf'); - 可直接获取的公共目录包括:公共下载目录、公共图片目录、全局共享文档目录,所有这些目录的内容都会被系统文件App自动扫描,用户不需要进入你的应用就能找到存储的文件
- 注意:这些公共目录依然在应用的沙盒授权范围内,只是存储位置的系统可见性更高,并不会让你获得读写其他应用沙盒内容的权限
方案3:下载完成后唤起系统分享面板,主动引导用户保存文件
如果上面的目录索引路径还是无法满足用户找文件的需求,这是经过大量电商、工具类应用验证的最稳妥方案:
- 应用完成文件下载后,直接调用系统原生分享面板,传入下载完成的本地文件路径,让用户自主选择把文件保存到iCloud云盘、其他应用、或者自己指定的文件位置
- 这个方案完全不需要关心文件存到了哪个沙盒路径,直接跳过路径限制,由用户主动选择文件的最终存储位置,完全符合苹果的审核规范
常见踩坑提醒
- 所有试图拼接
/作为根路径、或者申请越权访问系统目录的写法,在iOS 13+系统上都会直接触发权限报错,根本无法写入文件,而且这类写法会直接导致苹果审核被拒 - 不要把用户的下载文件存到
Library/Caches目录,这个目录的文件会被系统在存储空间不足时自动清理,非常容易造成用户文件丢失 - 不存在所谓的“隐藏的外部存储路径”,苹果的沙盒机制从系统层面就堵死了无授权的跨目录读写,所有号称能拿到全局可写根路径的方案,不是在越狱设备上的特殊写法,就是已经失效的旧版本系统兼容代码
内容的提问来源于stack exchange,提问作者Deep Govani
相关产品推荐
相关产品推荐

