Понимание привилегированных вспомогательных инструментов в OSX
Мне нужно в какой-то момент в моем приложении повышенные операции. Для этого я нашел яблоки SMJobBless механизм. Я написал простой вспомогательный инструмент и установил его через SMJobBless
, Пока это работает. Но что я сейчас не понимаю: как запустить этот инструмент Helper после его установки?
2 ответа
Читая почти все, что я нашел для этого, я теперь использую XPC Conenction для активации вспомогательного инструмента, который затем запускается по требованию launchd после его установки с помощью SMBlessJob
, Для этого вам нужно создать MachService через plist
вашего вспомогательного инструмента:
<key>MachServices</key>
<dict>
<key>com.my.program.Helper</key>
<true/>
</dict>
(Это нужно сделать в launchd.plist вашего помощника, а не в info.plist).
В вашем вспомогательном инструменте вам необходимо создать службу Mach:
@property (atomic, strong, readwrite) NSXPCListener *listener;
self->_listener = [[NSXPCListener alloc] initWithMachServiceName:@"com.my.program.Helper"];
self->_listener.delegate = self;
После этого вы можете подключиться с помощью XPC. Если вам нужна дополнительная информация об этом, посмотрите этот пример от Apple: https://developer.apple.com/library/content/samplecode/EvenBetterAuthorizationSample/Listings/Read_Me_About_EvenBetterAuthorizationSample_txt.html
К сожалению, Apple отказалась от образца, на который ссылался Нидхеггер, и так и не выпустила новый на Swift. Для тех, кто ищет, как лучше всего подойти к этому в Swift, я собрал SwiftAuthorizationSample, который, надеюсь, показывает, как это сделать довольно просто. Так как я также сначала нашел это довольно запутанным и пришел к выводу, что это намного сложнее, чем должно быть, я сделал структуру SecureXPC, которая упрощает создание сервера для этого сценария.
XPCMachServer.forBlessedHelperTool()
- он автоматически настраивается на основе списков свойств, которые вы уже создали для
SMJobBless
.