Приложение iOS PhoneGap отклонено из-за использования localStorage - программирование
Подтвердить что ты не робот

Приложение iOS PhoneGap отклонено из-за использования localStorage

Apple просто отклонила приложение PhoneGap, которое я представил. Я использую HTML5 localStorage в приложении для сохранения загруженных данных в целях кеширования: 2.23 Приложения должны следовать рекомендациям по хранению данных iOS или отклоняться.

Я серьезно запутался, потому что, если что-то я думал, что localStorage в 5.1 фактически сохраняет данные в кеше и НЕ в месте, которое подкрепляется iCloud [source]. Это поведение, которое я хочу - мне не нужны или нужны резервные копии данных.

Я ошибаюсь или Яблоко? Что я могу сделать в приложении PhoneGap для сохранения этих данных в кэше без нарушения?

Изменить: PhoneGap 1.8.1, если это поможет.

4b9b3361

Ответ 1

Оказывается, я был прав, и Apple ошибалась. Я подтвердил, что я хранил все в каталоге /Caches правильно. Они не комментировали мой вопрос - только что одобрили мое приложение.

Ответ 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

Ответ 3

Приложение с телефонной связкой, которое я только что представил, было отклонено Apple по тем же причинам, и я использую только localstorage.

Я повторно представил следующий набор предпочтений в моем config.xml

<preference name="BackupWebStorage" value="none" />

Я понимаю, что это решит проблему.