2014-02-06 2 views
8

Mac 격리 저장소를 지우는 방법에 대한 정보는 StackOverflow 및 다른 곳에서 많이 있습니다. 제 경우에는 그것을 설정하고 싶습니다. 내 앱이 제대로 서명되었는지 테스트하여 사용자가 앱을 다운로드 한 후 "신뢰할 수없는 개발자"경고를 받도록합니다.xattr을 사용하여 Mac OSX 격리 저장소 설정

내 응용 프로그램은 특히 크기가 커서 (우리는 저장소가 아닌 큰 파일 다운로드 사이트에서 배포 함) 테스트하고 업로드하고 다운로드해야하는 것이 편리하지 않습니다. 나는이 테스트가 중요하기 때문에 지난주에 서명하는 코드로 몇 차례 싸웠습니다.

파일 내가 값을 가지고 그것을 변경할 수있는 방법을 볼 격리 재산되면 :

0002 = downloaded but never opened (this is the one that causes the warning) 
0022 = app aborted by user from the warning dialogue (you hit 'cancel' in the dialogue) 
0062 = app opened (at least) once (you hit 'open' in the dialogue) 

하지만 처음에 그에게 재산을 제공하는 방법을 모르겠어요.

답변

7

이 코드는 어렵지는 않지만 FSRef가 필요합니다.이 기능은 더 이상 사용되지 않습니다. 즉, 여전히 10.9에서 작동합니다. CoreServices와 링크해야합니다.

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
    if (argc != 2) { 
     printf("quarantine <path>\n"); 
     exit(1); 
    } 

    NSString *path = @(argv[1]); 
    OSStatus result; 
    FSRef pathRef; 
    result = FSPathMakeRef((UInt8*)[path UTF8String], &pathRef, 0); 
    if (result != noErr) { 
     NSLog(@"Error making ref (%d): %s", result, GetMacOSStatusCommentString(result)); 
     exit(result); 
    } 

    NSDictionary *quarantineProperties = @{(__bridge id)kLSQuarantineTypeKey: (__bridge id)kLSQuarantineTypeOtherDownload}; 

    result = LSSetItemAttribute(&pathRef, 
           kLSRolesAll, 
           kLSItemQuarantineProperties, 
           (__bridge CFTypeRef)quarantineProperties); 

    if (result != noErr) { 
     NSLog(@"Error setting attribute (%d): %s", result, GetMacOSStatusCommentString(result)); 
    } 
    exit(result); 
    } 
    return 0; 
} 

또 다른 방법은 한 파일에서 다른 파일로 격리 정보를 복사하는 것입니다.

xattr -p com.apple.quarantine file > file.xattr 

당신은 다음과 같은 다른 파일에 이러한 속성을 적용 할 수 있습니다 : 당신은이 같은 정보를에서 xattr 직렬화 할 수

xattr -w com.apple.quarantine "`cat file.xattr`" file 

(그 해야 작업,하지만 난 검역 그것을 테스트하지 않았습니다 비슷한 기술을 사용하여 코드 서명을 저장하고 다시 적용합니다.)

+1

속성을 텍스트 파일로 복사 한 다음 'xattr -w'로 복사하면 실제로 작동합니다. –