2012-05-29 3 views
2

Я пишу небольшое приложение для Mac (в Obj-C), который выполняет следующую команду:Песочницы - killall Операция не допускается

system("killall Finder"); 

Я хотел посмотреть, что произойдет, если я песочница приложения (как песочница потребуется 1 июня), и приложение не будет работать. Я получил следующий ответ:

killall: warning: kill -TERM 6524: Operation not permitted 

Есть ли способ обойти это? Как в конкретном праве добавить или другой способ запустить команду?

Заранее благодарен.

+2

Там очень много, что может быть отказано; функция 'system (3)', программа 'killall (1)', подпрограммы интроспекции для обнаружения сопоставлений 'comm'->' pid' или системный вызов 'signal (2)', который убивает процессы. Это _looks_, как вызов 'signal (2)', отклоняется, и я не был бы шокирован, если бы не было способа отправить сигналы процессам вне песочницы ... Каков ваш _goal_? (Конечно, 'killall Finder' - это не пункт вашего приложения ... :) – sarnold

+0

@sarnold Это было бы довольно бесполезным приложением: P. Я пытаюсь запустить простые команды, такие как 'defaults write com.apple.finder DesktopViewOptions -dict IconSize -integer 512'. После этого вам нужно «killall Terminal», чтобы он был введен в действие. – citruspi

+1

Hrm. Я думаю, что это расстроило бы пользователей. Много. – sarnold

ответ

1

Ваше приложение полностью противоречит духу песочницы, поэтому почти нет возможности, чтобы рецензенты MAS приняли его. Кроме того, вы можете быть удивлены тем, что «defaults write com.apple.finder» делает из вашей песочницы - в принципе, ничего полезного. Вам нужно будет использовать ограничение на временное исключение для home-relative /Library/Preferences/com.apple.finder.plist, использовать некоторый API, не поддерживающий sandbox, чтобы получить путь к дому (например, getpwent() -> pw_dir), и загрузите и сохраните plist напрямую. И тогда вы обнаружите, что нет способа вызвать не-дочерний процесс из изолированного приложения, периода, без него, и если вы попытаетесь выполнить системный killall, он закончит работу внутри той же изолированной среды, что и вы, и поэтому имеет те же ограничения.

Однако вы задали конкретный вопрос относительно того, существует ли способ обхода этой системы killall, и есть, по крайней мере, три (не считая отверстия в песочнице, которые были подключены к 10.7.4 или, безусловно, будут подключены скоро):

  1. Вы можете создать вспомогательное приложение, которое не изолировано, что делает killall для вас. Только два одобренных App Store способа сделать это XPC и SMLoginItemSetEnabled. И вам не разрешено включать помощника, если пользователь явно не говорит вам об этом.

  2. Вы можете отправить Finder событие Apple, попросив его уйти, а не сигнализировать об этом. Самый простой способ сделать это - выполнить приложение App app «App app» «Выход». По крайней мере, для 10.7.3 и более ранних версий вам понадобится временное исключение для отправки Apple Events в com.apple.finder. (Возможно, существуют разные механизмы для будущих версий ОС, но никто не может обсуждать их за пределами форумов NDA.)

  3. Вы можете отправить событие Apple в другие системные события процесса, чтобы убить Finder от вашего имени.

И так далее.

+0

Спасибо за ваш информативный ответ, сэр. – citruspi

+1

Нет проблем. Возможно, вы захотите попробовать просить об этом на devforums.apple.com (особенно если у вас есть членство в программе Mac Developer Program, и поэтому вы можете видеть форумы NDA, и вы также должны подать радар на bugreport.apple.com, просящий какой-то способ сделать то, что вы пытаетесь сделать. , но вы никогда не знаете ... и всегда лучше слышать от Apple «нет», чем идти на основе предположений некоторых других разработчиков. – abarnert

+0

Я не верю, что XPC или SMLoginItemSetEnabled позволят вам «создать вспомогательное приложение, которое не является», «Я не знаю этого точно, но я уверен, что Apple не разрешит приложениям, которые собирают приложения без песочницы. Кроме того, Apple обычно отклоняет приложения, содержащие права на com.apple.finder или com.apple .systemevents. – AriX