Принудительный запуск приложения Какао в 32-битном режиме - PullRequest
9 голосов
/ 15 августа 2011

У меня есть приложение Какао, которое обычно запускается в полном 64-битном режиме на любом Mac, поддерживающем эту архитектуру.

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

Моя проблема в том, что программа может использовать этот API, только если выполняетсяв 32-битном режиме.Разумеется, проще всего сделать следующее:

Сценарий 1: попросить пользователя запустить программу в 32-разрядном режиме, изменив ее информацию в диалоговом окне «Получение информации» в Finder.

Это легко сделать, но вряд ли изящно ..

Сценарий 2: всегда работать в 32-битном режиме, что позволяет избежать проблемы

Вряд ли я хочусделать либо .. штрафовать 98% пользователей за экзотическую особенность.

Сценарий 3: автоматически изменять атрибуты запуска приложения, чтобы оно запускалось в 32-разрядном режиме при следующем запускеи каждый раз после этого

или

Сценарий 4: во время запуска определите, какая архитектура используется, затем перезапустите в 32-битном режиме, если необходимо

В сценариях 3 и 4 проблема заключается в том, что очень мало задокументировано о том, как это сделать, и это может привести меня к проблемам с рекомендациями Mac App Store.

Пока что яустановлено:

  • , что с помощьюИнструмент командной строки «arch» позволит мне перезапустить мой исполняемый файл в 32-битном режиме
  • Сценарии Finder не позволят мне изменить флаг «Запуск в 32-битном режиме»
  • флагуправляется API Launch Services (http://blog.timac.org/?p=490)
  • НО я не нашел никакого интерфейса для программного изменения флага в Launch Services API

Пока я вижу толькоэти опции, ни одна из которых не кажется особенно полезной:

  1. перезапускают приложение, используя NSTask и инструмент командной строки "arch"
  2. , записывают непосредственно в com.apple.LaunchServices.plist
  3. изолирует 32-битный плагин в свой собственный 32-битный процесс и использует IPC

Решение 1 может привести к проблемам с отправкой MAS.Решение 2 почти наверняка сделало бы это на каком-то этапе ... только решение 3 было бы идеально с точки зрения пользователя, но добавило бы огромную сложность для минимальной отдачи.

Любые советы о том, как сделать это "чисто""и при разумных усилиях будет высоко ценится!

Ответы [ 4 ]

4 голосов
/ 16 августа 2011

Вариант 5: Создайте еще один исполняемый файл, который всегда работает как 32-разрядный, и его единственная цель - запустить рассматриваемый 32-разрядный компонент. Запустите этот исполняемый файл из основного приложения и используйте некоторый тип независимой от процессора io для связи друг с другом, возможно, с сокетами.

2 голосов
/ 17 марта 2012

Я выяснил способ установки ключа по умолчанию ...

С учетом переменной оболочки bash:

alias="<0000 .... 1234>"  #(there is a lot more hex data than that...)

И идентификатор пакета:

bundle="com.mycompany.myprogram"

Вы можете установить ключ таким образом:

defaults write com.apple.LaunchServices LSArchitecturesForX86_64 -dict-add $bundle "($alias, i386)"

Удачи в создании бинарного псевдонима. Я просто краду _CFURLAliasData из com.plist.dock, поскольку в программе, которую я пытаюсь установить для запуска 32-битной системы, в док-станции установлен значок. Другим способом создания псевдонима, если вы можете его достать, может быть использование программы dockit.c. Я не смог найти эту программу.

1 голос
/ 03 октября 2011

Вы можете программно изменить режим запуска приложения, изменив файл plist, расположенный здесь:

~/Library/Preferences/com.apple.LaunchServices.plist

Вам необходимо изменить ключ, расположенный по адресу /LSArchitecturesForX86_64/[your.app.idenitfier]/Item 1/

  • установка в x86_64 будет работать в 64-битном
  • установка в i386 будет работать в 32-битном

Вы можете редактировать это свстроенная команда defaults или встроенная команда plistbuddy.Мне никогда не удавалось получить ключ, уровень которого мог бы измениться с defaults, если я выясню синтаксис plistbuddy, я опубликую его.

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

0 голосов
/ 25 февраля 2014

Мой сценарий очень похож.Я использую Ableton Live и Reason в качестве переподключенного раба.Если я запускаю Ableton в 32-битном режиме, мне нужно, чтобы Reason был в 32-битном режиме.Вот что я сделал.

  1. Сделайте копию приложения, с которым вы сможете быстро менять режимы.
  2. Вызовите копию 32.app (в моем случае Reason32.app)
  3. Показать содержимое пакета этого нового приложения и удалить папку «Содержимое» (да, ту, которая содержит все)
  4. Теперь перейдите к оригиналу, создайте символическую ссылку на содержимое
  5. Скопируйте символическую ссылку в пакет appname32.app (где ранее находился старый удаленный)
  6. Используйте свойства поиска и отметьте 32-битный режим для вашей новой копии.

Теперь у вас 2 приложенияВы можете легко запустить / скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...