首页 > 其他分享 >Apple开发_应用沙盒

Apple开发_应用沙盒

时间:2022-11-20 12:00:11浏览次数:43  
标签:文件 Apple 路径 用户 Library 应用 沙盒 目录

1、Sandbox 沙箱介绍

  • iOS 为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒。也就是说,一个应用与文件系统的交互绝大部分都被限制在它自己的应用沙盒内。
  • 在新 App 被安装时,安装器会为应用创建一系列角色不同的容器(container)。
  • iOS 8.0 之后,bundle 目录和沙盒目录 (Data) 是分开的。
  • iOS 7.0 及以前版本 bundle 目录和沙盒目录 (Data) 是在一起的。

2、文件夹说明

  • 2.1 Bundle Container:

    • MyApp.app :这就是应用的运行包(bundle),这个目录包含应用的可执行文件和所有资源文件。
    • 用户从 App Store 购买应用后,iTunes 安装到手机上的就是这个目录文件。
    • 这个目录是只读的,而且该目录在安装时进行了签名,安装后对该目录进行的任何写操作都会改变目录的签名内容,从而使的该应用无法启动,该应用本身能获得 bundle 中的任何文件的读权限。
    // 获取包路径
    NSString *bundlePath = [NSBundle mainBundle].bundlePath;
    NSURL *bundleUrl = [NSBundle mainBundle].bundleURL;
    // 获取应用程序程序包中资源文件路径
    NSString *bundleFilePath = [[NSBundle mainBundle] pathForResource:@"testFile" ofType:@"txt"];
    NSURL *bundleFileUrl = [[NSBundle mainBundle] URLForResource:@"testFile" withExtension:@"txt"];
    
  • 2.2 Data Container:

    • iTunes 在与 iPhone 同步时,备份所有的 Documents 和 Library 文件。iPhone 在重启时,会丢弃所有的 tmp 文件。
    • 1️⃣ Documents:

      • 保存由用户产生的文件或者数据,例如一个日记应用中用户写的日记文件,或者音乐播放器中用户下载的歌曲,涂鸦程序生成的图片,游戏关卡记录等。建议将用户可操作的文件数据都放到该目录。该文件夹下的内容不会被系统自动删除,但是严格规定必须是用户自己想要保存的。
      • 该目录下的所有文件都可以通过 iTunes 进行备份和恢复。存储在这里的所有文件会自动备份到 iCloud。该目录下如果保存了从网络下载的文件,在上架审批的时候,会被拒。
      • Documents/Inbox
        • 该目录用来访问被外部应用所请求当前应用打开的文件。例如,我们的应用 MyApp 向系统注册了可以打开 doc 类型的文件,另一个应用 A 中有一个文件 read.doc ,并申请 MyApp 打开此文件,这时候系统会先将 read.doc 文件拷贝到 MyApp 应用中的 Documents/Inbox 目录下,MyApp 可以在 Inbox 目录下进行文件读取和删除,但是不能新建文件或者对已有文件进行写入。
        • 如果用户要对文件进行编辑,需要先将文件移动到其他目录。
      // 获取 Documents 路径
      NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
      NSURL *documentUrl = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject;
      
    • 2️⃣ Library:

      • 该目录用来存储非用户数据,它下面包括几个标准的子目录,你可以将文件放到其中之一,也可以自己创建子目录。iOS 应用通常用到的子目录有 Preferences 和 Caches 。Library 目录下的文件通常是不应该暴露给用户的,该目录下除了 Caches 子目录外,其它目录及其文件都可以通过 iTunes 进行备份。
      • Library/Preferences
        • 常用来放置配置文件、数据文件、模板等应用在运行中与用户相关,而又希望对用户不可见的文件,如系统偏好设置,用户偏好设置等文件。使用 NSUserDefaults 类进行偏好设置文件的创建、读取和修改。
      • Library/Caches
        • 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视频文件等。
        • 该目录中的文件系统不会自动删除,可以做离线访问。它的存放时间比 tmp 下的长,但是不如 Library 下的其它目录。
        • 总的来说 Caches 目录下存放的数据不能是应用程序运行所必需的,但是能提高应用访问性能的。可写入应用支持文件,保存应用程序再次启动需要的信息。
        • iTunes 不会对这个目录的内容进行备份。要求程序员必需提供一个完善的清除缓存目录的 "解决方案"。
      // 获取 Library 路径
      NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject;
      NSURL *libraryUrl = [[NSFileManager defaultManager] URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask].lastObject;
      // 获取 Caches 路径
      NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
      NSURL *cachesUrl = [[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory
      
    • 3️⃣ tmp:

      • 该目录用来存储临时文件,那些在下次重启中不需要再次载入的临时信息可以存放到该目录下。在应用不运行时,系统可能会对该目录下的内容进行清理。
      • 这个目录的内容不会通过 iTunes 备份。程序员不需要管 tmp 文件夹中的释放。
      // 获取临时文件路径
      NSString *tmpPath = NSTemporaryDirectory();
      

3、获取方法

  • iOS 中同一个应用在不同的手机中分配的路径可能是不同的,所以我们无法通过硬编码指定完整路径名来找到对应文件。
  • Foundation 框架提供了一组专门的接口来获取应用沙箱不同位置的目录路径。
// 获取用户主路径
NSString *NSHomeDirectory(void);
// 获取临时文件路径
NSString *NSTemporaryDirectory(void);
// 获取满足条件的路径列表
NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
  • 该函数返回一组路径的数组,如果仅是查找用户的目录,这个数组只包含一个元素,如果第二个参数包含多个值,该数组会包含多个元素。

  • 当为 iOS 编写程序时,第二个参数应是 NSUserDomainMask,并且得到一个包含单个路径的数组作为返回。在 iOS 中后两个参数是不变的。

  • 3.1 directory

    • 指定查找的目录范围。
    NSSearchPathDirectory 说明
    ApplicationDirectory /Applications
    LibraryDirectory /Library
    DocumentDirectory /Documents
    ApplicationSupportDirectory /Library/Application Support
    UserDirectory /Users
    CachesDirectory /Library/Caches
  • 3.2 omainMask

    • 指定查找的文件系统域,可以是多值。
    NSSearchPathDomainMask 说明
    UserDomainMask 用户域,指向当前用户的 home 目录(~)
    LocalDomainMask 本地域,指向对所有用户可用的当前机器范围
    NetworkDomainMask 网络域,指向 /Network
    SystemDomainMask 系统域,指向 /System
  • 3.3 expandTilde

    • 指定是否展开路径中的代字符(~)。

标签:文件,Apple,路径,用户,Library,应用,沙盒,目录
From: https://www.cnblogs.com/CH520/p/16896883.html

相关文章

  • 硬核!Apache Hudi Schema演变深度分析与应用
    1.场景需求在医疗场景下,涉及到的业务库有几十个,可能有上万张表要做实时入湖,其中还有某些库的表结构修改操作是通过业务人员在网页手工实现,自由度较高,导致整体上存在非常多......
  • linux quota命令使用——应用场景 针对不同的用户设置不同的磁盘访问大小
    quota显示磁盘已使用的空间与限制Linuxquota命令语法quota[选项][用户|组群]命令中各选项的含义如表所示。  Linuxquota命令示例显示用户zhangsan的磁......
  • Web3.0潮起,应用场景何寻
    在元宇宙、NFT的热潮下,Web3.0似乎离我们也不远了,但目前来说,还没有看到真正意义上的Web3.0应用场景。在打破数据孤岛之后,Web3.0的应用场景又该显现在何处,其商业模式生态将......
  • UOS安装应用程序时闪退
    故障现象:双击deb文件,点击安装后闪退故障分析:软件包安装器有问题,需重装软件包安装器故障处理:进入开发者模式后,终端输入以下命令重装软件包安装器sudoaptreinstal......
  • Windows之应用安装程序 —— winget
    大家都用过Linux中的应用程序安装工具,如yum、apt、rpm等工具进行安装自己想要的一些工具或则软件之类的,当然Linux操作系统还是很强大的有很多类似的命令来安装我们所需......
  • 遥控pc android应用程序
    遥控pcandroid应用程序 通过手机来控制您的电脑,在家里比如床上看电影,手机控制不用去直接操作电脑,多方便呀,呵呵。 分pc服务端程序,以及移动app应用程序。  1首先下载j......
  • 势博弈在移动通信中的应用
    势博弈是静态博弈策略博弈的一个子集每个势博弈都服从一个势函数势博弈的分类:势函数根据单方面的偏差可以量化回报上的差距1.一般普通博弈2.普通势博弈如......
  • spring boot 应用 systemd 管理简单说明
    基于systemd的springboot应用管理有一个比较方便的能力,就是不用复杂的java进程处理了,应用发布只需要进行jar文件的copy处理,然后就是服务的重启了systemctlrestart......
  • css应用内容总结
     css作为前端三大重要组成之一也是尤为重要得,而且在日常生活中可能关于javascript的相关问题可以组织语言去百度,而对于一些css样式有时候可能却不好组织语言去表述这个问......
  • javascript: AppleWebkit
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-e......