Objective c Cocoa:有没有办法知道用户是否设置了;设定日期及;“自动计时”;在系统首选项中?

Objective c Cocoa:有没有办法知道用户是否设置了;设定日期及;“自动计时”;在系统首选项中?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我想知道Cocoa应用程序是否有办法知道用户是否在其系统首选项中设置了“自动设置日期和时间”。如果是这样,我也想知道上次时钟更新的时间。 非常感谢您提供的帮助。您可以尝试使用(或类似)以root权限运行任务,然后解析结果。Hack-y/不是最好的,但它应该可以工作 编辑: 你想做什么?你好,谢谢你的快速回复。。。如果internet时间未激活,我想拒绝使用我的应用程序,这样我就可以肯定地信任系统时钟。“systemsetup-getusingnetworktime”似乎是官方解决方案,但它需要r

我想知道Cocoa应用程序是否有办法知道用户是否在其系统首选项中设置了“自动设置日期和时间”。如果是这样,我也想知道上次时钟更新的时间。 非常感谢您提供的帮助。

您可以尝试使用(或类似)以root权限运行任务,然后解析结果。Hack-y/不是最好的,但它应该可以工作

编辑:


你想做什么?你好,谢谢你的快速回复。。。如果internet时间未激活,我想拒绝使用我的应用程序,这样我就可以肯定地信任系统时钟。“systemsetup-getusingnetworktime”似乎是官方解决方案,但它需要root权限,甚至不能作为管理员运行。非常感谢你的回答。。。不幸的是,我确实尝试过,但systemsetup在STPrivilegedTask下仍然失败,因为它需要由root用户执行,而不仅仅是管理员。我已经通过反汇编systemsetup检查过了。我也在根目录检查中对其进行了修补,但在我的应用程序中运行一个被篡改的系统设置,这将超出任何良好设计的规则。再次感谢。另一个建议的解决方案是搜索root拥有的正在运行的ntpd进程。如果有,那么您可以假设网络时间已开启,但是,这只是一个假设。@AlfonsoTesauro-Hmm。老实说,
systemsetup
在终端和
sudo
中都对我有效。您关于
ntpd
进程运行的假设似乎是正确的(通过禁用/启用“自动设置日期和时间”进行测试),但似乎..很明显,他们最近改变了这种系统设置行为。你在运行约塞米蒂10.10.3吗?关于进程,我正在考虑使用NSTask调用ps-ax。。。我相信这是一个相当受支持的方法,可以假定在许多Mac Os X版本上都存在。@AlfonsoTesauro我正在运行Yosemite 10.10.3。看来你的NSTask解决方案是个好主意。您可以尝试
pgrep-f“ntpd”
或类似的方法-如果它正在运行,它将返回
ntpd
的进程号,如果它没有运行,它将返回任何内容。我已经阅读了有关这方面的反汇编和修补系统设置的内容。非常感谢你的帮助。
- (BOOL)networkTimeEnabled {
    STPrivilegedTask *task = [[STPrivilegedTask alloc] initWithLaunchPath:@"/usr/bin/sudo" arguments:@[@"/usr/sbin/systemsetup",@"-getusingnetworktime"]];
    if ([task launch] == noErr) {
        NSData *data = [task.outputFileHandle readDataToEndOfFile];
        [task waitUntilExit];

        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSString *status = [result componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet][2];
        return ([status isEqualToString:@"On"]);
    }
    return NO;
}