NSApp недоступен в UIKit для Mac: как встроить платформу Mac только в приложение iOS на macOS? - PullRequest
8 голосов
/ 01 июля 2019

UIKit для Mac

Я изучаю новые возможности с Xcode 11 и macOS Catalina для создания версии iPad для Mac с использованием UIKit.Обычно работает как положено.

Какой лучший способ настроить NSWindow в приложении для iOS на macOS?


Не ограничивайтесь флажком

https://developer.apple.com/documentation/uikit/creating_a_mac_version_of_your_ipad_app

Эти же подходы можно использовать для включения инфраструктуры и кода, доступных только в macOS.Для платформы выберите macOS для настройки платформы и заключите код с оператором #if targetEnvironment (UIKitForMac).

В качестве отправной точки я создал базовую среду MacOS (например, MacMan.framework) для настройки поведения, специфичного для Mac.

Несмотря на все мои попытки, я сталкиваюсь с ошибками:

  • «NSApp» недоступно в UIKit для Mac
  • «NSWindow»недоступна в UIKit для Mac
  • Сборка для UIKit для Mac, но связанная платформа MacMan.framework собирается для macOS.Вам может потребоваться настроить MacMan.framework для сборки UIKit для Mac или ограничить платформы, для которых эта платформа должна быть связана в редакторе целевых объектов.

Кажется, что все наоборот (легкоисключить код)

#if !targetEnvironment(UIKitForMac)

override var prefersHomeIndicatorAutoHidden: Bool {
    return true
}

#endif

Ссылки:

https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit

1 Ответ

4 голосов
/ 04 июля 2019

Согласно Apple, если ваше приложение зависит от платформы, созданной для macOS, вам нужно будет либо исключить его из любых сборок iOS, либо вам нужно будет перестроить его для iOS и macOS, чтобы можно было обусловитькод, который доступен только в iOS или MacOS.Для этого Apple рекомендует вам преобразовать это в xcframework.Поскольку основа, от которой вы зависите, указывает на NSApp и NSWindow, которые являются символами, недоступными в iOS, вы получаете ошибки, о которых упоминаете.

Поэтому, если у вас есть исходный код дляMacMan.framework, вам нужно поработать над ним, чтобы преобразовать его в xcframework путем условного кодирования, который зависит от конкретной платформы, поскольку они ссылаются на рамки, недоступные на другой платформе.

Еслиу вас нет исходного кода, поэтому вам нужно поговорить с поставщиком платформы, чтобы предоставить вам такой двоичный файл.Если это невозможно, то вам придется исключить MacMan.framework, который был специально создан для платформы macOS.

Все это объясняется в видеоролике WWDC 2019 под названием " Представление приложений iPad дляMac".

Кроме того, я также рекомендую проверить соответствующие видео на той же странице, чтобы узнать, что делать.Наконец, чтобы узнать, как создать xcframework, посмотрите видео « Binary Frameworks in Swift ».Не обманывайтесь заголовком последнего видео: вы также можете создавать xcframeworks в Objective-C, если вам это нужно.

Если вам нужно настроить фон окна, вы не можете сделать это с помощью NSWindow;как я объяснил выше, этот API недоступен, но вам нужно использовать его аналог iOS: UIWindow.В этом случае вы можете изменить фон окна следующим образом:

self.view.window.backgroundColor = .red

self, являющийся вашим UIViewController.

Другой возможной настройкой является добавление панели инструментов, поскольку NSToolbar теперь экспортируется через:

let toolbar = UIWindowScene.titlebar.toolbar

Более полное объяснение и пояснения, касающиеся добавления и настройки NSToolbar в приложении UIKIt для Mac, объясняются здесь .

...