2015-04-21 4 views
2

Я хотел бы знать, есть ли способ из приложения Cocoa узнать, имеет ли пользователь «установить дату & времени автоматически», установленную в его Системных настройках. Если это так, я также хотел бы узнать время последнего обновления часов. Большое спасибо за любую помощь, которую вы можете предоставить.Cocoa: есть ли способ узнать, установил ли пользователь «Установить дату и время автоматически» в системных настройках?

+0

Что вы пытаетесь сделать? – mipadi

+0

Здравствуйте, спасибо за быстрый ответ ... Я бы хотел запретить использование моего приложения, если время в Интернете неактивно, так что я могу доверять системным часам точно. Похоже, что «systemsetup -getusingnetworktime» является официальным решением, но оно требует привилегий root, даже не запускается как администратор. Спасибо –

ответ

1

Вы можете попробовать использовать STPrivilegedTask (или аналогичный) для запуска задачи с правами root, а затем проанализировать результат. Hack-y/не лучший, но он должен работать.

Edit:

- (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; 
} 
+0

Большое спасибо Seb за ваш ответ ... к сожалению, я пробовал именно это, но systemetup продолжает терпеть неудачу под STPrivilegedTask, так как его нужно выполнять от root, а не от администратора. Я проверил это, разобрав систему. Я также исправил его в своем корневом чеке, но распространение моего приложения с помощью несанкционированного системного набора, запущенного внутри него, будет за пределами любого правила хорошего дизайна. Еще раз спасибо. Еще одно предлагаемое решение - поиск запущенных процессов ntpd, принадлежащих root. Если он есть, вы можете предположить, что сетевое время включено, но, опять же, это просто предположение. –

+0

@AlfonsoTesauro Хмм. Честно говоря, 'systemetup' работал для меня как в терминале с' sudo', так и с помощью этого метода. Ваше предположение о запуске 'ntpd' работает корректно (проверено отключением/включением« Установить дату и время автоматически »), но, похоже, [методы для получения полного списка процессов для фактической проверки его устарели] (http : //stackoverflow.com/questions/2518160/programmatically-check-if-a-process-is-running-on-mac) .. –

+0

По-видимому, они недавно изменили это поведение системы. Вы используете Yosemite 10.10.3? О процессах я думал о вызове ps -ax с помощью NSTask ... Я считаю, что это довольно поддерживаемый метод и можно предположить, что он существует во многих версиях Mac OS X. –

Смежные вопросы