Inhabilitar UISceneDelegate / SwiftUI en iOS

111

Actualmente estoy usando Xcode 11 Beta 5. Dentro de mi aplicación, funciona bien en iOS 12 y menos. Sin embargo, en iOS 13 parece que está usando el UIScene. Esto hace que mi aplicación no haga nada.

Cuando la aplicación se inicia con una instalación nueva, hay términos y condiciones que el usuario debe aceptar. Después de aceptar, van a una pantalla de carga que los dirige a la vista principal. En la captura de pantalla que publiqué, la vista detrás de la actual en primer plano es la pantalla de carga de bienvenida.

Pronto analizaremos la posibilidad de agregar soporte para escenas de múltiples vistas en toda la aplicación, pero ahora tenemos cosas de mayor prioridad en las que debemos trabajar.

https://imgur.com/i0qLhAL

"Soportar múltiples ventanas" ya está deshabilitado en la configuración general del objetivo de la aplicación. También tengo Enable Multiple Windows configurado en NO en el archivo info.plist.

Hasta ahora nada ha funcionado realmente. Básicamente, quiero excluir / deshabilitar varias ventanas y UIScene / SwiftUI para restaurar el comportamiento original en iOS 10-12. ¿Es esto posible en iOS 13 o tenemos que actualizarlo?

Actualizar:

Aquí hay una captura de pantalla de la jerarquía de depuración de vistas. El lado izquierdo es iOS 12, el lado derecho está en iOS 13. Sin agregar nada a Info.plist ni clases o métodos de delegado de escena, ¿por qué es diferente? Prácticamente lo ejecutó en su código listo para producción existente en Xcode 11.

https://imgur.com/C3aLsDo

DavidA
fuente
¿Necesita ser compatible solo con iOS 13 y posterior o necesita ser compatible con iOS 13 e iOS 12?
rmaddy
Soporte de @rmaddy entre iOS 11-13 + (versiones futuras).
DavidA
¿Su interfaz de usuario principal es a través de código o guión gráfico?
rmaddy
@rmaddy está hecho en guiones gráficos tiene una transición a su referencia xib ViewControllers.
DavidA
Sin detalles específicos sobre lo que hace su aplicación y cuándo, es difícil saberlo. Tenga en cuenta que los métodos del controlador de vista como, por ejemplo viewWill|DidAppear, no se denominan de la misma manera en iOS 13 cuando se descartan los controladores de vista presentados, por ejemplo. Agregue muchos mensajes de depuración y puntos de interrupción del ciclo de vida y compare el flujo entre iOS 12 y 13 y vea dónde es diferente.
rmaddy

Respuestas:

312

Si bien debe aceptar el uso de escenas cuando su aplicación se ejecuta en iOS 13 y posterior, puede optar por no participar mientras aún sea compatible con iOS 12 o anterior.

  • Elimine completamente la entrada "Application Scene Manifest" de Info.plist.

  • Si hay una clase de delegado de escena, elimínela.

  • Si hay algún método relacionado con la escena en el delegado de su aplicación, elimine esos métodos.

  • Si falta, agregue la propiedad var window: UIWindow?al delegado de su aplicación.

Su aplicación ahora solo debería usar el delegado de la aplicación y en iOS 13 debería tener el mismo ciclo de vida que iOS 12.

Nota: Nada de esto es específico de Swift o SwiftUI.

rmaddy
fuente
Publicamos respuestas al mismo tiempo. :-) Una pregunta: esa línea que faltaba en la AppDelegateque me dirigí. ¿Eso vuelve automáticamente en este proceso que describiste? (Me gusta más tu respuesta, ya que ignora por completo las escenas)
dfd
1
Lo mismo me está sucediendo y no tengo una entrada de manifiesto en mi Info.plist ni ningún método AppDelegate ni tampoco una clase SceneDelegate. Estoy configurando mi controlador como "términos y condiciones" para David como rootViewController y aparece igual que se muestra aquí en la pregunta anterior. Por favor, ayúdenme ya que estoy atascado con este error de interfaz de usuario y no puedo seguir adelante ... ¡uf!
Mohsin Khubaib Ahmed
1
@MohsinKhubaibAhmed Estás preguntando sobre un tema completamente diferente. Ver stackoverflow.com/questions/56435510/…
rmaddy
1
¡Hola! Seguí las instrucciones de 3 pasos, pero aparece una pantalla negra después de que aparece la pantalla de inicio. Se selecciona Main Storyboard y también el controlador de vista inicial. ¿Tienes alguna sugerencia?
user3191334
1
@ user3191334 También tengo la pantalla negra. En mi caso, el modo oscuro me dio un fondo negro predeterminado. Agregue algo de contenido a su guión gráfico base y aparecerá todo.
Gordon Dove
41

Usar la respuesta para formatear las cosas con suerte mejor que un comentario. (Siéntete libre de comentar y editaré).

Esto es algo que también enfrenté, y hay algunos escenarios en juego aquí:

  • Si desea trabajar en una aplicación existenteUIKit en Xcode 11, simplemente ábrala y debería funcionar bien. Todas mis aplicaciones tienen, sin SceneDelegate archivo ni cambios AppDelegateo guiones gráficos.
  • Si desea crear una nueva UIKITaplicación orientada a iOS 13 , simplemente créela y asegúrese de dejar la casilla de verificación "Usar SwiftUI" sin marcar.

Pero me pregunto si se enfrenta al tercer escenario, uno que hice hace aproximadamente una semana. Creación de una nueva aplicación `UIKit dirigida a algo anterior a iOS 13 . (¡De hecho, apunté a iOS 9!)

Sí, su plantilla le dará 15 errores (a partir de la versión beta 5), ​​junto con un SceneDelegate archivo / clase. Afortunadamente, Xcode te ayudará a corregir automáticamente todos menos uno.

La última es agregar una línea que es parte de la SceneDelegateclase, pero desafortunadamente Apple la dejó fuera de la AppDelegateclase, lo que después de más de una docena de @available(iOS 13.0, *)cláusulas significa que ha optado por SceneDelegateno usar iOS 12 y ¿adivinen qué? Es que no hay en ApDelegate!

Agregue esto a su AppDelegate:

var window: UIWindow?

En ese momento, debería tener una UIKitaplicación en ejecución destinada a iOS 12 y versiones anteriores.

dfd
fuente
Gracias por esto. Mi escenario es prácticamente el primer punto que dijiste, una aplicación UIKit existente en Xcode 11. Pero cuando la abro, no funciona bien. Mire la actualización que agregué de la jerarquía de depuración de vista.
DavidA
También en AppDelegate, ya tiene ventana var: UIWindow?
DavidA
¡Me tenías preocupado! (Y todavía estoy un poco preocupado). He actualizado muy poco para mis aplicaciones existentes: la semana pasada fue una frustración con SwiftUI y tenía curiosidad por probar un diseño en UIKit solo para iOS 13. ¿Pero mis aplicaciones existentes? Son compatibles con la multitarea del iPad, pero no han cambiado en Xcode 11.No tengo SceneDelegatey las pruebas dicen que (a) funcionan en iOS 13 y (b) no admiten varias ventanas, solo dividen la vista entre dos aplicaciones. (Tampoco soy compatible con la función de arrastrar y soltar). ¿Hay algo más que hacer?
dfd
Para repetir, simplemente abrí mi aplicación Xcode 10 en Xcode 11. No SceneDelegate, no SwiftUI, no tengo la capacidad de crear múltiples instancias de mis aplicaciones iOS 9+. El rendimiento es el mismo de siempre, todos ellos son CoreImagefiltros personalizados que se actualizan en tiempo real y, bueno, ¿para mí? Si hay algún problema relacionado con el sistema operativo relacionado con escenas en la jerarquía de vistas, es discutible si no admite escenas. (Y para terminar, sí, todavía estoy un poco preocupado. Pero también es la beta 5.) Ojalá tengas una buena copia de seguridad que pueda reproducir lo que estoy viendo.
dfd
Gracias. Sospecho que es algo dentro del ciclo de vida. Pasaré tiempo depurando mi aplicación. Actualizaré esto cada vez que lo averigüe para ayudar a alguien en una situación similar
DavidA
5

Hice que esto funcionara usando la respuesta de dfd, pero debido a que mi aplicación está en Objective-C, tuve que hacer un cambio:

En Objective-C, quieres poner

@property (strong, nonatomic) UIWindow *window;

en AppDelegate.h (no en .m)

Nik Bhatt
fuente
4

De acuerdo, lo descubrí. Debido a los cambios en iOS 13 del nuevo estilo de presentación de tarjetas predeterminado de Apple, en mi guión gráfico, la transición de mi pantalla de inicio a mi controlador de navegación de flujo personalizado predeterminado para la nueva presentación (ver captura de pantalla a continuación).

Segue

La forma en que lo arreglé fue volver al estilo antiguo que por defecto tenía el ciclo de vida anterior. Vea la captura de pantalla a continuación.

Tipo de secuencia del guión gráfico

No estoy seguro de por qué lo hizo, ya que este fue el único lugar en mi aplicación que causó esto (una aplicación bastante grande, así que tengo que pasar un tiempo revisando todos los guiones gráficos para asegurarme).

DavidA
fuente
2
Su pregunta es cómo optar por no usar escenas. Esta respuesta no proporciona una solución para excluirse de las escenas. Esta no debería ser la respuesta aceptada. Si todo lo que quisiera hacer fuera evitar la nueva presentación estilo tarjeta, podría haber encontrado esa respuesta en varios duplicados que abordan esa pregunta.
rmaddy
1

Xcode 12 - Swift 5.3 - iOS 14

Desde Xcode 12 y con la ayuda de Swift 5.3 y @main, puedes tener una aplicación multiplataforma que no tiene ningún SceneDelegateevento AppDelegate. Solo habrá un archivo simple como:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Mojtaba Hosseini
fuente