Очень простая macOS XPC

Я хочу использовать XPC технология просто для запуска app. Мне не нужно ни межпроцессное взаимодействие, ни какие-либо другие функции XPC.

Единственные документы, которые я могу найти в Интернете, демонстрируют сложную структуру с кодом для службы XPC, отдельным кодом для запуска службы XPC через сценарий и кодом приложения для связи со службой.

Другими словами, мне нужно только что-то, что делает эквивалент этого:

NSWorkspace.shared.openApplication(at: path,
                                   configuration: configuration,
                                   completionHandler: nil)

но с ХПК. Поэтому мне нужно что-то вроде:

let listener = NSXPCListener.service("/path/to/my_app.app")
listener.resume()
RunLoop.main.run()

Очевидно, что сервисный метод не принимает аргумент, который был бы путем к исполняемому файлу, так что это не работает.

Как я могу это сделать ?

PS: чтобы объяснить мотивацию, запуск службы XPC сохранит ограничение песочницы из запускаемого приложения, тогда как запуск приложения напрямую через NSWorkspace.shared.openApplication не сохранит ограничения песочницы (поскольку порожденное приложение не имеет «com.apple.security.inherit» как право).


person DevShark    schedule 19.12.2019    source источник
comment
В документации для NSTask говорится: "В изолированном приложении дочерние процессы, созданные с помощью класса NSTask, наследуют песочница родительского приложения. Делает ли это более простым достижение того, чего вы хотите?   -  person TheNextman    schedule 19.12.2019
comment
Спасибо @TheNextman, это отличная идея. Я только что попробовал. Единственная проблема сейчас заключается в том, что приложение для запуска в песочнице отказывается запускать стороннее приложение. Это стороннее приложение подписано другим кодовым знаком (поскольку оно пришло из магазина приложений), так что проблема может быть в нем... Не уверен.   -  person DevShark    schedule 19.12.2019
comment
Мне удалось заставить его работать, но, к сожалению, запущенное приложение на самом деле все еще не изолировано. Например, я пробовал с Safari, и я все еще могу просматривать Интернет...   -  person DevShark    schedule 19.12.2019
comment
Какое приложение вы пытаетесь запустить? Это песочница? Каковы его права?   -  person TheNextman    schedule 20.12.2019
comment
Я пробовал с несколькими разными вещами. Я создал пустое приложение и попробовал разные права. Например, только право на песочницу. Я также пробовал с Safari.   -  person DevShark    schedule 20.12.2019
comment
Большое спасибо, да, я только что прочитал это на самом деле. Я думаю, это означает, что я не могу запустить какое-либо приложение, у которого нет именно этих двух разрешений, и, следовательно, я не могу запускать приложения из магазина приложений ... у вас есть какие-либо идеи для обхода?   -  person DevShark    schedule 20.12.2019
comment
Вопрос похож на проблему XY. Чего вы на самом деле пытаетесь достичь? Вы просто хотите программно запустить приложение Mac App Store?   -  person TheNextman    schedule 20.12.2019
comment
Моя цель — запустить стороннее приложение из магазина приложений в песочнице. Таким образом, он не может использовать трекер или выполнять действия, которые мне не нужны. В основном это функция устаревшего «sandbox-exec».   -  person DevShark    schedule 20.12.2019
comment
Верно, но приложение из App Store уже помещено в песочницу. Итак, вы пытаетесь переопределить права, которые у него есть? Я знаю, что sandbox-exec устарел, но делает ли он то, что вы хотите?   -  person TheNextman    schedule 20.12.2019
comment
Да, приложение из магазина приложений уже помещено в песочницу, но имеет слишком широкие разрешения. Поэтому я хочу запустить его в охватывающей песочнице, чтобы еще больше ограничить его. К сожалению, sandbox-exec не работает на Catalina.   -  person DevShark    schedule 20.12.2019
comment
sandbox-exec работает на Catalina; Я только что попробовал. Но я не думаю, что это позволяет вам переопределить песочницу уже изолированного приложения. Я рад оказаться неправым, но я не думаю, что то, чего вы хотите достичь, возможно.   -  person TheNextman    schedule 20.12.2019
comment
Ах правда? С моей стороны эта команда не работает: sandbox-exec -f sandbox_profile.sb /Applications/Safari.app   -  person DevShark    schedule 20.12.2019
comment
На самом деле, sandbox-exec работает для приложений без песочницы. Вы, наверное, это имели ввиду. Это не работает с Safari, потому что Safari уже является песочницей. Я не знаю, есть ли способ увеличить ограничения песочницы стороннего приложения...   -  person DevShark    schedule 20.12.2019
comment
Да, это то, что я имел в виду. Safari уже изолирован: 'codesign -d --entitlements :- /Applications/Safari.app | grep -i com.apple.security.app-sandbox -A 1'   -  person TheNextman    schedule 20.12.2019
comment
Да, ты прав. У меня немного не хватает идей на тот момент ... Хотя кажется, что это должно быть выполнимо, но я не уверен, как это сделать.   -  person DevShark    schedule 20.12.2019
comment
Защита, вероятно, предназначена только для того, чтобы вы не могли изменить ограничения песочницы, и точка. Все, что я могу думать, это то, что вы можете изменить цель, чтобы удалить право на песочницу, перекодировать ее, используя специальную идентификацию, а затем запустить ее с помощью sandbox-exec (или NSTask и т. д.)   -  person TheNextman    schedule 20.12.2019
comment
Звучит как отличный вариант, но возможно ли это? Могу ли я действительно удалить права стороннего приложения?   -  person DevShark    schedule 20.12.2019
comment
stackoverflow.com/questions/7018354/remove-sandboxing   -  person TheNextman    schedule 20.12.2019
comment
Большое спасибо! Это выглядит очень многообещающе, я посмотрю на это.   -  person DevShark    schedule 20.12.2019
comment
Удивительно, это сработало! Большое спасибо @TheNextman! Вы определенно заслужили несколько баллов по этому поводу, поэтому я проголосовал за некоторые другие ваши ответы, поскольку у вас не было ответа на мой вопрос.   -  person DevShark    schedule 21.12.2019


Ответы (1)


Кажется невозможным запустить подпроцесс, изменяя его песочницу (т.е. давая ему больше или меньше прав, чем он был изначально наделен).

Я рекомендую удалить песочницу из существующего приложения, соответствующим образом изменить права и затем повторно подписать его. Это не обычный подход, но он решит вашу конкретную проблему.

person TheNextman    schedule 26.12.2019