Ваше приложение полностью противоречит духу песочницы, поэтому почти нет возможности, чтобы рецензенты 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 или, безусловно, будут подключены скоро):
Вы можете создать вспомогательное приложение, которое не изолировано, что делает killall для вас. Только два одобренных App Store способа сделать это XPC и SMLoginItemSetEnabled. И вам не разрешено включать помощника, если пользователь явно не говорит вам об этом.
Вы можете отправить Finder событие Apple, попросив его уйти, а не сигнализировать об этом. Самый простой способ сделать это - выполнить приложение App app «App app» «Выход». По крайней мере, для 10.7.3 и более ранних версий вам понадобится временное исключение для отправки Apple Events в com.apple.finder. (Возможно, существуют разные механизмы для будущих версий ОС, но никто не может обсуждать их за пределами форумов NDA.)
Вы можете отправить событие Apple в другие системные события процесса, чтобы убить Finder от вашего имени.
И так далее.
Там очень много, что может быть отказано; функция 'system (3)', программа 'killall (1)', подпрограммы интроспекции для обнаружения сопоставлений 'comm'->' pid' или системный вызов 'signal (2)', который убивает процессы. Это _looks_, как вызов 'signal (2)', отклоняется, и я не был бы шокирован, если бы не было способа отправить сигналы процессам вне песочницы ... Каков ваш _goal_? (Конечно, 'killall Finder' - это не пункт вашего приложения ... :) – sarnold
@sarnold Это было бы довольно бесполезным приложением: P. Я пытаюсь запустить простые команды, такие как 'defaults write com.apple.finder DesktopViewOptions -dict IconSize -integer 512'. После этого вам нужно «killall Terminal», чтобы он был введен в действие. – citruspi
Hrm. Я думаю, что это расстроило бы пользователей. Много. – sarnold