Xcode 11 - отказаться от UISceneDelegate/SwiftUI на iOS 13
В настоящее время я использую Xcode 11 Beta 5. В моем приложении оно отлично работает на iOS 12 и ниже. Тем не менее, на iOS 13 похоже, что он использует UIScene по умолчанию. Это заставляет мое приложение ничего не делать.
Когда приложение запускается при новой установке, пользователь должен принять условия. После согласования они переходят к экрану загрузки, который затем направляет их к основному виду. На скриншоте, который я разместил, за текущим на переднем плане изображением находится экран загрузки заставки.
Скоро мы рассмотрим добавление поддержки сцен с несколькими представлениями в приложение, но сейчас у нас есть вещи с более высоким приоритетом, над которыми мы должны работать.
"Поддержка нескольких окон" уже отключена в общих настройках целевого приложения. Также в файле info.plist для параметра "Включить несколько окон" установлено значение "НЕТ".
Пока что ничего не получилось. По сути, я хочу отказаться / отключить несколько окон и UIScene/SwiftUI, чтобы восстановить исходное поведение в iOS 10-12. Возможно ли это в iOS 13 или мы должны обновить его?
Обновить:
Вот скриншот иерархии отладки представления. Левая сторона - iOS 12, правая сторона - iOS 13. Без добавления чего-либо в Info.plist, а также классов и методов делегатов сцены, почему это отличается? Практически просто запустил его в существующем готовом к использованию коде на Xcode 11.
6 ответов
Хорошо, так что я понял это. Из-за изменений в iOS 13 нового стиля презентации карт по умолчанию от Apple, в моей раскадровке переходят от моего заставки к моему пользовательскому контроллеру навигации потока, установленному по умолчанию для новой презентации (см. Скриншот ниже).
Как я это исправил, я должен был вернуться к старому стилю, который по умолчанию перешел на старый жизненный цикл. Смотрите скриншот ниже.
Не уверен, почему это произошло, так как это было единственное место в моем приложении, которое вызвало это (довольно большое приложение, поэтому мне нужно потратить некоторое время на просмотр всех раскадровок, чтобы убедиться).
Хотя вам следует использовать сцены, когда ваше приложение работает под iOS 13 и более поздними версиями, вы можете полностью отказаться, пока вы все еще поддерживаете iOS 12 или более раннюю версию.
Сначала полностью удалите запись "Манифест сцены приложения" из Info.plist.
Если есть класс делегата сцены, удалите его.
Если в вашем делегате приложения есть какие-либо связанные со сценой методы, удалите эти методы.
Ваше приложение теперь должно использовать только делегат приложения, а в iOS 13 оно должно иметь тот же жизненный цикл, что и iOS 12.
Ничто из этого не относится к Swift или SwiftUI.
Используя ответ, мы надеемся, что форматировать вещи лучше, чем комментарий. (Не стесняйтесь комментировать, и я буду редактировать.)
С этим я тоже столкнулся, и здесь есть несколько сценариев:
- Если вы хотите работать над существующим
UIKit
приложение в Xcode 11, просто откройте его, и оно должно работать нормально. Все мои приложения есть, без SceneDelegatefile nor any changes to
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 и более ранних версий.
Я заставил это работать, используя ответ dfd, но поскольку мое приложение находится в Objective-C, мне пришлось внести одно изменение:
В Objective-C вы хотите поставить
@property (strong, nonatomic) UIWindow *window;
в AppDelegate.h (не в.m)
Xcode 11 - Swift 5.3
Начиная с Xcode 11 и с помощью Swift 5.3 и @main
, у вас может быть мультиплатформенное приложение без SceneDelegate
или событие AppDelegate
. Будет только простой файл вроде:
import SwiftUI
@main
struct MyMultiPlatformApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Хотя вы хотите отказаться от него, иногда проблема, мешающая ему найти ваш файл sceneDelegate, заключается в файле info.plist.
Если у вас есть это в
info.plist
.
Scene Configuration
Application Session Role
Item 0 (Default Configuration)
Delegate Class Name : SceneDelegate
Storyboard Name : Main
Так должно быть.
Scene Configuration
Application Session Role
Item 0 (Default Configuration)
Delegate Class Name : $(PRODUCT_MODULE_NAME).SceneDelegate
Storyboard Name : Main