【问题标题】:Does an iOS app have write access inside its bundle?iOS 应用程序在其捆绑包中是否具有写入权限?
【发布时间】:2012-09-22 15:59:53
【问题描述】:

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

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

是否对我应该和不应该放置文件的位置有一个很好的概述 - 如何使用 Documents、Library 和 tmp 等?

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

【问题讨论】:

标签: ios


【解决方案1】:

不,每次更改捆绑包都会使您的签名无效。

如果您想写入文件,您需要根据您要对该文件执行的操作将其写入最佳文件夹。

  1. 长期文件的 Documents 文件夹
  2. 小型操作缓存
  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];

【讨论】:

    【解决方案2】:

    捆绑包是只读的。你不想弄乱它有两个原因:

    • 代码签名:签名通过捆绑包的内容进行验证;如果你弄乱了捆绑包,就会破坏签名。
    • 应用更新:更新通过将整个应用包替换为新下载的应用包来工作;您所做的任何更改都将丢失。

    你应该在哪里保存东西:

    • 文档:如果您希望它保留并备份
    • Library/Caches:如果您只想缓存下载的数据,例如个人资料图片;如果空间不足,系统将自动删除,除非您使用特殊的“请勿删除”标志指定。
    • tmp:临时文件,在您的应用未运行时删除

    如需完整说明,请查看File System Programming GuideQA1719

    【讨论】:

    • @John 更新了链接;您应该自己清除 tmp,但系统保留在您的应用未运行时删除任何内容的权利。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2012-06-29
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多