Xcode 11 - Disattiva UISceneDelegate / SwiftUI su iOS 13


107

Attualmente sto utilizzando Xcode 11 Beta 5. All'interno della mia applicazione, funziona bene su iOS 12 e versioni precedenti. Tuttavia, su iOS 13 sembra che utilizzi UIScene per impostazione predefinita. Questo fa sì che la mia app non faccia nulla.

Quando l'app viene avviata con una nuova installazione, sono presenti termini e condizioni che l'utente deve accettare. Dopo aver accettato, passano a una schermata di caricamento che li indirizza alla vista principale. Nello screenshot che ho postato, la vista dietro quella corrente in primo piano è la schermata di caricamento iniziale.

Presto esamineremo l'aggiunta di più visualizzazioni di scene di supporto in tutta l'applicazione, ma al momento abbiamo elementi con priorità più alta su cui dobbiamo lavorare.

https://imgur.com/i0qLhAL

"Supporta più finestre" è già disabilitato nelle impostazioni generali della destinazione dell'app. Inoltre ho Abilita più finestre impostato su NO nel file info.plist.

Finora nulla ha davvero funzionato. Fondamentalmente voglio disattivare / disabilitare più finestre e UIScene / SwiftUI per ripristinare il comportamento originale in iOS 10-12. È possibile in iOS 13 o dobbiamo aggiornarlo?

Aggiornare:

Ecco uno screenshot della gerarchia di debug della vista. Il lato sinistro è iOS 12, il lato destro è iOS 13. Senza aggiungere nulla a Info.plist né classi o metodi delegati di scena, perché è diverso? Praticamente lo ha appena eseguito nel suo codice pronto per la produzione esistente su Xcode 11.

https://imgur.com/C3aLsDo


Devi supportare solo iOS 13 e versioni successive o devi supportare iOS 13 e iOS 12?
rmaddy

Supporto @rmaddy tra iOS 11-13 e versioni successive (versioni future).
DavidA

La tua interfaccia utente principale è tramite codice o storyboard?
rmaddy

@rmaddy è fatto negli storyboard e ha un seguito al riferimento xib ViewControllers.
DavidA

Senza dettagli specifici su cosa sta facendo la tua app e quando, è difficile da dire. Si noti che i metodi del controller di visualizzazione come viewWill|DidAppearnon vengono chiamati allo stesso modo in iOS 13 quando si eliminano i controller di visualizzazione presentati, ad esempio. Aggiungi molti messaggi di debug e punti di interruzione del ciclo di vita e confronta il flusso tra iOS 12 e 13 per vedere dove è diverso.
rmaddy

Risposte:


300

Anche se dovresti accettare l'utilizzo delle scene quando la tua app viene eseguita con iOS 13 e versioni successive, puoi disattivarla completamente mentre supporti ancora iOS 12 o versioni precedenti.

  • Rimuovere completamente la voce "Application Scene Manifest" da Info.plist.

  • Se è presente una classe delegato di scena, rimuoverla.

  • Se sono presenti metodi correlati alla scena nel delegato dell'app, rimuovere tali metodi.

  • Se manca, aggiungi la proprietà var window: UIWindow?al delegato dell'app.

La tua app ora dovrebbe usare solo il delegato dell'app e con iOS 13 dovrebbe avere lo stesso ciclo di vita di iOS 12.

Nota: niente di tutto questo è specifico per Swift o SwiftUI.


Abbiamo pubblicato le risposte allo stesso tempo. :-) Una domanda - quella linea mancante AppDelegateche ho affrontato. Ciò ritorna automaticamente in questo processo che hai descritto? (Mi piace di più la tua risposta, poiché ignora completamente le scene.)
DFD

1
Lo stesso sta accadendo per me e non ho alcuna voce manifest nel mio Info.plist né alcun metodo AppDelegate e anche nessuna classe SceneDelegate. Sto impostando il mio controller come "termini e condizioni" per David come rootViewController e appare come mostrato qui nella domanda sopra. Per favore aiutami perché sono bloccato con questo problema tecnico dell'interfaccia utente e non posso andare avanti .. ugh!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed Stai chiedendo un problema completamente diverso. Vedere stackoverflow.com/questions/56435510/...
rmaddy

1
Ciao! Ho seguito le istruzioni in 3 passaggi ma ho ottenuto una schermata nera dopo la visualizzazione della schermata di avvio. Viene selezionato lo Storyboard principale e anche il controller di visualizzazione iniziale. Hai qualche suggerimento?
user3191334

1
@ user3191334 Ho anche lo schermo nero. Nel mio caso era la modalità oscura che mi dava uno sfondo nero predefinito. Aggiungi alcuni contenuti al tuo storyboard di base e tutto apparirà.
Gordon Dove l'

40

Usare la risposta per formattare, si spera, le cose meglio di un commento. (Sentiti libero di commentare e io modificherò.)

Anche questo è qualcosa che ho dovuto affrontare e ci sono alcuni scenari in gioco qui:

  • Se vuoi lavorare su un'app esistenteUIKit in Xcode 11, aprila e dovrebbe funzionare bene. Tutte le mie app hanno, senza SceneDelegate file né modifiche AppDelegateo storyboard.
  • Se desideri creare una nuova UIKITapp destinata a iOS 13 , creala semplicemente assicurandoti di lasciare deselezionata la casella di controllo "Usa SwiftUI".

Ma mi chiedo se stai affrontando il terzo scenario, uno che ho fatto circa una settimana fa. Creazione di una nuova app UIKit destinata a qualcosa di precedente a iOS 13 . (In realtà ho preso di mira iOS 9!)

Sì, il tuo modello ti darà 15 errori (a partire dalla beta 5), ​​insieme a un SceneDelegatefile / classe. Fortunatamente, Xcode ti aiuterà a correggerli automaticamente tutti tranne uno.

L'ultimo è aggiungere una riga che fa parte della SceneDelegateclasse, ma sfortunatamente Apple l'ha lasciata fuori dalla AppDelegateclasse - il che dopo più di una dozzina di @available(iOS 13.0, *)clausole significa che hai rinunciato SceneDelegatese esegui iOS 12 e indovina cosa? E ' non è lì in ApDelegate!

Aggiungi questo al tuo AppDelegate:

var window: UIWindow?

A quel punto, dovresti avere UIKitun'app in esecuzione mirata per iOS 12 e versioni precedenti.


Grazie per questo. Il mio scenario è praticamente il primo punto che hai detto, un'app UIKit esistente in Xcode 11. Ma quando la apro, non funziona bene. Guarda l'aggiornamento che ho aggiunto della gerarchia di debug della vista.
DavidA

Anche in AppDelegate, ha già la finestra var: UIWindow?
DavidA

Mi hai fatto preoccupare! (E sono ancora un po 'preoccupato.) Ho aggiornato pochissimo per le mie app esistenti: la scorsa settimana è stata frustrante con SwiftUI ed ero curioso di provare un layout in UIKit solo per iOS 13. Ma le mie app esistenti? Supportano il multi-tasking dell'iPad ma sono rimasti invariati in Xcode 11 Non ho SceneDelegatee testando in giro dice (a) funzionano in iOS 13 e (b) non supportano affatto più finestre, solo la visualizzazione divisa tra due app. (Inoltre non supporto il drag-and-drop.) C'è qualcos'altro da parte tua?
dfd

Per ripetere, ho semplicemente aperto la mia app Xcode 10 in Xcode 11. No SceneDelegate, no SwiftUI, nessuna possibilità di creare più istanze delle mie app iOS 9+. Le prestazioni sono le stesse di sempre - sono tutti CoreImagefiltri personalizzati che si aggiornano in tempo reale - e, beh, per me? Se ci sono alcuni problemi relativi al sistema operativo relativi alle scene nella gerarchia di visualizzazione, è discutibile se se non supporta le scene. (E per finire, sì, sono ancora un po 'preoccupato. Ma è anche beta 5.) Spero che tu abbia un buon backup in grado di riprodurre quello che vedo.
dfd

Grazie. Sospetto che sia qualcosa nel ciclo di vita. Trascorrerò del tempo a eseguire il debug della mia applicazione. Lo aggiornerò ogni volta che lo scoprirò per aiutare qualcuno in una situazione simile
DavidA

4

Va bene, così ho capito. A causa delle modifiche in iOS 13 del nuovo stile di presentazione della scheda predefinito di Apple, nel mio storyboard passa dalla schermata iniziale al controller di navigazione del flusso personalizzato impostato per impostazione predefinita sulla nuova presentazione (vedi screenshot sotto).

Segue

Il modo in cui l'ho risolto è stato quello di tornare al vecchio stile che ripristinava il vecchio ciclo di vita. Vedi screenshot qui sotto.

Tipo di sequenza di storyboard

Non sono sicuro del perché, dato che questo era l'unico posto nella mia applicazione che ha causato questo (app piuttosto grande quindi devo passare un po 'di tempo a esaminare tutti gli storyboard per assicurarmene).


2
La tua domanda chiede come disattivare l'utilizzo delle scene. Questa risposta non fornisce una soluzione per disattivare le scene. Questa non dovrebbe essere la risposta accettata. Se tutto ciò che volevi fare era evitare la nuova presentazione in stile carta, avresti potuto trovare quella risposta in diversi duplicati che affrontano quella domanda.
rmaddy

4

Ho ottenuto questo per funzionare utilizzando la risposta di DFD, ma poiché la mia app è in Objective-C, ho dovuto apportare una modifica:

In Objective-C, vuoi mettere

@property (strong, nonatomic) UIWindow *window;

in AppDelegate.h (non in .m)


2

Xcode 11 - Swift 5.3

A partire da Xcode 11 e con l'aiuto di Swift 5.3 e @main, puoi avere un'app multipiattaforma che non ha SceneDelegateeventi o AppDelegate. Ci sarà solo un semplice file come:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.