我正在尝试检查从互联网下载的应用程序是否已经完全启动。我正在尝试为此使用xattr -p com.apple.quarantine
,但是此命令的返回值似乎不一致。
在一台Mac上,我得到以下两个Gatekeeper得分值: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 select语句,并从〜/ library / Preferences / com.apple.LaunchServices.QuarantineEventsV2中的表LSQuarantineEvent
中获取全部内容,然后使用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中的此值/行似乎从未改变。