App Store iCloud 관련 거절문제 (QA1719)

-- iOS (iPhone) 2015. 7. 30. 10:35
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
iOS로 mp3를 다운받아 앱 경로에 저장하고, 저장된 mp3를 리스트화하여 듣고 싶은 mp3를 듣는 앱을 마켓에 등록했었다.
documents 폴더에 mp3 파일을 저장하였었는데, App Store iCloud Reject (QA1719)가 발생했다.


We found that your app does not follow the iOS Data Storage Guidelines, which is required per theApp Store Review Guidelines.

In particular, we found that on launch and/or content download, your app stores 4.13MB. To check how much data your app is storing:

- Install and launch your app
- Go to Settings > iCloud > Storage & Backup > Manage Storage 
- If necessary, tap "Show all apps" 
- Check your app's storage

The iOS Data Storage Guidelines indicate that only content that the user creates using your app, e.g., documents, new files, edits, etc., should be backed up by iCloud. 

Temporary files used by your app should only be stored in the /tmp directory; please remember to delete the files stored in this location when the user exits the app.

Data that can be recreated but must persist for proper functioning of your app - or because customers expect it to be available for offline use - should be marked with the "do not back up" attribute. For NSURL objects, add the NSURLIsExcludedFromBackupKey attribute to prevent the corresponding file from being backed up. For CFURLRef objects, use the corresponding kCFURLIsExcludedFromBackupKey attribute.
 



문제는 iOS에서 앱관련 파일들을 iCloud로 백업하는 기능이 생기면서 mp3 등의 파일들이 너무 큰 용량을 차지하고 있어 백업정책에 위배되므로 나온 거절이었다.

거절메일에는 /tmp에 파일을 저장할 것을 권고하고 있었으나, /tmp는 앱종료 시 파일도 함께 삭제되므로 등록한 앱에 특성에 맞지 않았다. 그래서 documents에 저장하던 것을 Application Support 폴더에 저장하도록 위치를 변경하였고, 아래의 함수를 통해 해당 경로에 있는 파일들을 iCloud로 백업하지 않도록 하였다.

처음 거절 시 아래의 함수 중 5.1 이상에 대한 코딩만 하여 통과되었었는데, 이번에 앱 업데이트를 진행하는 과정에 다시 또 같은 거절이 일어나서 찾아보니 5.0.1 이하에 대한 부분이 있어 아래처럼 수정 후 현재 심사를 기다리는 중이다.


#include <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    if (&NSURLIsExcludedFromBackupKey == nil) { 
       
        // iOS <= 5.0.1
        const char* filePath = [[URL 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;
    } else {
        // iOS >= 5.1
        NSError *error = nil;
        [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
        return error == nil;
    }
}


NSURL* URL= [NSURL fileURLWithPath: @"<path>/<mp3 file>"];
[self addSkipBackupAttributeToItemAtURL: URL];

참고 : https://developer.apple.com/library/ios/qa/qa1719/_index.html#//apple_ref/doc/uid/DTS40011342

 

 

추가) 2015-08-17

위의 코드만으로 심사에 또 거절되어 앱에서 사용하고 있는 DB파일도 /Library/Application Support로 옮겨 심사 신청을 했다.
검색했던 블로그에서는 DB파일까지 옮기면 심사 승인이 이루어졌다고 하여, 기대했으나 이 역시도 같은 사유로 거절되었다.

아마도 참조했던 블로그의 글이 좀 오래된 글이 아니었던가 생각한다.
다시 검색하여 아래의 결론을 내렸다.

iOS 2.2 이상의 버전에서는 아래 3개의 폴더를 제외한 모든 폴더를 백업

 

  1. <Application_Home>/AppName.app

  2. <Application_Home>/Library/Caches

  3. <Application_Home>/tmp

앱의 특성 상 파일이 영속적으로 저장되어 있어야 하므로 /tmp폴더는 사용할 수 없고 /Library/Caches에 파일을 저장해야 할 것으로 판단되나, 이 폴더에 파일을 저장하는 것이 영속적일 것인지 의문이 들었다.

     <Application_Home>/Documents : 사용자가 생성 데이터로 iCloud로 자동 백업 용도
     <Application_Home>/Library/Caches : 앱에서 재생성 및 재다운로드가 가능한 형태의 데이터 또는 컨텐츠의 저장 용도
     <Application_Home>/tmp : 임시, 일시적인 용도로 사용

우선은 애플에 /Library/Caches에 대해 이메일로 문의를 해둔 상태이며, 정확한 거절 사유 및 해결방법을 처리하여 업데이트 완료가 되면 글을 업데이트 하도록 하겠다.

참고 : http://stackoverflow.com/questions/7762743/icloud-storage-of-media-in-iphone-documents-folder 

 

 

추가) 2015-09-14

/Library/Caches는 시스템에 의해 주기적으로 삭제가 되므로, 앱의 목적에 맞지 않았다.
앱 내의 사용하지 않는 이미지 파일들을 정리하여 삭제한 후 앱을 다시 올려 심사요청을 하였다.

결과는 심사성공.

이미지파일들의 크기가 거절사유였는지는 정확히 모르겠으나, 애플에 이메일 및 유선통화를 통해서도 자세한 사유를 알려주지 않는 상황에서 쓰지 않는 파일들을 정리하고 사용하는 샘플파일의 용량을 줄여서 성공한 케이스이다. 
posted by 어린왕자악꿍