我一直致力于通过Apple的“渠道”完美运行的Core Data iOS应用程序 - iOS模拟器& Xcode安装,但当我尝试手动将其安装到设备上时,应用程序崩溃了。我的主要目标是将应用程序放在Cydia上。
A guide to preparing an app for Cydia 我读了这篇文章,我在底部说了
Appstore应用程序具有由安装过程创建的Documents文件夹。越狱应用程序没有。应用程序可以创建自己的文件夹。如果您需要此类型的文件夹,则必须在applicationDidFinishLaunching函数中使用简单的mkdir命令创建此文件夹。只需添加一个简单的函数:mkdir(“/ var / mobile / Library / YOURAPPNAME”,0755);如果该文件夹已存在,则不会造成任何损害。您希望这样做是因为安装过程以root用户身份运行,应用程序以用户移动方式运行。如果Cydia为您执行此操作,则该文件夹将具有不正确的权限。
我不太了解Core Data的工作原理,但我知道Core Data“数据库”存储在Documents文件夹中,我现在相信这是我的应用程序崩溃的原因。
mkdir函数在创建Documents文件夹时不起作用。
如何创建Documents文件夹,以及如何使用Core Data,确保从我创建的文件夹加载数据库?
提前致谢
答案 0 :(得分:5)
很可能你仍然在创建和加载CoreData数据库文件的方法中使用AppStore友好文档路径(我认为Xcode会默认将这些放在你的AppDelegate中)。
检查加载persistentStorageCoordinator
的方法并查找如下所示的行:
NSURL *storeUrl = [NSURL fileURLWithPath: [docPath stringByAppendingPathComponent:@"my_cool_app.sqlite"]];
并确保docPath
是“/ var / mobile / Library / My_Cool_App”并且不是来自标准的AppStore友好:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [documentPaths objectAtIndex:0];
您可能想要创建一个方法,该方法根据您编译应用程序的目标返回正确的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
}