Я пытаюсь проверить, было ли когда-либо полностью загружено приложение, загруженное из inte rnet. Я пытаюсь использовать xattr -p com.apple.quarantine
для этого, но возвращаемое значение из этой команды, похоже, не соответствует.
На одном Ма c я получаю в ответ эти два значения показателя Gatekeeper: 0183
, если приложение никогда не запускалось полностью, и 01c3
, если приложение запущено и пользователь нажал кнопку Открыть в Диалог GateKeeper «Вы действительно хотите открыть это приложение». На другом Ма c я получаю совершенно другие значения: 0003
& 0063
.
Я предполагаю, что это 4 ди git шестнадцатеричных числа, которые я могу преобразовать следующим образом:
NSString *gateKeeperScore = [outputItems firstObject];
NSScanner *scanner = [NSScanner scannerWithString:gateKeeperScore];
unsigned int number = 0;
if ([scanner scanHexInt:&number]) {
NSLog(@"Gatekeeper Score is %u", number);
}
Но есть ли порог, и как только счет превысит этот порог, я могу с уверенностью предположить, что приложение полностью запустилось и больше не находится в карантине?
Я пытался запустив оператор SQL select и получив все содержимое из таблицы LSQuarantineEvent
в ~ / Library / Preferences / com.apple.LaunchServices.QuarantineEventsV2, а затем используя grep, чтобы найти соответствующую строку, но я не вижу никаких изменений в строке до / после полного запуска приложения.
Есть ли способ определить, может ли приложение запускаться полностью и не помещено в карантин? Я пытаюсь выполнить sh это с помощью Objective- C. Песочницы нет. Заранее спасибо!
Вот пример кода того, что я делаю:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSString *output1 = [self runTask: [NSArray arrayWithObjects:@"-c", @"xattr -p com.apple.quarantine '/path/to/app'", nil]];
NSArray *outputItems = [output1 componentsSeparatedByString:@";"];
NSString *UUID = [outputItems lastObject];
UUID = [UUID stringByReplacingOccurrencesOfString:@"[\r\n]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, UUID.length)];
NSString *output2 = [self runTask: [NSArray arrayWithObjects:@"-c", [NSString stringWithFormat:@"sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 \"SELECT * FROM LSQuarantineEvent WHERE LSQuarantineEventIdentifier == '%@'\"", UUID], nil]];
}
- (NSString *) runTask : (NSArray *) args
{
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/bash"];
[task setArguments:args];
NSPipe * taskOutput = [NSPipe pipe];
[task setStandardOutput:taskOutput];
[task launch];
[task waitUntilExit];
NSFileHandle * read = [taskOutput fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * taskOutputString = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
return taskOutputString;
}
Значение output1
выглядит следующим образом:
01c3;5e31c850;Safari;92CB3715-7A0F-4582-9FF3-9B0CBE2A23BB
Изменяются только первые 4 символа до / после полного запуска приложения.
И значение output2
выглядит следующим образом:
92CB3715-7A0F-4582-9FF3-9B0CBE2A23BB|602013648.990506|com.apple.Safari|Safari|https://url/of/files/origin|||0|||
Это значение / строка в БД SQL, кажется, никогда не меняется.
Я прочитал этот пост и этот , но я не вижу способа достичь sh того, что я хочу сделать.