【问题标题】:Cydia App Documents Folder Not CreatedCydia 应用程序文档文件夹未创建
【发布时间】:2012-02-22 08:21:31
【问题描述】:

我一直在开发一款通过 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 用户身份运行,而应用程序以用户 mobile 身份运行。如果 Cydia 为您执行此操作,则该文件夹将具有不正确的权限。

我不太了解 Core Data 究竟是如何工作的,但我知道 Core Data “数据库”存储在 Documents 文件夹中,我现在相信这是我的应用程序崩溃的原因。

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

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

提前致谢

【问题讨论】:

    标签: objective-c ios core-data jailbreak


    【解决方案1】:

    您很可能仍在创建和加载 CoreData 数据库文件的方法中使用 AppStore 友好的 Documents 路径(我认为 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
    }
    

    【讨论】:

    • 感谢您的出色回答。将对我的应用程序进行更改,看看您的解决方案是否有效。
    • @Mike Cugini, Mike 我在AppDelegate.m 文件中创建了上面列出的方法,我还在AppDelegate.m 文件中创建了NSArrayNSString。该程序编译良好,但没有将Accounts.sqlite 文件放在/var/mobile/Library/KegCop 目录中。该文件仍位于Documents 目录中。你知道我做错了什么吗?
    猜你喜欢
    • 2010-12-18
    • 2019-07-14
    • 2011-04-13
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多