iOS Mantendo a tela de inicialização antiga e o ícone do aplicativo após a atualização

173

Tenho um aplicativo em que substituí recentemente as imagens de lançamento e os ícones de aplicativos, removi todos os ativos antigos de qualquer lugar do projeto. Quando atualizo o aplicativo da versão antiga para a nova versão apenas construindo no Xcode, tudo está bem. No entanto, se eu tiver a versão antiga do meu aplicativo instalada, atualize-a no TestFlight. Toda vez que eu matar o aplicativo, reinicie-o, a antiga imagem de inicialização aparecerá brevemente antes de mostrar a nova imagem de inicialização. Da mesma forma, quando fecho o aplicativo, o ícone antigo pisca brevemente antes de voltar para o novo.

Abri o aplicativo usando o iExplorer e notei que há uma imagem da tela de inicialização antiga salva no /Library/Caches/Shapshotsdiretório (não sei como ou por que ela chegou lá). Quando eu o apago manualmente pelo iExplorer, ele para de aparecer. No entanto, quando tento removê-lo com código usandoNSFileManager métodos, recebo erros dizendo que sou proibido de excluir arquivos neste diretório.

Alguém já experimentou isso antes e tem algum conselho?

lramirez135
fonte
3
O mesmo problema e, com as telas de inicialização, a nova tela de inicialização nunca aparece, ela está usando a imagem em cache da versão anterior.
Christophe Fondacci

Respostas:

327

Consegui obter o cache do trampolim de forma confiável para testar as alterações na imagem de inicialização, fazendo o seguinte:

  1. Exclua seu aplicativo do dispositivo
  2. Desligue o dispositivo
  3. Ligue o dispositivo, instale e inicie o aplicativo.

A imagem é atualizada corretamente sempre. Pena que eu preciso desligar o dispositivo para que ele funcione - mas pelo menos consegui progredir dessa maneira. Espero que isso ajude alguém.

No caso do simulador, apenas reiniciar o simulador deve funcionar.

Brian Trzupek
fonte
19
Esta é a única solução que funcionou para mim. Muito obrigado!
Marcin Kapusta
Graças herói !! Funcionou como um encanto.
Ravi
5
Também funciona para emulador.
Alexey Podlasov
1
Essa também é a correção para o TestFlight? a atualização do aplicativo do TestFlight também armazena em cache as imagens de inicialização. tem certeza de que isso não acontecerá na versão do aplicativo, diferente do testflight?
Hasan
1
Isso me lembra a comédia do espelho automático. Mas está funcionando demais. Obrigado!
precisa saber é
49

Esses caches são usados ​​pelo Springboard para acelerar a troca de aplicativos. Este não é um problema que afetará seus usuários de produção e, em teoria, deve desaparecer na próxima vez que o Springboard decidir capturar instantaneamente seu aplicativo.

Dito isto, este não é um problema que você pode corrigir. Este é um erro no código da Apple, não no seu.

ATUALIZAÇÃO: parece haver uma solução alternativa que não requer a reinicialização do dispositivo.

Isso entrará em vigor após o segundo lançamento!

do {
   try FileManager.default.removeItem(atPath: NSHomeDirectory()+"/Library/SplashBoard")
} catch {
   print("Failed to delete launch screen cache: \(error)")
}

Uma explicação completa de como isso funciona aqui: https://rambo.codes/ios/quick-tip/2019/12/09/clearing-your-apps-launch-screen-cache-on-ios.html

InkGolem
fonte
7
Você pode vincular à documentação que confirmaria sua declaração "Este não é um problema que afetará seus usuários de produção"? Eu tenho exatamente o mesmo problema, eu estou bem se for apenas para desenvolvedores, mas não vou me arriscar sem a documentação oficial que indique claramente o que você diz.
Christophe Fondacci
6
Para algumas pessoas, estou obtendo isso para a atualização da App Store também :(.
Ajumal
15
Infelizmente, posso confirmar que esse problema afeta até usuários de produção (portanto, após a atualização do aplicativo na App Store).
Eugenio
Sim, isso afeta as compilações de produção / App Store.
Jonny
Alguma fonte para isso?
Daniel Springer
27

Para o simulador apenas Reset Contents and Settings...

Murray Sagal
fonte
Isto não é uma pergunta. O ponto é que, ao implantar um novo aplicativo com novos ícones ou imagens, eles não são todos atualizados da mesma maneira e alguns são mantidos em exibição enquanto são removidos.
Stephane Paquet
18

@InkGolem

Este não é um problema que afetará seus usuários de produção

é verdade.

Eu estava enfrentando esse problema quando alterei minha tela de inicialização, SplashScreen e ícone do aplicativo. Eu tentei todos os métodos, mas não funcionou. Finalmente, acabei de publicar meu aplicativo e baixei meu aplicativo da App Store com o dispositivo que não usei para desenvolvimento . SplashScreen e App Icon funcionam normalmente !!!

chinnawatp
fonte
1
Alguma idéia do que acontece se você já possui um aplicativo na loja de aplicativos e o usuário atualiza o aplicativo com a nova tela de inicialização?
21417 rhcpfan
Já tenho um aplicativo nos downloads da loja de aplicativos e libero uma atualização com a nova tela de inicialização. Depois de liberar meu aplicativo, testei com mais de 10 dispositivos (não usados ​​para desenvolvimento) para verificar se "Este não é um problema que afetará seus usuários de produção" é real e não recebo nenhuma reclamação tão longe do usuário sobre tela de abertura.
chinnawatp
7
Esse problema também está acontecendo na compilação da Appstore, e as dicas do @Brian Trzupek funcionaram.
Ajumal 5/09/17
3
Confirmado, isso acontece nas versões ao vivo da App Store. Esta resposta tem alguns problemas com a linguagem; Não sei dizer se eles significam que o problema afeta a construção da produção ou não, mas minha experiência empírica diz que sim .
Jonny
2
Na verdade, está acontecendo com usuários de produção !! A tela inicial exibida é a antiga. A reinicialização do telefone corrigiu isso. Espero que as pessoas vejam o novo splash nas próximas horas sem reiniciar.
Valerio
13

Encontrei solução alternativa e se você realmente deseja corrigir esse problema. A Apple possui alguns mecanismos para armazenar em cache imagens da tela de inicialização, indexadas pelo nome do arquivo de imagem.

Quando você altera as imagens na tela de inicialização e deseja vê-las na próxima execução imediatamente. por favor, use o novo nome da imagem que você alterou e vincule ao novo arquivo de imagem no storyboard ou no xib.

Executar novamente, você verá novas alterações aparecerem.

Yu-Sen Han
fonte
1
Eu não queria excluir o aplicativo, então tentei este. Isso além de reiniciar meu dispositivo funcionou para mim.
Murray Sagal
Isso não funcionou para mim. Reiniciar o dispositivo também não funcionou ... Eu desisto agora.
Lensflare 6/03/19
Não funcionou para mim. Até removi o imageView e criei um novo com a nova imagem, e ela ainda não funcionou.
Rickard Elimää 29/11/19
Não funcionou para mim. A imagem antiga não foi carregada (a cor de fundo estática foi apresentada em vez de uma imagem) e ainda foi apresentada por uma fração de segundo antes que a nova tela de lançamento aparecesse.
Michal Cichon 16/01
13

Isso funcionou para mim: http://arsenkin.com/launch_screen_image_cache.html

Mais uma vez, graças ao tópico que mencionei acima, encontrei uma maneira de resolver esse problema - nomeie sua nova imagem de maneira diferente da que havia antes, caso a nova tenha o mesmo nome que a antiga e exclua-a do arquivo * .xcassets para o diretório do projeto e referencie-o no seu UIImageView. E é isso. Parece estúpido, fácil, mas, ah, que horror!

JERC
fonte
3
A chave aqui é manter essas imagens fora do catálogo de ativos. Obrigado!
Michal Cichon 16/01
3
Essa solução realmente ajuda se você se preocupa com o bom UX do usuário de produção e deseja evitar essa transição feia entre a imagem antiga e a nova.
Michal Cichon 16/01
3
finalmente, uma solução que realmente funciona! A chave aqui é colocar as imagens fora da pasta de ativos.
Elad 17/02
1
Funciona perfeitamente sem reiniciar ou excluir o aplicativo.
Soufian Hossam
Esquisito. Mas a imagem de plano de fundo que saí do catálogo de ativos às vezes não está carregando e recebo o plano de fundo preto. Agora preciso depurá-lo novamente, mas não tenho idéia de como reproduzir infelizmente.
Michal Cichon 03/06
10

Desinstale o aplicativo, reinicie o telefone e instale-o novamente ... Isso realmente foi corrigido no meu caso.

Ankit Pundhir
fonte
5

Eu também enfrentei o mesmo problema. Isso acontece porque o simulador / dispositivo iOS armazena em cache a imagem de inicialização quando você inicia o aplicativo. Adicionei algumas modificações à resposta de Brian Trzupek :

  1. Exclua o conjunto de imagens dos ativos do Xcode (por exemplo, launch_image)
  2. Adicione um novo conjunto de imagens e adicione imagens a ele.
  3. Desligue e ligue o dispositivo iOS. (Redefinir conteúdo e configurações do simulador).
  4. Limpe a pasta de compilação do Xcode (pressione command+ option+ shift+ K).
  5. Exclua o aplicativo do dispositivo / simulador (se disponível).
  6. Corra novamente.
AG
fonte
5

O que funcionou para mim:

  • Excluindo o controlador de cena e exibição do LaunchScreen e crie um novo ( certifique-se de defini-lo como "Controlador de exibição inicial" no Inspetor de atributos ).

O que não funcionou para mim:

  • Excluindo o aplicativo
  • Reiniciando o iPhone, Mac ou Xcode
  • Exclusão de dados derivados
  • Excluindo o contêiner do dispositivo
  • Limpeza
  • Queimando 3 bonecos de Steve Jobs Voodoo

Nota:

Às vezes, também é necessário apagar (simulador)

Daniel Springer
fonte
4
Não estou convencido. Vou precisar dos locais de origem dos bonecos de vodu de Steve Jobs para confirmar.
precisa
3

Basta conectar seu dispositivo, vá para Xcode> Janela> Dispositivos> Seu dispositivo, agora nos aplicativos instalados, selecione seu aplicativo, clique com o botão direito do mouse e faça o download do contêiner, vá para o arquivo gerado, clique com o botão direito do mouse, Mostrar conteúdo do pacote, AppData, Biblioteca, Caches, e excluir arquivos. Agora vá para Xcode> Janela> Dispositivos> Seu dispositivo> seu aplicativo e clique com o botão direito do mouse para substituir os contêineres.


fonte
3

Honestamente, não corri o risco de ir ao ar sem ter certeza se isso será atualizado ou não.

Portanto, supondo que você esteja usando xcassets, uma solução simples é:

  1. Excluir o conjunto de imagens antigo
  2. Recrie um com um nome diferente e adicione suas imagens na tela inicial
  3. Atualize seu storyboard para usar esta 'nova' referência de conjunto de imagens

Ele será atualizado com certeza! (Até testei com o aplicativo já instalado no dispositivo). Não há necessidade de limpar o cache do dispositivo ou algo assim.

hico
fonte
3
  1. Exclua seu aplicativo do dispositivo
  2. Desligue o dispositivo
  3. Ligar o dispositivo
  4. Instale e inicie o aplicativo.
Jone Ren
fonte
1

Ok, então eu descobri o problema. Na versão anterior do meu aplicativo, estávamos usando um XIB da tela de inicialização. Em algum lugar no desenvolvimento desta nova versão, o xib foi excluído e substituído apenas por imagens estáticas de inicialização.

A solução é usar um XIB da tela de inicialização. Percebi que, no momento em que usei um xib da tela de ativação pela primeira vez, o arquivo armazenado no diretório de snapshots foi substituído pelo snapshot do xib.

lramirez135
fonte
2
Não, estou usando um XIB da tela de inicialização e ele não está atualizando. Eu acho que você resolve o problema alternando entre Tela inicial> Imagem estática> Tela inicial. Modificar a tela de inicialização no XCode e executá-lo ainda mostra a tela de inicialização antiga no iPhone. A imagem é armazenada em cache no dispositivo. Eu acho que se eu mudar o nome da tela do lançamento que vai fazer o truque
Christophe Fondacci
A recriação de uma tela de inicialização com um nome diferente não solucionou o problema, ainda exibindo a antiga. A única "esperança" é que iOS regenera seu cache a cada atualização do aplicativo, mas não consigo encontrar qualquer documentação sobre isso
Christophe Fondacci
1

Xcode 10 / iOS 12

Depois de tentar todas as coisas mencionadas acima, tive que excluir a visualização de imagem do LaunchScreen e substituí-la por uma nova.

ahbou
fonte
1

Esta é a maneira mais rápida que encontrei para resolver esse problema, embora pareça estúpido:

  1. Clique com o botão direito do mouse no LaunchScreen.xibarquivo da tela de ativação e selecione Remove filee selecione Remove to trash. Isso removerá todas as referências do arquivo e suas atualizações anteriores do seu projeto.

  2. Vá para o lixo e arraste e solte o arquivo de volta no seu projeto xCode (dentro yourProjectName).

  3. Limpe e reconstrua.

Walter Monecke
fonte
1

Use este pedaço de código para limpar o cache da tela de inicialização:

import UIKit

public extension UIApplication {
    func clearLaunchScreenCache() {
        #if DEBUG
        do {
            let launchScreenPath = "\(NSHomeDirectory())/Library/SplashBoard"
            try FileManager.default.removeItem(atPath: launchScreenPath)
        } catch {
            print("Failed to delete launch screen cache - \(error)")
        }
        #endif
    }
}

Uso:

UIApplication.shared.clearLaunchScreenCache()
Mor4eza
fonte
0

Teve esse problema também. Sendo um novato total, alterei ingenuamente o LaunchScreen.storyboard para LaunchScreen.xib. A execução falhou (duh), então eu a mudei novamente para .storyboard reexecutou o aplicativo apenas para testar se eu não estraguei mais nada - e a tela antiga não apareceu primeiro. Então, o que quer que eu tenha feito, deve ter liberado o cache antigo.

richard s. Colina
fonte
0

Tinha o mesmo problema, mas apenas com a imagem usada no storyboard da tela de lançamento. Mover a imagem do catálogo de ativos alterando seu nome para o pacote de aplicativos (por exemplo, a imagem antiga definida no catálogo de ativos foi chamada launch_logo e a imagem no pacote de aplicativos é chamada launchscreen_logo.png) resolveu o problema.

Anton Filimonov
fonte
0

Eu acho que isso depende de situações. Quando isso acontece na depuração ou teste, funciona na exclusão de imagem na tela de inicialização. Ou desinstalar seus aplicativos e reiniciar o lançamento.

Mas vai mesmo depois do arquivo, então não resolve com redefinição e limpeza.

이혜린
fonte
0

No meu caso, não selecionei AppIcon Source em Configuração do aplicativo -> Geral - insira a descrição da imagem aqui> Ícones do aplicativo e iniciar imagens -> Fonte dos ícones do aplicativo

Mehrdad
fonte
0

Experimente no AppDelegate

    if #available(iOS 13.0, *) {
        do {
            try FileManager.default.removeItem(atPath: NSHomeDirectory()+"/Library/SplashBoard")
        } catch {
            print("Failed to delete launch screen cache: \(error)")
        }
    } else {
        print("ios is min")
    }
ramazanDev
fonte
0

Solução Work For Me

  1. Exclua seu aplicativo do dispositivo
  2. Desligar o dispositivo
  3. Ligar dispositivo
  4. Limpar pasta de compilação
  5. Novamente, crie e instale e inicie o aplicativo.

    Aproveitar

M Murteza
fonte
0

Verifique se você executou todas essas etapas

  1. Pesquise a chave ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME na configuração de compilação e pesquise seu valor de ativos em todo o aplicativo e remova-o.
  2. Exclua ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME da configuração Compilar.
  3. Criar nova tela de inicialização Xcode -> Arquivo -> Novo -> Arquivo -> Tela de inicialização
  4. Ir para o destino principal do aplicativo -> Geral -> Ícones de aplicativos e imagens de inicialização -> Iniciar arquivo de tela -> Escolha o novo arquivo de tela de inicialização.
  5. Se você acabou de alterar a tela de inicialização antiga, tente nomear os novos ativos com nomes diferentes.
jeff ayan
fonte
-1

Tente abrir o simulador, vá para Hardware -> Apagar todo o conteúdo e configurações.

Tigran Iskandaryan
fonte