是一款iPhone应用程序';s文档目录/var/mobile/Documents还是/var/mobile/Library/AppName?

是一款iPhone应用程序';s文档目录/var/mobile/Documents还是/var/mobile/Library/AppName?,iphone,cocoa-touch,jailbreak,cydia,Iphone,Cocoa Touch,Jailbreak,Cydia,据我所知(并到处阅读),应用程序的文档目录应该位于iPhone上的/var/mobile/Library/中,但如果我记录获取的目录,它就是/var/mobile/documents 我得到的目录如下: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtInde

据我所知(并到处阅读),应用程序的文档目录应该位于iPhone上的
/var/mobile/Library/
中,但如果我记录获取的目录,它就是
/var/mobile/documents

我得到的目录如下:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
如果我在这里创建名为
Settings.xml
的文件,或者我的应用程序/等有问题,这是个问题吗

信息:我有一台iOS 4.2.1的越狱iPhone 4,我的应用程序是通过Cydia或SSH安装的


更新

是的,但那个目录与我的应用程序并没有真正的关系。 例如,我正在创建一个document settings.xml,如果另一个应用程序使用相同的NSDocumentDirectory和相同的文件名,该怎么办?
是的,我知道。Cydia apps已安装到/Applications中,但我的应用程序也应该有一个文档目录,甚至没有/var/mobile/Documents。如果你看一下目录应该是/var/mobile/Library/但正如我之前所描述的,我从来没有得到过这个目录。

通过Cydia应用程序安装到另一个文件夹,这就是为什么你得到不同的目录。

一些Cydia二进制文件安装到
/private/var/lib/
(如apt get、openssh等)。其他安装在
/Applications/
(如Cydia.app、游戏等)中。

我也因这个问题而痛苦。。。我还没有发现发生了什么,所以我接受了在/var/mobile/Documents上工作。但是,我必须在我的设备中手动创建该目录(通过ssh或移动终端),并将其权限设置为666[chmod-r 777/var/mobile/Documents],以便我的应用程序在那里保存和加载文件


再见

您要做的是在应用程序启动时,检查您想要的docs目录中的文件是否存在,如果不存在,则从只读应用程序包中复制该文件。每次启动应用程序时,它都在那里。而且,如果苹果出于某种愚蠢的原因修改了它,你就不必调整你的代码,因为它的通用性足以适应这种变化。它会将原始数据复制到新的位置(这不是最优的,但比假设它位于静态位置要好,这会在用户中造成各种混乱,或者更糟:崩溃)。

使用捆绑ID作为名称,例如com.companyname.appname.Settings.xml。在不同的应用程序中,它们很少是相同的。您也可以使用UUID命名文件并将UUID存储在应用程序包的名称中,但它有其优点和缺点: 赞成:文件永远不会被其他应用程序覆盖
缺点:这样做很棘手。

应用程序创建的所有文件都将限制在应用程序沙箱中(例如/var/stash/Applications/AppName)。当您查找文件settings.xml时,可以使用上面的代码示例获取文件路径名


不建议将文件存储在沙箱之外。

在运行越狱应用程序时,使用常量
NSDocumentDirectory
实际上会获取/var/mobile/Documents。将应用程序的文档直接转储到沙箱中是错误的策略,即使您认为它们的名称是唯一的

如果你查看/var/mobile/Library/folder的内容,你会发现很多应用程序都将数据存储在那里,包括越狱应用程序。我不清楚是否有一个方便的常量,比如
NSDocumentDirectory
,你可以使用它来获取数据。但是,你总是可以硬编码你的源代码,在
@“/var/mobile/Library/APPNAME”
。此文件夹不太可能更改(如果更改,可能会破坏其他应用程序,这当然是一个容易修复的问题)

如果查看文档,它确实指定:

Appstore应用程序具有由创建的文档文件夹 安装过程。越狱应用程序不支持。由应用程序决定是否安装 创建自己的文件夹。如果需要此类型的文件夹,必须 在您的应用程序中使用一个简单的mkdir命令来创建它 ApplicationIDFinishLaunching函数。只需添加一个简单函数: mkdir(“/var/mobile/Library/YOURAPPNAME”,0755);如果文件夹已经存在 存在,未造成任何损害。您希望这样做,因为安装过程 以root用户身份运行,应用程序以移动用户身份运行。如果Cydia这样做 对于您,文件夹将具有不正确的权限

所以你需要自己创建子目录。如果你不创建子目录,子目录就不存在了

根据我的经验,编写越狱应用程序仅仅涉及到一些有点臭的编码实践(硬编码路径并自己创建它们)…这可能是我们必须处理的事情


更新:确保看到Saurik在下面的评论。

一个小警告。/var/mobile/Library/显然假设你的应用程序以“移动”用户的身份运行,这是默认设置。一些越狱应用程序需要以root用户的身份运行。如果确实如此,那么你可能应该使用/var/root/Library/APPNAME文件夹。我是在上这样做的我的一个应用程序需要以root用户身份运行,并将数据保存为root用户。越狱者对此有点抱怨,但最终同意让我使用该位置。FWIW,桌面Mac应用程序的开发人员也这样做了(可能直到Mac应用商店强迫我进入新的“臭”沙盒时)为了解决同样的问题,您应该将文档(用户操作的东西)存储在文档中,并将状态存储在库中(您会注意到,没有应用程序将“数据”存储在“文档”意义上的库中)。你应该有一个
/var/mobile/Library
目录。我在运行iOS 5.1.1的iPhone 3GS上有一个目录。我用苦艾酒越狱了。