我正在尝试检查从互联网下载的应用程序是否已完全启动。我正在尝试使用xattr -p com.apple.quarantine
它,但是该命令的返回值似乎不一致。
在一台 Mac 上,我在返回中得到这两个 Gatekeeper Score 值:0183
如果应用程序从未完全启动,以及01c3
如果应用程序已经启动并且用户在 GateKeeper“你真的要打开这个应用程序”对话框中单击“打开”。在另一台 Mac 上,我得到完全不同的值:0003
&0063
。
我猜这些是 4 位十六进制数字,我可以像这样转换:
NSString *gateKeeperScore = [outputItems firstObject];
NSScanner *scanner = [NSScanner scannerWithString:gateKeeperScore];
unsigned int number = 0;
if ([scanner scanHexInt:&number]) {
NSLog(@"Gatekeeper Score is %u", number);
}
但是是否有一个阈值,一旦分数超过该阈值,我可以安全地假设该应用程序已完全启动并且不再被隔离?
我尝试运行 SQL 选择语句并从表中获取全部内容LSQuarantineEvent
~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 中的表中获取全部内容,然后使用 grep 查找相关行,但我没有看到任何变化应用程序完全启动之前/之后的行。
有什么方法可以确定一个应用程序是否可以完全启动并且没有被隔离?我正在尝试使用 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 DB 中的这个值/行似乎永远不会改变。