【问题标题】:iOS Data Storage RejectioniOS 数据存储拒绝
【发布时间】:2014-06-17 20:13:43
【问题描述】:

我的应用被拒绝,因为 Apple 发现在启动和/或内容下载时,我的应用存储了 14.18 MB。

现在我正在尝试跳过我在游戏中使用的所有图像和声音的备份。

到目前为止,我在自己的应用文件夹中创建了一个名为“Resources”的文件夹,如下所示:App Folder Scrshot

接下来是我在 AppDelegate.m 中所做的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self addSkipBackupAttributeToItemAtURL:[self applicationDocumentsDirectory]];
    return YES;
}

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                              forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}

这不起作用。

我有两个问题:

1) 我从一开始就做正确的事吗?我应该将所有图像和声音放在名为 Resources 的文件夹中,然后跳过整个文件夹的备份,还是应该将它们放在其他地方? 如果是,那么在哪里? (我在网上看到人们在谈论“文档”文件夹……但我不知道那个文件夹是什么,也不知道在哪里可以找到它。

2)如果我可以将所有内容都放在“资源”文件夹中,我如何从代码中访问该文件夹?如何从 Xcode 本身创建该文件夹的 URL?

提前致谢

【问题讨论】:

标签: ios objective-c app-store data-storage


【解决方案1】:

您应该通过您的应用交付内容。如果用户使用 3G/Edge,由于连接问题,在首次启动时下载内容不是一个好主意。

文档目录在设备上,是你app下的一个文件夹,是ios自动创建的。 Apple Documentation

从资源文件夹中获取文件很容易files from resources

【讨论】:

    【解决方案2】:

    我之前也遇到过这个问题!问题不在于您存储的内容的大小,而在于您存储它的位置。我的猜测是您将文件存储在NSDocumentDirectory 中,这很糟糕,因为该目录只能用于存储用户自己创建的数据(文档、照片等)。添加NSURLIsExcludedFromBackupKey 是不够的。当它发生在我身上时,我将 NSDocumentDirectory 更改为 NSApplicationSupportDirectory 并且我的应用获得了批准。

    更新

    最好先在NSApplicationSupportDirectory 中创建一个子目录来存储您的文件。

    您的方法应该类似于:

    - (NSURL *) applicationDocumentsDirectory{
        NSString *appSupportDir = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
        appSupportDir = [appSupportDir stringByAppendingPathComponent:@"MyAppDirectory"];
        return [NSURL URLWithString:appSupportDir];
    }
    

    别忘了先创建目录:

        if (![[NSFileManager defaultManager] fileExistsAtPath:[self applicationDocumentsDirectory] isDirectory:NULL]) {
            NSError *error = nil;        
            [[NSFileManager defaultManager] createDirectoryAtPath:[self applicationDocumentsDirectory] withIntermediateDirectories:YES attributes:nil error:&error];
        }
    

    【讨论】:

    • 嗨,艾米莉。我想我们在这里的轨道上。问题是,我从来没有在任何地方放任何东西……或者我从来没有明确告诉程序在哪里放什么。所以我猜它使用了一些默认值。这是我发布到应用商店的第二个应用。我对第一个没有问题,它们的制作方式非常相似。所以我从未指定将哪些数据放在哪里,但不知何故,我的第一个应用程序在 iCloud 上只存储了 0.5mb,而这个存储了 12Mb。你能告诉我应该在哪里指定哪些文件存储在哪里吗?它在 AppDelegate.m 还是其他地方?任何教程都可以:)
    • @Stebra 你能贴出你的方法的代码[self applicationDocumentsDirectory] 吗?
    • 这里是: - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; }
    • 当我在 [self applicationDocumentsDirectory] ​​中将 NSDocumentDirectory 替换为 NSApplicationSupportDirectory 时,出现此错误:从备份中排除应用程序支持时出错 Error Domain=NSCocoaErrorDomain Code=4 ...“操作无法完成。没有这样的文件或目录”} 那是我注释掉断言行的时候。
    • 如果我不注释掉断言行,我会得到以下错误:“断言失败:([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]), function -[AppDelegate addSkipBackupAttributeToItemAtURL:] ,文件 /Users/stefanbrankovic/Desktop/FessorsLounge 2/FessorsLounge/AppDelegate.m,第 54 行。”
    猜你喜欢
    • 2012-09-12
    • 2012-09-04
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2012-02-07
    • 2016-06-09
    相关资源
    最近更新 更多