iTunes File Sharing 지원할 경우 Document 디렉토리 사용에 관하여

현 시점의 iOS 공개버전 5.0.1 시점에서 앱 스토어에 앱을 등록 시 sandbox 내의 Document 사용이 엄격히 통제되고 있다.
이유는 iOS5에서 공개된 iCloud 때문이며, iCloud 트래픽을 줄이기 위한 제한사항으로 보여진다.

애플의 권고사항을 간략히 살펴보자면,
Document는 사용자에 의해 생성된 데이터야 하며, 다시 다운로드가 가능하거나 캐싱(Caching)용도로 사용할 수 없다.
캐싱용도로 사용을 위해서는 Temp 디렉토리나 Cache 디렉토리 이용을 사용하라는 다소 엄격한 권고사항이다.

위 권고를 어기고 앱 등록 시에는 어김없이 Reject이라는 결과를 얻게되고 Resolution Center에서는 이에 대해 수정하라고 명시된다.

개인적으로는 이 권고는 사용자의 네트워크 비용이나 iCloud 자체의 유지보수 차원에서는 찬성이지만
iTunes File Sharing 과 같은 기능을 지원 시에는 사용자 데이터로 봐야할지 다시 다운로드가 가능한 데이터로 봐야할지 애매하다.

그래서인지 iOS5가 공개되고 얼마되지 않아 iOS5.0.1이 공개되었으며 업데이트 내용 중에는 File Attribute가 추가되었다.

이 역시 간략히 설명하자면,
Document 디렉토리에 데이터를 저장하는 것은 가능하지만 File Attribute를 이용해 iCloud와 동기화하지 않도록 속성을 부여해라.
라는 것이다.

그렇다면 다시 iTunes File Sharing 지원을 살펴보자.
자주 사용하는 분들은 아시겠지만 iTunes File Sharing의 경우 위에서 언급한 문제의 Document 디렉토리만 사용할 수 있다는 것이다.

자- 이제 문제해결 방안을 생각해보겠다.

iTunes File Sharing을 이용하고 싶고 현재 단말기가 iOS5.0.1이라면 권고사항인 File Attribute를 이용해서 파일의 속성을 부여하면 된다. 간단하다. 하지만 Deployment Target이 iOS5.0.1 미만 버전이라면 어떻게 해결을 해야할까?

애플 공식 문서에 속성 부여 코드가 나와 있으며, 이 코드는 Linux 시스템에서 사용하는 Extended Attribute를 부여하는 방법 그대로 사용하였으므로 iOS 버전에 관계없이 사용이 가능하다. 즉, iOS 버전에 따라 분기처리가 필요하지 않은 부분이다.

결론은,
버전에 관계없이 해당 속성을 부여하면 iCloud 동기화 유무와 관계없이 애플 심사에서 Reject 당할 사유가 없다는 것이다.
주의점은 동기화 해야할 파일과 하지말아야 할 파일들을 잘 구분해 적절하게 속성값을 부여해야한다는 점일 것이다.

아래는 테스트한 결과물이다.

1. 파일에 속성 부여 (리턴값이 0이면 제대로 부여되었다는 의미)

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *)path {

    const char *filePath = [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;
}

2. 파일 속성이 부여되어 있는지 판단 (리턴값이 -1이면 부여되지 않았으며, 0이면 이미 부여되었다는 의미)

- (BOOL)getSkipBackupAttributeToItemAtPath:(NSString *)path {

    const char *filePath = [path fileSystemRepresentation];
    const char *attrName = "com.apple.MobileBackup";

    u_int8_t attrValue = 1;

    int result = getxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);

    return result == 0;
}

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.