2014-02-06 12 views
8

Es gibt viele Informationen zu StackOverflow und anderen Informationen zum Löschen der Mac-Quarantäneeigenschaft. In meinem Fall würde ich es gerne einstellen. Dies ist, um zu testen, dass meine App ordnungsgemäß signiert ist, so dass der Benutzer die Warnung "Untrusted Developer" nach dem Herunterladen heiß bekommen wird.Verwenden von xattr zum Festlegen der Quarantäneeigenschaft von Mac OSX

Meine App ist besonders groß (wir verteilen von einer großen Datei Download-Site, nicht der Laden) und es ist nicht bequem zu Upload und Download, um dies zu testen. Ich hatte in der letzten Woche einige Schlachten mit Codesignierung, daher ist dieses Testen für mich wichtig.

Sobald eine Datei hat die Quarantäne Eigenschaft ich sehe, wie ich es ändern kann, um die Werte zu haben:

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) 

Aber ich weiß nicht, wie es die Eigenschaft in erster Linie geben.

Antwort

7

Der Code dafür ist nicht schwer, aber Sie brauchen FSRef es zu tun, die veraltet sind. Das heißt, es funktioniert immer noch am 10.9. Sie müssen sich mit CoreServices verbinden.

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; 
} 

Ein anderer Ansatz besteht darin, nur die Quarantäneinformationen von einer Datei in eine andere zu kopieren. Sie können xattr Informationen wie diese serialisiert:

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

Sie können dann diese Attribute auf eine andere Datei wie folgt anwenden:

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

(That sollte Arbeit, aber ich habe es nicht getestet mit Quarantäne Insbesondere verwende ich eine ähnliche Technik, um Codesignaturen zu speichern und sie erneut anzuwenden.)

+1

Das Kopieren des Attributs in die Textdatei und das anschließende Schreiben mit 'xattr -w' funktioniert tatsächlich. –

Verwandte Themen