2012-09-05 27 views
14

Apple vừa từ chối một ứng dụng PhoneGap mà tôi đã gửi. Tôi sử dụng HTML5 localStorage trong ứng dụng để lưu dữ liệu đã tải xuống cho mục đích lưu vào bộ nhớ cache: 2.23 Ứng dụng phải tuân thủ Nguyên tắc lưu trữ dữ liệu iOS hoặc chúng sẽ bị từ chối.Ứng dụng iOS PhoneGap bị từ chối do việc sử dụng localStorage

Tôi rất bối rối vì nếu bất cứ điều gì tôi nghĩ localStorage trong 5.1 thực sự lưu dữ liệu vào bộ nhớ cache và KHÔNG ở nơi được sao lưu bằng iCloud [source]. Đây là hành vi tôi muốn - tôi không cần hoặc muốn dữ liệu được sao lưu.

Tôi có sai hay là Apple? Tôi có thể làm gì trong ứng dụng PhoneGap để lưu dữ liệu được lưu trong bộ nhớ cache này mà không bị vi phạm?

Chỉnh sửa: PhoneGap 1.8.1 nếu có ích.

+2

tôi sẽ đề nghị bạn sử dụng Xcode để tải về một bản chụp của sandbox của ứng dụng của bạn để tận xem các tệp và thư mục nào đang được tạo. Có lẽ PhoneGap đang làm một cái gì đó sôi nổi. Bạn cũng có thể tìm trong thư mục Simulator của ứng dụng. –

+0

Và đảm bảo hiển thị các tệp ẩn vì nhiều thư mục chi tiết bộ nhớ cache/triển khai bị ẩn (ví dụ: lưu trữ tài nguyên bên ngoài của Dữ liệu lõi). –

+0

Nếu tôi nhìn vào thư mục trình mô phỏng, nó sẽ hiển thị một tệp__0.localstorage trong thư mục "Cache" (Applications/app/Library/Caches). Vì vậy, điều đó khẳng định lại suy nghĩ của tôi rằng nó được lưu ở nơi "đúng". –

Trả lời

11

Hóa ra tôi đã đúng và Apple đã sai. Tôi xác nhận rằng tôi đã lưu trữ mọi thứ trong thư mục/Caches đúng cách. Họ không bình luận về câu hỏi của tôi - vừa phê duyệt ứng dụng của tôi.

+0

cùng một từ chối. Iphone cũng từ chối ứng dụng của tôi. tôi có thể làm gì ??? – chhameed

+1

Nếu bạn chỉ sử dụng localStorage, bạn nên chỉ ra cho người đánh giá (và/hoặc gửi chúng đến chủ đề này!) –

2

Có hai điều mà tôi biết:

1) tập tin được tạo ra bởi ứng dụng của bạn (và không phải là một kết quả của việc người dùng sử dụng ứng dụng của bạn) như tập tin văn bản tạm thời để lưu trữ giá trị của một biến, sau đó các tệp này phải được đặt trong Thư viện/Cache thay vì thư mục Tài liệu.

2) Bạn cũng phải đánh dấu tệp có thuộc tính "bỏ qua dự phòng" để yêu cầu iCloud không sao lưu tệp.

Tôi nghĩ rằng bạn có thể bị mất bước 2.

Tôi đã viết một lớp MediaDirectory đơn giản mà nhanh chóng mang lại cho tôi đường dẫn đến các tập tin trong thư mục Library/Cache và cũng thêm thuộc tính bỏ sao lưu.

Sau khi bạn đã lưu tập tin của bạn vào thư mục THƯ VIỆN/Cache, bạn chỉ cần đi một cái gì đó như thế này:

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

Đây là lớp học đầy đủ:

// 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 
1

Ứng dụng trên điện thoại mà tôi vừa gửi đã bị Apple từ chối vì lý do tương tự và tôi chỉ sử dụng localstorage.

Tôi đã gửi lại với sở thích sau đây đặt trong config.xml tôi

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

Tôi hiểu điều này sẽ giải quyết vấn đề

Các vấn đề liên quan