Xcode 11 - Desativar UISceneDelegate / SwiftUI no iOS 13

106

No momento, estou usando o Xcode 11 Beta 5. No meu aplicativo, ele funciona bem no iOS 12 e anteriores. No entanto, no iOS 13, parece que está usando o UIScene por padrão. Isso está fazendo com que meu aplicativo não faça nada.

Quando o aplicativo é iniciado em uma nova instalação, há termos e condições que o usuário deve aceitar. Depois de concordar, eles vão para uma tela de carregamento que os direciona para a visualização principal. Na captura de tela que postei, a visão atrás da atual em primeiro plano é a tela de carregamento inicial.

Em breve consideraremos a adição de suporte a várias visualizações de cena em todo o aplicativo, mas agora temos coisas de prioridade mais alta nas quais precisamos trabalhar.

https://imgur.com/i0qLhAL

"Suporte a várias janelas" já está desabilitado nas configurações gerais do destino do aplicativo. Além disso, tenho Ativar várias janelas definido como NÃO no arquivo info.plist.

Até agora, nada realmente funcionou. Basicamente, desejo desativar / desativar várias janelas e UIScene / SwiftUI para restaurar o comportamento original no iOS 10-12. Isso é possível no iOS 13 ou temos que atualizá-lo?

Atualizar:

Aqui está uma captura de tela da hierarquia de depuração da visualização. O lado esquerdo está o iOS 12, o lado direito está no iOS 13. Sem adicionar nada ao Info.plist nem nenhuma classe ou método de delegado de cena, por que é diferente? Praticamente apenas o executou em seu código pronto para produção existente no Xcode 11.

https://imgur.com/C3aLsDo

DavidA
fonte
Você precisa oferecer suporte apenas para iOS 13 e posterior ou para iOS 13 e iOS 12?
rmaddy
Suporte @rmaddy entre iOS 11-13 + (versões futuras).
DavidA
Sua interface do usuário principal é via código ou storyboard?
rmaddy
@rmaddy é feito em storyboards e segue para seus xib ViewControllers referenciados.
DavidA
Sem detalhes específicos sobre o que seu aplicativo está fazendo e quando, é difícil dizer. Observe que os métodos do controlador de visualização, como viewWill|DidAppearnão são chamados da mesma forma no iOS 13, ao descartar os controladores de visualização apresentados, por exemplo. Adicione muitas mensagens de depuração de ciclo de vida e pontos de interrupção e compare o fluxo entre o iOS 12 e 13 e veja onde é diferente.
rmaddy

Respostas:

299

Embora você deva adotar o uso de cenas quando seu aplicativo for executado no iOS 13 e posterior, você pode desativar totalmente enquanto ainda oferece suporte ao iOS 12 ou anterior.

  • Remova completamente a entrada “Application Scene Manifest” do Info.plist.

  • Se houver uma classe de delegado de cena, remova-a.

  • Se houver qualquer método relacionado à cena em seu delegado de aplicativo, remova esses métodos.

  • Se ausente, adicione a propriedade var window: UIWindow?ao delegado do aplicativo.

Seu aplicativo agora deve usar apenas o delegado de aplicativo e no iOS 13 ele deve ter o mesmo ciclo de vida do iOS 12.

Nota: nada disso é específico para Swift ou SwiftUI.

rmaddy
fonte
Postamos respostas ao mesmo tempo. :-) Uma pergunta - essa linha faltando AppDelegateque eu abordei. Isso volta automaticamente neste processo que você descreveu? (Eu meio que gosto mais da sua resposta, já que ignora completamente as cenas.)
dfd
1
O mesmo está acontecendo comigo e não tenho nenhuma entrada de manifesto em meu Info.plist, nenhum método AppDelegate e também nenhuma classe SceneDelegate. Estou definindo meu controlador como "termos e condições" para David como rootViewController e ele está parecendo o mesmo que mostrado aqui na pergunta acima. Por favor me ajude, pois estou preso com essa falha de interface do usuário e não posso avançar ... ugh!
Mohsin Khubaib Ahmed
1
@MohsinKhubaibAhmed Você está perguntando sobre um problema completamente diferente. Consulte stackoverflow.com/questions/56435510/…
rmaddy
1
Olá! Segui a instrução de 3 etapas, mas obtive uma tela preta depois que a tela de inicialização apareceu. O Storyboard principal é selecionado e também o controlador de visualização inicial. Você tem alguma sugestão?
user3191334
1
@ user3191334 Também recebi a tela preta. No meu caso, era o modo escuro, dando-me um fundo preto padrão. Adicione algum conteúdo ao seu storyboard base e tudo aparecerá.
Gordon Dove em
40

Usando a resposta para formatar as coisas melhor do que um comentário. (Sinta-se à vontade para comentar e vou editar.)

Isso é algo que eu também enfrentei, e há alguns cenários em jogo aqui:

  • Se você quiser trabalhar em um aplicativo existenteUIKit no Xcode 11, basta abri-lo e ele deve funcionar bem. Todos os meus aplicativos têm, sem nenhum SceneDelegate arquivo ou qualquer alteração AppDelegateou storyboards.
  • Se você deseja criar um novo UIKITaplicativo direcionado ao iOS 13 , basta criá-lo, certificando-se de deixar a caixa de seleção "Usar SwiftUI" desmarcada.

Mas estou me perguntando se você está enfrentando o terceiro cenário - um que eu fiz há cerca de uma semana. Criação de um novo aplicativo UIKit visando algo anterior ao iOS 13 . (Na verdade, direcionei o iOS 9!)

Sim, seu modelo apresentará 15 erros (a partir do beta 5), ​​junto com um SceneDelegatearquivo / classe. Felizmente, o Xcode o ajudará a corrigir automaticamente todos, exceto um.

A última é adicionar uma linha que faz parte da SceneDelegateclasse, mas infelizmente a Apple a deixou de fora da AppDelegateclasse - o que depois de mais de uma dúzia de @available(iOS 13.0, *)cláusulas significa que você optou por SceneDelegatenão executar o iOS 12 e adivinhe? É não existe no ApDelegate!

Adicione ao seu AppDelegate:

var window: UIWindow?

Nesse ponto, você deve ter um UIKitaplicativo em execução direcionado para iOS 12 e anteriores.

dfd
fonte
Obrigado por isso. Meu cenário é basicamente o primeiro ponto que você disse, um aplicativo UIKit existente no Xcode 11. Mas quando eu o abro, ele não funciona bem. Veja a atualização que adicionei da hierarquia de depuração da visualização.
DavidA de
Também no AppDelegate, ele já possui a janela var: UIWindow?
DavidA
Você me preocupou! (E ainda estou um pouco preocupado.) Eu atualizei muito pouco para meus aplicativos existentes - na semana passada foi a frustração com o SwiftUI e eu estava curioso para tentar um layout no UIKit para iOS 13 apenas. Mas meus aplicativos existentes? Eles oferecem suporte a multitarefa do iPad, mas não foram alterados no Xcode 11, SceneDelegatee os testes disponíveis dizem (a) eles funcionam no iOS 13 e (b) eles não oferecem suporte a múltiplas janelas, apenas divida a visualização entre dois aplicativos. (Eu também não sou compatível com arrastar e soltar.) Há algo mais acontecendo do seu lado?
dfd
Para repetir, eu simplesmente abri meu aplicativo Xcode 10 no Xcode 11. Não SceneDelegate, não SwiftUI, não há capacidade de criar várias instâncias de meus aplicativos iOS 9+. O desempenho é o mesmo de sempre - todos eles são CoreImagefiltros personalizados atualizados em tempo real - e, bem, para mim? Se houver algum problema relacionado ao sistema operacional relacionado a cenas na hierarquia de visualização, será discutível se não houver suporte para cenas. (E para terminar, sim, ainda estou um pouco preocupado. Mas também é beta 5.) Espero que você tenha um bom backup que pode reproduzir o que estou vendo.
dfd
Obrigado. Eu suspeito que seja algo dentro do ciclo de vida. Vou gastar tempo depurando meu aplicativo. Vou atualizar isso sempre que descobrir para ajudar alguém em uma situação semelhante
DavidA
4

Ok, então eu descobri. Devido às mudanças no iOS 13 do novo estilo de apresentação de cartão padrão da Apple, no meu storyboard segue da minha tela inicial para o meu controlador de navegação de fluxo personalizado padronizado para a nova apresentação (veja a captura de tela abaixo).

Segue

Como consertei isso, voltei ao estilo antigo, que era o padrão do antigo ciclo de vida. Veja a imagem abaixo.

Storyboard seque kind

Não sei por que isso aconteceu, já que este foi o único lugar em meu aplicativo que causou isso (um aplicativo muito grande, então tenho que passar algum tempo examinando todos os storyboards para ter certeza).

DavidA
fonte
2
Sua pergunta é como optar por não usar cenas. Essa resposta não fornece uma solução para a exclusão de cenas. Esta não deve ser a resposta aceita. Se tudo o que você quisesse fazer fosse evitar a nova apresentação em forma de cartão, poderia ter encontrado essa resposta em várias duplicatas abordando essa questão.
rmaddy
4

Eu fiz isso funcionar usando a resposta do dfd, mas como meu aplicativo está em Objective-C, tive que fazer uma alteração:

Em Objective-C, você deseja colocar

@property (strong, nonatomic) UIWindow *window;

em AppDelegate.h (não em .m)

Nik Bhatt
fonte
2

Xcode 11 - Swift 5.3

Desde o Xcode 11 e com a ajuda do Swift 5.3 e @main, você pode ter um aplicativo multiplataforma que não possui nenhum SceneDelegateevento ou AppDelegate. Haverá apenas um arquivo simples como:

import SwiftUI

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