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

У меня есть приложение Какао, которое обычно работает в полном 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 ответа

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

Я разобрался, как установить ключ по умолчанию...

Учитывая переменную оболочки 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. Я не смог найти эту программу.

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам