Принудительный запуск приложения Какао в 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
До сих пор я вижу только эти варианты, ни один из которых не кажется особенно замечательным:
- перезапустите приложение с помощью NSTask и инструмента командной строки "arch"
- написать прямо в com.apple.LaunchServices.plist
- изолировать 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-битном режиме. Вот что я сделал.
- Сделайте копию приложения, с которым вы хотите быстро менять режимы.
- Вызовите копию 32.app (в моем случае Reason32.app)
- Показать содержимое пакета этого нового приложения и удалить папку "Содержимое" (да, та, которая содержит все)
- Теперь зайдите в оригинал, сделайте символическую ссылку на содержание
- Скопируйте символическую ссылку в пакет appname32.app (где ранее находился старый удаленный)
- Используйте свойства поиска и отметьте 32-битный режим для вашей новой копии.
Теперь у вас есть 2 приложения, которые вы можете легко запустить / скрипт.