iOS更新后如何保留旧版启动画面和应用图标?

227

我有一个应用程序,最近更换了启动图像和应用程序图标,并从项目中的所有位置删除了旧资源。当我通过Xcode构建升级应用程序的旧版本到新版本时,一切正常。然而,如果我已经安装了旧版本的应用程序,然后从TestFlight升级它,每次我杀掉应用程序然后重新启动它时,旧的启动图像会在显示新的启动图像之前短暂出现。同样地,当我关闭应用程序时,旧的应用程序图标会在短暂闪烁后切换回我的新的应用程序图标。

我使用iExplorer打开应用程序,并注意到在/Library/Caches/Shapshots目录中保存了旧的启动屏幕图像(我不知道它是如何或为什么会出现在那里)。当我通过iExplorer手动删除它时,它就不再出现了。然而,当我尝试使用NSFileManager方法删除它时,我收到错误提示,说我无法删除此目录中的文件。

有人遇到过这种情况并有什么建议吗?


3
相同的问题,使用新的启动屏幕时,新的启动屏幕从未显示,而是使用了先前版本的缓存图像。 - Christophe Fondacci
27个回答

425

我已经通过以下方式可靠地清除春板缓存以测试启动图像更改:

  1. 从设备中删除您的应用程序
  2. 关闭设备电源
  3. 开机,安装并启动应用程序。

每次都会正确更新图像。很遗憾我需要关闭设备电源才能使它正常工作,但至少我已经通过这种方式取得了进展。

对于模拟器,只需要重启模拟器即可。


29
这是唯一一个对我有效的解决方案。非常感谢! - Marcin Kapusta
5
也适用于模拟器。 - Alexey Podlasov
2
这也适用于TestFlight吗?从TestFlight更新应用程序也会缓存启动图像。您确定这不会发生在应用程序版本上,而不是TestFlight上吗? - hasan
8
这可能是我见过的最愚蠢的漏洞。 - EFE
2
我同意@EFE的观点。这在2020年仍然存在。这可以解决问题,但如果所有其他图标都可以更新而不需要这样做,那么启动图标也可以!苹果公司怎么回事? - Panama Jack
显示剩余7条评论

66

这些缓存被Springboard用于快速切换应用程序。这不会影响您的生产用户,并且理论上应该在Springboard下次对您的应用程序进行快照时消失。

话虽如此,这不是你可以修复的问题。这是苹果代码中的错误,而不是你的问题。

更新: 似乎有一种解决方法,不需要重新启动设备。 第二次启动后就会生效!

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

如何实现这一点的完整解释请参见:https://www.rambo.codes/posts/2019-12-09-clearing-your-apps-launch-screen-cache-on-ios


8
请您提供支持您说法的文件链接,“这不会影响您的生产用户”的说法。我也遇到了完全相同的问题,如果只是开发环境出现此问题,那么我可以接受,但是如果没有官方文件明确说明您所说的话,我将不会冒险。 - Christophe Fondacci
7
有些人在更新应用商店的时候也遇到了这个问题 :(。 - Ajumal
25
很遗憾,我可以确认这个问题甚至影响到生产用户(也就是从应用商店升级后的用户)。 - Eugenio
是的,它确实会影响生产构建/应用商店构建。 - Jonny
有来源吗? - user5306470
这对我有用...我根据存储的首选项仅删除一次,如果您想检查文件夹中还有哪些其他项目。NSLog(@“%@”,[[NSFileManager defaultManager] subpathsAtPath:NSHomeDirectory()]); - vishal gupta

34

对于模拟器,只需重置内容和设置...


1
这不是一个问题。关键在于当部署一个带有新图标或图片的新应用程序时,它们并不总是以相同的方式全部刷新,有些被保留显示,而它们已经被移除了。 - Stephane Paquet

21

这对我有用:http://arsenkin.com/launch_screen_image_cache.html

同样感谢上面提到的讨论帖,我找到了解决这个问题的方法 - 如果您的新图像与旧图像具有相同的名称,请将其命名为不同的名称,并将其放在*.xcassets文件夹以外的项目目录中,然后在UIImageView中引用它。就是这样。听起来很容易但我曾经因为这个问题非常愤怒。


3
关键在于将这些图像排除在资源目录之外。谢谢! - Michal Cichon
3
如果你关心生产用户的良好用户体验并希望避免旧图像与新图像之间的不美观转换,那么这个解决方案确实会有所帮助。 - Michal Cichon
3
终于,一个真正管用的解决方案!关键在于将图片放在资产文件夹之外。 - Elad
1
无需重启或删除应用程序即可完美运行。 - Soufian Hossam
3
有点奇怪。但是我从资产目录中移出的背景图有时无法加载,会变成黑色背景。现在我需要再次进行调试,但不幸的是我不知道如何重现这个问题。 - Michal Cichon

14

我发现了一个解决方法,如果你真的想要解决这个问题。

苹果有一些机制来缓存启动屏幕的图像,它们是按照图像文件名进行索引的。

当您更改启动屏幕上的任何图像并希望在下次运行中立即看到这些更改时,请使用新的图像名称,并将其链接到故事板或XIB中的新图像文件。

再次运行,您就会看到新变化出现了。


1
我不想删除这个应用程序,所以我尝试了另一个方法。同时,重启我的设备对我也有帮助。 - Murray Sagal
这对我没用。重启设备也没有用...我现在放弃了。 - Lensflare
对我没用。 我甚至删除了imageView并创建了一个带有新图像的新对象,但仍然无法正常工作。 - Rickard Elimää
对我来说没有起作用。我得到了旧的一张图片,而不是加载新的(仍然以背景颜色代替图片),并且在新的启动屏幕出现之前仍然呈现了一小部分时间。 - Michal Cichon

12

卸载您的应用程序,重新启动手机并再次安装您的应用程序... 这在我的情况下实际上解决了问题。


1
如果这种情况发生在生产环境中怎么办?你不能指望每个用户都卸载、重启设备。 - Rohit Singh
@RohitSingh 这是一个很好的问题。 - PhillipJacobs

8

我的解决方法:

  • 删除LaunchScreen的场景和视图控制器,创建一个新的(确保在属性检查器中将其设置为“初始视图控制器”)。

对我无效的方法:

  • 删除应用程序
  • 重启iPhone、Mac或Xcode
  • 删除派生数据
  • 删除设备的容器
  • 清理
  • 烧3个史蒂夫·乔布斯巫毒娃娃

注意:

有时需要擦除(模拟器)


7
我不太相信。我需要史蒂夫·乔布斯巫毒娃娃的来源位置来确认。 - Chris Brandsma
烧毁3个史蒂夫·乔布斯巫毒娃娃。 - PhillipJacobs

5
我也遇到过同样的问题。这是因为模拟器/ iOS设备在首次启动应用程序时缓存了启动图像。我对Brian Trzupek's answer进行了一些修改:
  1. 从Xcode资源中删除图像集(例如launch_image)
  2. 添加新的图像集并向其中添加图像。
  3. 关闭并重新开启iOS设备。(对于模拟器,重置内容和设置)。
  4. 清除Xcode构建文件夹(按下command+option+shift+K)。
  5. 从设备/模拟器中删除应用程序(如果可用)。
  6. 再次运行。

5

解决方案适用于我

  1. 从设备上删除您的应用程序
  2. 关闭设备
  3. 打开设备
  4. 清理构建文件夹
  5. 再次构建、安装并启动应用程序。

    享受吧!


4
说实话,我不敢冒险在没有确定是否会更新的情况下直接上线。
因此,假设你正在使用xcassets,一个简单的解决方案是:
  1. 删除旧的图像集
  2. 重新创建一个不同名称的图像集,并添加您的启动画面图像
  3. 更新您的故事板以使用这个“新”的图像集引用
它肯定会更新!(我甚至已经测试了已经安装在设备上的应用程序)。不需要清除设备缓存等操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接