Приложение Swift 2.2 больше не работает на macOS 10.14 Mojave

Я делаю плагин к ą стороннему приложению. Часть плагина написана на Swift. Подключаемый модуль застревает в Xcode 7.3.1 / Swift 2.2 из-за этой проблемы < / а>.

Плагин больше не работает в Мохаве.

У нас есть следующие наблюдения:

  • Проблема ограничена Mojave, все работает, как ожидалось, в более старых версиях macOS.
  • Если стороннее приложение просит «загрузить этот пакет» подключаемого модуля, оно просто получает ноль.
  • Метод init плагина вообще не вызывается.
  • Если я полностью удалю Swift 2.2 из базы кода плагина (сделав его непригодным для использования), его пакет будет правильно загружен.

Есть идеи, что может вызвать эту проблему и как ее исправить?

PS: Убедить пользователей установить более новую версию Python / PyObjC невозможно, и нельзя ожидать, что Apple объединит более новую версию Python / PyObjC с macOS (поэтому базу кода подключаемого модуля нельзя обновить до более новой версии Swift). Перенос кода со Swift на Objective-C планируется, но это произойдет не мгновенно (это вопрос нескольких месяцев).


person alik    schedule 18.10.2018    source источник
comment
Вам нужно будет обновить код до последней версии Swift, чтобы он был совместим с Xcode 9.3 > Above. Итак, сначала запустите проект в Xcode 8, затем преобразуйте его в соответствующую версию Swift, затем перейдите к одной версии впереди в Xcode 8.3 ..... затем Xcode 9.0 и ....... до Xcode 10. Вы не можете напрямую конвертировать Swift 2.2 в Swift 4.2.   -  person TheTiger    schedule 18.10.2018
comment
Как указано в вопросе (so the plug-in code base cannot be upgraded to a newer Swift version), я не могу обновиться до чего-либо новее, чем Swift 2.2, поскольку это последняя версия, совместимая с устаревшим PyObjC, входящим в состав macOS. Если я обновлюсь, и пользователь установит подключаемый модуль на основе Python, одновременно установив наш подключаемый модуль на основе Swift, все приложение выйдет из строя при запуске.   -  person alik    schedule 18.10.2018


Ответы (1)


Мне удалось запустить плагин в Мохаве.

Ноль был возвращен вызовом primaryClass NSBundle. На основании моего понимания официальной документации, два способа определения основного класса.

  • Имя основного класса указывается вручную в файле info.plist. Поскольку в подключаемом модуле он не указан здесь, этот шаг не следует применять.
  • Основной класс - это первый класс, указанный в командной строке ld при компоновке. Поскольку в High Siera и Mojave использовался один и тот же двоичный файл плагина, «первый из перечисленных в командной строке ld» был одинаковым, поэтому возвращаемый основной класс должен быть одинаковым в обеих версиях.

Каким-то образом вызов PrincipalClass вернул другое значение в High Sierra и Mojave. Лично я не вижу причин, по которым он должен вести себя по-другому, поскольку документация не изменилась, а логика кажется зависимой исключительно от того, что произошло при компиляции подключаемого модуля, а не от мирового контекста при его запуске.

Однако после того, как я добавил элемент NSPrincipalClass в файл info.plist, плагин успешно загружается в Mojave.

person alik    schedule 30.10.2018