一个iOS应用程序在其包中有写权限吗?

我在我的iOS应用程序的.app包中保存了一些运行时生成的文件。 在模拟器中,它工作正常,在设备崩溃:

可以在给定的着色器cachingpath中创build输出文件'/var/mobile/Applications/CB064997-B40E-4FE3-9834-B3217CE33489/SimedTest.app/Ogre3D/assets/RTShaderLib/cache/

有一个很好的概述,我应该不应该把文件 – 如何使用文档,图书馆和tmp等?

为了澄清,这些是在启动时创build的文件,它预先计算一些数据以节省时间。 如果他们不存在,他们会被创build,所以他们被删除,但没有在应用程序正在运行。

该包是只读的。 你不想乱它,原因有两个:

  • 代码签名:签名通过与捆绑的内容进行validation; 如果你乱捆绑,你打破签名。
  • 应用程序更新:更新通过用新下载的应用程序包replace整个应用程序包来工作; 您所做的任何更改都将丢失。

你应该在哪里保存东西:

  • 文件:如果你想要它坚持和备份
  • 图书馆/高速caching:如果你只是想caching下载的数据,如configuration文件图片; 如果房间较低,系统将自动删除,除非您指定了一个特殊的“不删除”标志。
  • tmp:临时文件,当你的应用程序没有运行时被删除

有关完整的说明,请查阅“ 文件系统编程指南”和QA1719 。

不,每次你改变你的包,你的签名无效。

如果你想写文件,你需要写在最好的文件夹,这取决于你想要用这个文件做什么。

  1. 长文件的文档文件夹
  2. caching小操作
  3. 等等

编辑

要获得path你需要这样的东西:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"filename.ext"]; 

有了这个path你可以像这样写或读:

写:

 NSString *content = @"One\nTwo\nThree\nFour\nFive"; [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; 

读:

 NSString *content = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil];