iOS PhoneGap应用程序因使用localStorage而被拒绝

时间:2012-09-05 13:00:56

标签: ios cordova local-storage

Apple刚拒绝了我提交的PhoneGap应用。我在应用程序中使用HTML5 localStorage来保存下载的数据以用于缓存目的: 2.23应用程序必须遵循iOS数据存储指南,否则将被拒绝

我很困惑,因为如果我认为5.1中的localStorage实际上将数据保存在缓存中而不是在使用iCloud [source]备份的地方。这是我想要的行为 - 我不需要或者想要备份数据。

我错了还是Apple?我可以在PhoneGap应用程序中执行哪些操作来保存此缓存数据而不会违反?

编辑:PhoneGap 1.8.1如果有帮助。

3 个答案:

答案 0 :(得分:11)

事实证明我是对的,Apple错了。我确认我正在将所有内容正确存储在/ Caches目录中。他们没有评论我的问题 - 只是批准了我的应用程序。

答案 1 :(得分:2)

我知道有两件事情:

1)您的应用生成的文件(而不是用户使用您应用的结果),例如用于存储变量值的临时文本文件,然后这些文件必须放在库/缓存而不是文档中。目录

2)您还必须使用“skip-backup”属性标记文件,以告知iCloud不要备份该文件。

我想你可能会错过第2步。

我编写了一个简单的MediaDirectory类,它快速为我提供了Library / Cache文件夹中文件的路径,还添加了skip backup属性。

将文件保存到Libary / Cache文件夹后,您只需执行以下操作:

[MediaDirectory addSkipBackupAttributeForFile:@"myTextFile.txt"];

这是完整的课程:

// Header File

// ----------------------------------------------------------------------
// This class takes a file name (including extension) and returns
// the path to that file in the Library/Cache folder
// ----------------------------------------------------------------------

#import <Foundation/Foundation.h>

@interface MediaDirectory : NSObject

+(NSString *) mediaPathForFileName:(NSString *) fileName;
+(NSString *) mediaPathForFileName:(NSString *) fileName inSubDirectory:(NSString *) subDirectory;
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName;
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName inSubDirectory:(NSString *) subDirectory;

@end


// Implementation File

#import "MediaDirectory.h"
#include <sys/xattr.h>

@implementation MediaDirectory

+(NSString *) mediaPathForFileName:(NSString *) fileName
{   
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDirectory = [directoryPaths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", cachesDirectory, fileName];

    return filePath;
}

// if an image needs to be stored in a sub folder called "images"
+(NSString *) mediaPathForFileName:(NSString *) fileName inSubDirectory:(NSString *) subDirectory
{   
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDirectory = [directoryPaths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@/%@", cachesDirectory, subDirectory, fileName];

    return filePath;
}

//+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName
{
    const char* filePath = [[self mediaPathForFileName:fileName] 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;
}

+ (BOOL)addSkipBackupAttributeToFile:(NSString *) fileName inSubDirectory:(NSString *) subDirectory
{
    const char* filePath = [[self mediaPathForFileName:fileName inSubDirectory:subDirectory] 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;
}

@end

答案 2 :(得分:1)

我刚刚提交的一个phonegap应用程序因为同样的原因被Apple拒绝了,我只使用localstorage。

我已在config.xml

中使用以下首选项重新提交
<preference name="BackupWebStorage" value="none" />

我知道这将解决问题