未创建Cydia App Documents文件夹

ban*_*lon 2 core-data objective-c jailbreak ios

我一直致力于通过Apple的"渠道" - iOS模拟器和Xcode安装完美运行的Core Data iOS应用程序,但当我尝试将其手动安装到设备上时,应用程序崩溃了.我的主要目标是将应用程序放在Cydia上.

为Cydia准备应用程序的指南 我读了这篇文章,我在底部说

Appstore应用程序具有由安装过程创建的Documents文件夹.越狱应用程序没有.应用程序可以创建自己的文件夹.如果您需要此类型的文件夹,则必须在applicationDidFinishLaunching函数中使用简单的mkdir命令创建此文件夹.只需添加一个简单的函数:mkdir("/ var/mobile/Library/YOURAPPNAME",0755); 如果该文件夹已存在,则不会造成任何损害.您希望这样做是因为安装过程以root用户身份运行,应用程序以用户移动方式运行.如果Cydia为您执行此操作,则该文件夹将具有不正确的权限.

我不太了解Core Data的工作原理,但我知道Core Data"数据库"存储在Documents文件夹中,我现在相信这是我的应用程序崩溃的原因.

mkdir函数在创建Documents文件夹时不起作用.

我将如何创建一个Documents文件夹,以及如何让它与Core Data一起使用,确保从我创建的这个文件夹加载数据库?

提前致谢

小智 5

很可能你仍然在创建和加载CoreData数据库文件的方法中使用AppStore友好文档路径(我认为Xcode默认会将这些放在你的AppDelegate中).

检查加载的方法persistentStorageCoordinator并查找如下所示的行:

NSURL *storeUrl = [NSURL fileURLWithPath: [docPath stringByAppendingPathComponent:@"my_cool_app.sqlite"]];
Run Code Online (Sandbox Code Playgroud)

并确保它docPath是"/ var/mobile/Library/My_Cool_App"而不是源自标准的AppStore友好:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [documentPaths objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

您可能想要创建一个方法,该方法根据您为应用程序编译的目标返回正确的Documents目录:

+(NSString *)documentsDirectoryPath
{
#ifdef JAILBREAK

    NSString *documentPath = @"/var/mobile/Library/My_Cool_App";

    if (![[NSFileManager defaultManager] fileExistsAtPath:documentPath])
    {
        [[NSFileManager defaultManager] createDirectoryAtPath:documentPath
                              withIntermediateDirectories:NO 
                                               attributes:nil 
                                                    error:NULL];
    }

    return documentPath;

#else

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [documentPaths objectAtIndex:0];

#endif
}
Run Code Online (Sandbox Code Playgroud)