У меня есть приложение Cocoa, которое обычно работает в полном 64-битном режиме на любом Mac, поддерживающем эту архитектуру.
Теперь у меня есть внешний API, который доступен только в виде 32-битного плагина для загрузки в основную программу. Этот API предназначен для стороннего устройства ввода, которое когда-либо купит лишь небольшой процент моих пользователей, но это важно для этого небольшого процента.
Моя проблема в том, что программа может использовать этот API только в том случае, если она выполняется в 32-битном режиме. Конечно, проще всего:
Сценарий 1: попросите пользователя запустить программу в 32-разрядном режиме, изменив ее информацию в диалоговом окне "Получить информацию" Finder.
Это легко сделать, но вряд ли элегантно.
Сценарий 2: всегда запускайте в 32-разрядном режиме, чтобы избежать проблемы
Вряд ли то, что я хочу сделать.. Наказание 98% пользователей ради экзотической функции.
Сценарий 3. Автоматически измените атрибуты запуска приложения, чтобы оно запускалось в 32-разрядном режиме при следующем запуске и каждый раз после этого
or
Сценарий 4. Во время запуска определите, какая архитектура используется, затем при необходимости перезапустите в 32-разрядном режиме
Сценарии 3 и 4 имеют проблему, заключающуюся в том, что очень мало документировано о том, как это сделать, и это может привести к проблемам с рекомендациями Mac App Store.
На данный момент я установил:
- что использование инструмента командной строки «arch» позволит мне перезапустить исполняемый файл в 32-битном режиме.
- Сценарий Finder не позволяет мне изменить флаг «Запуск в 32-битном режиме».
- флаг управляется Launch Services API (http://blog.timac.org/?p=490 а>)
- НО я не нашел никакого интерфейса для программного изменения флага в Launch Services API
Пока я вижу только эти варианты, ни один из которых не кажется особенно хорошим:
- перезапустите приложение с помощью NSTask и инструмента командной строки «arch»
- писать прямо в com.apple.LaunchServices.plist
- изолировать 32-битный плагин в его собственном 32-битном процессе и использовать IPC
Решение 1 может вызвать у меня проблемы с отправкой MAS. Решение 2 почти наверняка сделает это на каком-то этапе... только решение 3 будет идеальным с точки зрения пользователя, но добавит огромную сложность для минимальной отдачи.
Любые советы о том, как сделать это «чисто» и с разумными усилиями, будут высоко оценены!