В настоящее время я использую Xcode 11 Beta 5. В моем приложении он отлично работает на iOS 12 и ниже. Однако в iOS 13 похоже, что UIScene
по умолчанию используется. Это заставляет мое приложение ничего не делать.
Когда приложение запускается при новой установке, пользователь должен принять условия использования. После согласования они переходят на экран загрузки, который затем направляет их на главный экран. На опубликованном мною скриншоте вид позади текущего на переднем плане - это экран загрузки заставки.
Вскоре мы рассмотрим возможность добавления поддержки сцены с несколькими представлениями во всем приложении, но сейчас у нас есть более приоритетные вещи, над которыми нужно работать.
«Поддержка нескольких окон» уже отключена в общих настройках целевого приложения. Также у меня для параметра Enable Multiple Windows установлено значение NO в файле info.plist.
Пока ничего толком не сработало. В основном я хочу отказаться / отключить несколько окон и UIScene / SwiftUI, чтобы восстановить исходное поведение в iOS 10-12. Возможно ли это в iOS 13 или мы должны его обновить?
Обновить:
Вот скриншот иерархии отладки представления. Левая сторона - iOS 12, правая - iOS 13. Почему не добавляется ничего в Info.plist или какие-либо классы или методы делегата сцены? Практически просто запустил его в существующем готовом для производства коде на Xcode 11.
viewWill|DidAppear
, не вызываются одинаково в iOS 13, например, при отклонении представленных контроллеров представления. Добавьте множество сообщений отладки жизненного цикла и точек останова и сравните поток между iOS 12 и 13 и посмотрите, в чем он отличается.Ответы:
Хотя вы должны использовать сцены, когда ваше приложение работает под iOS 13 и более поздних версий, вы можете полностью отказаться, пока вы по-прежнему поддерживаете iOS 12 или более ранние версии.
Полностью удалите запись «Application Scene Manifest» из Info.plist.
Если есть класс делегата сцены, удалите его.
Если в делегате вашего приложения есть методы, связанные со сценой, удалите эти методы.
Если его нет, добавьте свойство
var window: UIWindow?
в делегат вашего приложения.Теперь ваше приложение должно использовать только делегата приложения, а в iOS 13 оно должно иметь тот же жизненный цикл, что и iOS 12.
Примечание. Ничто из этого не относится к Swift или SwiftUI.
источник
AppDelegate
том, что я адресовал. Возвращается ли это автоматически к описанному вами процессу? (Мне как бы больше нравится ваш ответ, поскольку он полностью игнорирует сцены.)Надеюсь, лучше использовать ответ, чем комментарий. (Не стесняйтесь комментировать, я отредактирую.)
С этим я тоже столкнулся, и здесь есть несколько сценариев:
UIKit
приложением в Xcode 11, просто откройте его, и оно должно работать нормально. Все мои приложения есть, безSceneDelegate
файлов, без каких-либо измененийAppDelegate
или раскадровок.UIKIT
приложение для iOS 13 , просто создайте его, убедившись, что вы не отметили флажок «Использовать SwiftUI».Но мне интересно, сталкиваетесь ли вы с третьим сценарием - тем, что я сделал около недели назад. Создание нового приложения ʻUIKit, ориентированного на что-то более раннее, чем iOS 13 . (Я на самом деле нацелился на iOS 9!)
Да, ваш шаблон выдаст вам 15 ошибок (по состоянию на бета 5), а также
SceneDelegate
файлом / классом. К счастью, Xcode поможет вам автоматически исправить все, кроме одного.Последний - добавить одну строку, которая является частью
SceneDelegate
класса, но, к сожалению, Apple оставила ее внеAppDelegate
класса - что после более чем десятка@available(iOS 13.0, *)
предложений означает, что вы отказались отSceneDelegate
использования iOS 12 и знаете что? Это не тамApDelegate
!Добавьте это в свой AppDelegate:
var window: UIWindow?
На этом этапе у вас должно быть работающее
UIKit
приложение, ориентированное на iOS 12 и ранее.источник
SceneDelegate
и тестирование говорит: (а) они работают в iOS 13 и (б) они вообще не поддерживают несколько окон, просто разделите представление между двумя приложениями. (Я также не поддерживаю перетаскивание.) Что-то еще происходит с вашей стороны?SceneDelegate
, нетSwiftUI
, нет возможности создавать несколько экземпляров моих приложений iOS 9+. Производительность такая же, как и всегда - все этоCoreImage
настраиваемые фильтры, обновляемые в реальном времени - ну, а для меня? Если есть какая-то проблема, связанная с ОС, связанная со сценами в иерархии представлений, это спорный вопрос, если он не поддерживает сцены. (И в заключение, да, я все еще немного обеспокоен. Но это еще и бета-версия 5.) Надеюсь, у вас есть хорошая резервная копия, которая может воспроизвести то, что я вижу.Я заставил это работать, используя ответ dfd, но поскольку мое приложение находится в Objective-C, мне пришлось внести одно изменение:
В Objective-C вы хотите поставить
@property (strong, nonatomic) UIWindow *window;
в AppDelegate.h (не в .m)
источник
Хорошо, я понял это. Из-за изменений в iOS 13 нового стиля представления карточек Apple по умолчанию, в моей раскадровке, переходящей от заставки к моему настраиваемому контроллеру навигации потока, по умолчанию используется новая презентация (см. Снимок экрана ниже).
Я исправил это, вернувшись к старому стилю, который по умолчанию использовался для старого жизненного цикла. Смотрите скриншот ниже.
Не уверен, почему это произошло, так как это было единственное место в моем приложении, которое вызвало это (довольно большое приложение, поэтому мне нужно потратить некоторое время на просмотр всех раскадровок, чтобы убедиться).
источник
Xcode 12 - Swift 5.3 - iOS 14
Начиная с Xcode 12 и с помощью Swift 5.3 и у
@main
вас может быть мультиплатформенное приложение, у которого нетSceneDelegate
события илиAppDelegate
. Будет только простой файл вроде:import SwiftUI @main struct MyMultiPlatformApp: App { var body: some Scene { WindowGroup { ContentView() } } }
источник