iOS Сохраняя старый экран запуска и значок приложения после обновления

173

У меня есть приложение, в котором я недавно заменил образы запуска и значки приложений, я удалил все старые ресурсы из любого места в проекте. Когда я обновляю приложение со старой версии до новой, просто встроив Xcode, все в порядке. Однако, если у меня установлена ​​старая версия моего приложения, обновите ее с TestFlight, каждый раз, когда я убиваю приложение, а затем перезагружаю его, старое изображение запуска кратко отображается перед отображением нового образа запуска. Точно так же, когда я закрываю приложение, значок старого приложения кратковременно мигает, прежде чем вернуться к моему новому.

Я открыл приложение с помощью iExplorer и заметил, что в /Library/Caches/Shapshotsкаталоге сохранено изображение старого экрана запуска (я не знаю, как и почему оно туда попало). Когда я удаляю его вручную через iExplorer, он перестает появляться. Однако, когда я пытаюсь удалить его с помощью кода, используя NSFileManagerметоды, я получаю сообщение об ошибке, в котором говорится, что мне запрещено удалять файлы в этом каталоге.

Кто-нибудь сталкивался с этим раньше и есть какие-либо советы?

lramirez135
источник
3
Та же проблема, и с экранами запуска новый экран запуска никогда не отображается, он использует кэшированный образ предыдущей версии.
Кристоф Фондачи

Ответы:

327

Я смог надежно очистить кеш трамплина для тестирования изменений образа запуска, выполнив это:

  1. Удалить приложение с устройства
  2. Выключите устройство
  3. Включите устройство, установите и запустите приложение.

Изображение обновляется правильно каждый раз. Жаль, мне нужно выключить устройство, чтобы оно заработало - но, по крайней мере, я смог добиться прогресса таким образом. Я надеюсь, что это поможет кому-то.

В случае симулятора, просто перезапуск симулятора должен работать.

Брайан Тшупек
источник
19
Это единственное решение, которое сработало для меня. Спасибо Большое!
Марчин Капуста,
Герой спасибо !! Работал как шарм.
Рави
5
Работает и для эмулятора.
Алексей Подласов
1
Это тоже исправление для TestFlight? Обновление приложения из TestFlight также кэширует образы запуска. Вы уверены, что это не произойдет на версии приложения в отличие от testflight?
Хасан
1
Это напоминает Авто зеркало комедии для меня. Но это работает потрясающе. Спасибо!
ssowri1
49

Эти кеши используются Springboard для быстрого переключения приложений. Это не проблема, которая повлияет на ваших производственных пользователей и теоретически должна исчезнуть в следующий раз, когда Springboard решит сделать снимок вашего приложения.

При этом, это не проблема, которую вы можете решить. Это ошибка в коде Apple, а не ваша.

ОБНОВЛЕНИЕ: Кажется, есть обходной путь, который не требует перезагрузки устройства.

Это вступит в силу после второго запуска!

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

Полное объяснение того, как это работает здесь: https://rambo.codes/ios/quick-tip/2019/12/09/clearing-your-apps-launch-screen-cache-on-ios.html

InkGolem
источник
7
Не могли бы вы сослаться на документацию, которая подтвердила бы ваше утверждение «Это не проблема, которая повлияет на ваших производственных пользователей»? У меня точно такая же проблема, я в порядке, если это только разработчик, но я не воспользуюсь возможностью без официальной документации, в которой четко указано, что вы говорите.
Кристоф Фондаччи
6
Для некоторых людей это обновление обновляется и в App Store :(.
Ajumal
15
К сожалению, я могу подтвердить, что эта проблема затрагивает даже производственных пользователей (поэтому после обновления приложения из App Store).
Эухенио
Да, это влияет на производственные сборки / сборки в App Store.
Джонни
Есть источник для этого?
Даниэль Спрингер
27

Для симулятора просто Reset Contents and Settings...

Мюррей Сагал
источник
Это не вопрос. Дело в том, что при развертывании нового приложения с новыми значками или изображениями они не все обновляются одинаково, а некоторые остаются на дисплее, пока они были удалены.
Стефан Пакет
18

@InkGolem

Это не проблема, которая повлияет на ваших производственных пользователей

правда.

Я столкнулся с этой проблемой, когда я изменил свой экран запуска, SplashScreen и значок приложения. Я перепробовал каждый метод, но он не работал. Наконец, я только что опубликовал свое приложение и загрузил его из магазина приложений с устройства, которое я не использовал для разработки . SplashScreen и значок приложения работают как обычно !!!

chinnawatp
источник
1
Любая идея, что произойдет, если у вас уже есть приложение в магазине приложений, и пользователь просто обновляет приложение с новым экраном запуска?
rhcpfan
У меня уже есть приложение для загрузки в магазине приложений , и я выпускаю обновление с новым Launch Screen. После выпуска моего приложения я тестирую более 10 устройств (не используемых для разработки), чтобы убедиться, что «Это не проблема, которая повлияет на ваших производственных пользователей», и я не получаю никаких жалоб от пользователя заставка.
Chinnawatp
7
Эта проблема также возникает в сборке Appstore, и советы @Brian Trzupek сработали.
Ajumal
3
Подтверждено, что это происходит на живых сборках из App Store. Этот ответ имеет некоторые проблемы с языком; Я не могу сказать, имеют ли они в виду, что проблема влияет на производственные сборки или нет, но мой опыт показывает, что это так .
Джонни
2
Это на самом деле происходит с производственными пользователями! Отображается заставка старого. Перезагрузка телефона исправила это. Надеемся, что люди увидят новый всплеск в следующие часы без перезагрузки.
Валерио
13

Я нашел обходное решение, что если вы действительно хотите решить эту проблему. У Apple есть несколько механизмов для кэширования изображений экрана запуска, которые индексируются по имени файла изображения.

Когда вы меняете какие-либо изображения на экране запуска и хотите, чтобы они сразу же изменились в следующем запуске. пожалуйста, используйте новое имя изображения, какое изображение вы изменили, и ссылку на новый файл изображения в раскадровке или XIB.

Запустите снова, вы увидите новые изменения.

Ю-Сен Хан
источник
1
Я не хотел удалять приложение, поэтому попробовал это. Этот плюс перезапуск моего устройства работал для меня.
Мюррей Сагал
Это не сработало для меня. Перезапуск устройства также не работал ... Я сдаюсь сейчас.
Lensflare
Не работал для меня Я даже удалил imageView и создал новый с новым изображением, и он все еще не работал.
Рикард Элимяа
Это не сработало для меня. Я получил старое изображение, не загружаемое (вместо изображения был представлен цвет фона), и оно все еще было представлено в течение доли секунды, прежде чем появился новый экран запуска.
Михал Цишон
13

Это сработало для меня: http://arsenkin.com/launch_screen_image_cache.html

Опять же, благодаря ветке, на которую я ссылался выше, я нашел способ решить эту проблему - назовите ваше новое изображение не так, как раньше, на случай, если у вашего нового будет то же имя, что и у старого, и выведите его из * .xcassets в каталог проекта и ссылки на него в вашем UIImageView. И это все. Звучит глупо легко, но о боже, сколько ярости у меня было.

JERC
источник
3
Ключ здесь , чтобы сохранить эти изображения из каталога активов. Спасибо!
Михал Цишон
3
Это решение действительно помогает, если вы заботитесь о хорошем UX вашего рабочего пользователя и хотите избежать этого уродливого перехода между старым и новым образом.
Михал Цишон
3
наконец, решение, которое действительно работает! Ключевым моментом здесь является размещение изображений из папки ресурсов.
Elad
1
Работает отлично, без перезапуска или удаления приложения.
Суфиан Хоссам
Weird. Но фоновое изображение, которое я переместил из каталога ресурсов, иногда не загружается, и я получаю черный фон. Теперь мне нужно снова его отладить, но я не знаю, как воспроизвести, к сожалению.
Михал Цишон
10

Удалите приложение, перезагрузите телефон и снова установите приложение ... Это на самом деле исправлено в моем случае.

Анкит Пундхир
источник
5

Я также столкнулся с той же проблемой. Это происходит потому, что симулятор / устройство iOS кэширует образ запуска при первом запуске приложения. Я добавил некоторые изменения в ответ Брайана Тшупека :

  1. Удалить набор изображений из ресурсов Xcode (например, launch_image)
  2. Добавьте новый набор изображений и добавьте изображения к нему.
  3. Выключите и включите устройство iOS. (Сбросить содержимое и настройки для симулятора).
  4. Очистите папку сборки Xcode (нажмите command+ option+ shift+K ).
  5. Удалить приложение с устройства / симулятора (если доступно).
  6. Беги снова.
AG
источник
5

Что сработало для меня:

  • Удалите контроллер сцен и представлений LaunchScreen и создайте новый ( убедитесь, что вы установили его как «Начальный контроллер представления» в Инспекторе атрибутов ).

Что не сработало для меня:

  • Удаление приложения
  • Перезагрузка iPhone, Mac или Xcode
  • Удаление полученных данных
  • Удаление контейнера устройства
  • очищающий
  • Горящие 3 куклы Стива Джобса Вуду

Примечание:

Иногда стирание (симулятор) тоже нужно

Дэниел Спрингер
источник
4
Я не убежден. Мне понадобятся исходные местоположения кукол вуду Стива Джобса, чтобы подтвердить.
Крис Брандсма,
3

Просто подключите ваше устройство, перейдите в Xcode> Window> Devices> Your device, теперь в установленных приложениях, выберите ваше приложение, щелкните правой кнопкой мыши и загрузите контейнер, перейдите к сгенерированному файлу, щелкните правой кнопкой мыши, Показать содержимое пакета, AppData, Library, Caches, и удалите файлы. Теперь перейдите в Xcode> Window> Devices> Your device> ваше приложение и щелкните правой кнопкой мыши, чтобы заменить контейнеры.


источник
3

Честно говоря, я не рискнул начать жить, не будучи уверенным, будет ли это обновлено или нет.

Итак, если вы используете xcassets, простое решение:

  1. Удалить старый набор изображений
  2. Воссоздать один с другим именем и добавьте ваши изображения заставки
  3. Обновите раскадровку, чтобы использовать эту «новую» ссылку на набор изображений

Это обязательно обновит! (Я даже протестировал с приложением, уже установленным на устройстве). Нет необходимости чистить кэш устройства или около того.

HiCo
источник
3
  1. Удалить приложение с устройства
  2. Выключите устройство
  3. Включите устройство
  4. Установите и запустите приложение.
Джо Рен
источник
1

Итак, я разобрался с проблемой. В предыдущей версии моего приложения мы использовали Launch Screen XIB. Где-то при разработке этой новой версии xib был удален и заменен только статическими изображениями запуска.

Решение заключается в использовании XIB Launch Screen. Я заметил, что в тот момент, когда я впервые использовал xib стартового экрана, файл, сохраненный в каталоге моментальных снимков, был заменен снимком xib.

lramirez135
источник
2
Нет, я использую Launch Screen XIB, и он не обновляется. Я полагаю, что вы обошли проблему, переключившись с Launch Screen> Static image> Launch Screen. Изменение экрана запуска в XCode и его запуск по-прежнему показывает старый экран запуска на iPhone. Изображение кешируется на устройстве. Я предполагаю, что если я изменю название стартового экрана, это сделает
свое дело
Создание экрана запуска с другим именем не обошло проблему, все еще видя старое. Единственная «надежда» состоит в том, что iOS обновляет свой кэш при каждом обновлении приложения, но я не могу найти никакой документации по этому вопросу
Кристоф Фондачи
1

Xcode 10 / iOS 12

Попробовав все вышеперечисленное, мне пришлось удалить изображение с LaunchScreen и заменить его новым.

ahbou
источник
1

Это самый быстрый способ, который я нашел, чтобы решить эту проблему, хотя это звучит глупо:

  1. Щелкните правой кнопкой мыши на LaunchScreen.xibфайле экрана запуска и выберите, Remove fileзатем выберите Remove to trash. Это удалит все ссылки на файл и его прошлые обновления из вашего проекта.

  2. Зайдите в корзину и перетащите файл обратно в ваш проект xCode (внутри yourProjectName).

  3. Очистить и восстановить.

Вальтер Монеке
источник
1

Используйте этот фрагмент кода для очистки кэша экрана запуска:

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
    }
}

Использование:

UIApplication.shared.clearLaunchScreenCache()
Mor4eza
источник
0

Была и эта проблема. Будучи новичком, я наивно изменил LaunchScreen.storyboard на LaunchScreen.xib. Запуск не удался (да), поэтому я изменил его на .storyboard, перезапустил приложение, просто чтобы проверить, что я больше ничего не испортил - и старый экран не появился первым. Так что, что бы я ни делал, это должно было стереть старый кеш.

ричард с. холм
источник
0

Была такая же проблема, но только с изображением, используемым в раскадровке на стартовом экране. Перемещение изображения из каталога ресурсов с изменением его имени на комплект приложений (например, старый набор изображений в каталоге активов назывался launch_logo, а изображение в комплекте приложений - launchscreen_logo.png) решило эту проблему для нас.

Антон Филимонов
источник
0

Я думаю, это зависит от ситуации. Когда это происходит при отладке или тестировании, работает над удалением изображения на стартовом экране. Или удалите свои приложения, затем перезапустите запуск.

Но идет даже после архива, потом не решается с перезагрузкой и очисткой.

이혜린
источник
0

В моем случае я не выбрал источник AppIcon в разделе «Настройки приложения» -> «Основные» - введите описание изображения здесь> «Значки приложений» и «Запустить изображения» -> «Источник значков приложений».

Mehrdad
источник
0

Попробуйте это в 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
источник
0

Решение работы для меня

  1. Удалить приложение с устройства
  2. Выключить устройство
  3. Включить устройство
  4. чистая папка сборки
  5. Снова соберите, установите и запустите приложение.

    наслаждаться

М Муртеза
источник
0

Убедитесь, что вы сделали все эти шаги

  1. Найдите ключ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME в настройке сборки и найдите значение его активов во всем приложении, а затем удалите его.
  2. Удалить ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME из настроек сборки.
  3. Создать новый экран запуска Xcode -> Файл -> Новый -> Файл -> Экран запуска
  4. Перейти к главной цели приложения -> Общие -> Значки приложений и изображения запуска -> Файл экрана запуска -> Выбрать новый файл экрана запуска.
  5. Если вы просто меняете старый экран запуска, попробуйте присвоить новым ресурсам имена с другими именами.
Джефф Аян
источник
-1

Попробуйте открыть симулятор, зайдя в Оборудование -> Стереть все содержимое и настройки.

Тигран Искандарян
источник