简体   繁体   English

iPhone:将资源移至应用程序捆绑包

[英]iPhone: move resources to Application bundle

My application just got rejected from Apple because I store my resources under Documents folder! 我的应用程序刚被Apple拒绝,因为我将资源存储在Documents文件夹下! The Documents folder gets synched to iCloude automatically so only user generated data should be stored under Documents. Documents文件夹会自动同步到iCloude,因此仅用户生成的数据应存储在Documents下。 All application data should go under Application bundle. 所有应用程序数据都应在Application bundle下。

I use following method through out my project 我在我的项目中使用以下方法

- (NSString *)filePath:(NSString *)fileName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];
    return path;
}   

For example, following line unzip my resources under documents folder. 例如,以下行将我的资源解压缩到documents文件夹下。

[SSZipArchive unzipFileAtPath: zipFileName toDestination:[self filePath: @""]]; [SSZipArchive unzipFileAtPath:zipFileName toDestination:[self filePath:@“”]]];

How can I move these files and Resources folder images into Application bundle and access them? 如何将这些文件和Resources文件夹图像移动到Application bundle并访问它们?

[EDIT] [编辑]

- (NSString *)filePath:(NSString *)fileName {
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/DoNotBackUp"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
        // Set do not backup attribute to whole folder
        if (iOS5) {
            BOOL success = [self addSkipBackupAttributeToItemAtURL:path];
            if (success) 
                NSLog(@"Marked %@", path);
            else
                NSLog(@"Can't marked %@", path);
        }
    }
    path = [path stringByAppendingPathComponent:fileName];

    return path;
}

/*
 set the document files attribute to marked "do not backup"
*/
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSString *)path
{
    const char* filePath = [path fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}

Where iOS5 is BOOL variable: 其中iOS5是BOOL变量:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

iOS5 = NO;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0.1")) 
    iOS5 = YES;

Thanks. 谢谢。

in iOS 5.0.1 yo can add a new file attributo to mark them as non iCloud sync: 在iOS 5.0.1中,您可以添加新文件属性以将其标记为非iCloud同步:

#include <sys/xattr.h>
- (void) AddSkipBackupAttributeToFile: (NSURL*) url
{
    u_int8_t b = 1;
    setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}

You cannot write to the Bundle at runtime. 您无法在运行时写入Bundle。 You can only add resources to the bundle when creating the binary. 创建二进制文件时,只能将资源添加到捆绑软件中。 You will need to place the results of the unzip process into the Caches Directory. 您需要将解压缩过程的结果放入缓存目录中。

Because the contents of this folder can be deleted at any time by the system, you should check at every startup if the file needs to be unzipped again. 由于系统可以随时删除此文件夹的内容,因此您应该在每次启动时检查是否需要再次解压缩该文件。

You will likely only need to change the first line of the above method to: 您可能只需要将上述方法的第一行更改为:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM