iOS PhoneGap app rejected because of the use of localStorage

后端 未结 3 2000
没有蜡笔的小新
没有蜡笔的小新 2021-02-05 14:54

Apple just rejected a PhoneGap app I submitted. I utilize HTML5 localStorage in the app to save downloaded data for caching purposes: 2.23 Apps must follow the iOS Data

3条回答
  •  悲&欢浪女
    2021-02-05 15:49

    There are two things that I am aware of:

    1) Files that are generated by your app (and not a result of the user using your app) such as temporary text files to store a variable's value, then these files must be placed in the Library/Cache instead of the Document directory.

    2) You must also mark a file with a "skip-backup" attribute to tell iCloud not to backup the file.

    I think you might be missing step 2.

    I wrote a simple MediaDirectory class which quickly gives me the path to the files in the Library/Cache folder and also add the skip backup attribute.

    After you saved your file to the Libary/Cache folder, you simply go something like this:

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

    Here's the class in full:

    // Header File
    
    // ----------------------------------------------------------------------
    // This class takes a file name (including extension) and returns
    // the path to that file in the Library/Cache folder
    // ----------------------------------------------------------------------
    
    #import 
    
    @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 
    
    @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
    

提交回复
热议问题