iOS 更新后保留旧的启动屏幕和应用程序图标
Posted
技术标签:
【中文标题】iOS 更新后保留旧的启动屏幕和应用程序图标【英文标题】:iOS Keeping old launch screen and app icon after update 【发布时间】:2016-01-05 07:27:16 【问题描述】:我有一个应用程序,我最近替换了启动图像和应用程序图标,我从项目的任何地方删除了所有旧资产。当我通过构建 Xcode 将应用程序从旧版本升级到新版本时,一切都很好。但是,如果我安装了旧版本的应用程序然后从 TestFlight 升级它,每次我杀死应用程序然后重新启动它时,旧的启动图像会在显示新的启动图像之前短暂出现。同样,当我关闭应用程序时,旧应用程序图标会短暂闪烁,然后再切换回我的新应用程序。
我使用 iExplorer 打开应用程序并注意到在/Library/Caches/Shapshots
目录中保存了旧启动屏幕的图像(我不知道它是如何或为什么会出现在那里)。当我通过 iExplorer 手动删除它时,它会停止出现。但是,当我尝试使用 NSFileManager
方法使用代码删除它时,我收到错误消息,提示我禁止删除此目录中的文件。
有没有人经历过这种情况并有什么建议?
【问题讨论】:
同样的问题,新的启动屏幕从不显示,它使用的是以前版本的缓存图像。 【参考方案1】:通过执行以下操作,我已经能够可靠地清除跳板缓存以测试启动图像更改:
-
从设备中删除您的应用
关闭设备电源
启动设备,安装并启动应用程序。
图像每次都会正确更新。遗憾的是,我需要关闭设备才能让它运行——但至少我已经能够以这种方式取得进展。我希望这对某人有所帮助。
如果是模拟器,只需重启模拟器即可。
【讨论】:
这是唯一对我有用的解决方案。非常感谢! 也适用于模拟器。 这也是 TestFlight 的修复方法吗?从 TestFlight 更新应用程序也会缓存启动图像。你确定这不会发生在与 testflight 不同的应用版本上吗? 这可能是我见过的最愚蠢的错误 我同意@EFE。它仍在 2020 年发生。这修复了它,但如果所有其他图标都可以在不这样做的情况下更新,则启动图标也可以! WTF 苹果?【参考方案2】: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
【讨论】:
能否请您链接到可以确认您的声明“这不是会影响您的生产用户的问题”的文档?我有完全相同的问题,如果这只是开发人员,我可以,但如果没有明确说明你所说的官方文件,我不会冒险。 对于某些人来说,App Store 更新也是如此 :(. 不幸的是,我可以确认这个问题甚至会影响生产用户(所以在从 App Store 升级应用程序之后)。 是的,它确实会影响生产版本/ App Store 版本。 这有什么来源吗?【参考方案3】:模拟器只需Reset Contents and Settings...
【讨论】:
这不是问题。关键是,在部署带有新图标或图像的新应用时,它们的刷新方式并不相同,有些在被删除时仍会显示。【参考方案4】:这对我有用:http://arsenkin.com/launch_screen_image_cache.html
再次感谢我上面引用的线程,我找到了一种方法 解决这个问题 - 以不同的方式命名您的新图像 是以前,以防你的新人与旧人同名,并且 将其从 *.xcassets 文件夹中放到项目目录中,然后 在你的 UIImageView 中引用它。就是这样。听起来很愚蠢但是 哦,天哪,我有多愤怒。
【讨论】:
这里的 key 是将这些图像保留在资产目录之外。谢谢! 如果您关心生产用户的良好 UX 并希望避免旧图像和新图像之间的丑陋过渡,这个解决方案真的很有帮助。 终于,一个真正有效的解决方案!这里的关键是将图像从资产文件夹中取出。 无需重启或删除应用即可完美运行。 很奇怪。但是我从资产目录中移出的背景图像有时没有加载并且我得到黑色背景。现在我需要再次调试它,但不幸的是我不知道如何重现。【参考方案5】:如果您真的想解决此问题,我找到了解决方法。 Apple 有一些机制来缓存按图像文件名索引的启动屏幕图像。
当您更改启动屏幕上的任何图像并希望在下次运行时立即看到这些更改。请使用您更改的图像的新图像名称并链接到情节提要或 xib 中的新图像文件。
再次运行,你会看到新的变化出现。
【讨论】:
我不想删除该应用,所以我尝试了这个。这加上重新启动我的设备对我有用。 这对我不起作用。重新启动设备也没有用...我现在放弃了。 对我不起作用。我什至删除了 imageView 并使用新图像创建了一个新图像,但它仍然无法正常工作。 它对我不起作用。我没有加载旧的一个图像(仍然显示背景颜色而不是图像),并且在新的启动屏幕出现之前它仍然显示了几分之一秒。【参考方案6】:卸载您的应用程序,重新启动您的手机并再次安装您的应用程序...这在我的情况下实际上已解决。
【讨论】:
【参考方案7】:什么对我有用:
删除 LaunchScreen 的 Scene 和 View Controller 并创建一个新的(确保在 Attributes Inspector 中将其设置为“Initial View Controller”)。没有对我有用:
删除应用程序 重启 iPhone、Mac 或 Xcode 删除派生数据 删除设备的容器 清洁 燃烧 3 个史蒂夫乔布斯巫毒娃娃注意:
有时也需要擦除(模拟器)
【讨论】:
我不相信。我将需要史蒂夫乔布斯巫毒娃娃的来源位置来确认。【参考方案8】:我也遇到了同样的问题。发生这种情况是因为模拟器/ iOS 设备在您首次启动应用程序时缓存了启动图像。我对Brian Trzupek's answer添加了一些修改:
-
从 Xcode 资产中删除图像集(例如,launch_image)
添加新图像集并向其中添加图像。
关闭并打开 iOS 设备。 (重置模拟器的内容和设置)。
清理 Xcode 构建文件夹(按 command + option + shift + K)。
从设备/模拟器中删除应用程序(如果有)。
再次运行。
【讨论】:
【参考方案9】:老实说,在不确定是否会更新的情况下,我没有冒险上线。
所以,假设您使用的是 xcassets,一个简单的解决方案是:
删除旧图像集 用不同的名称重新创建一个并添加您的初始屏幕图像 更新您的故事板以使用此“新”图像集参考
肯定会更新! (我什至用设备上已经安装的应用程序进行了测试)。无需清理设备缓存。
【讨论】:
【参考方案10】:只需连接您的设备,转到 Xcode > 窗口 > 设备 > 您的设备, 现在在已安装的应用程序中,选择您的应用程序,右键单击并下载容器,转到生成的文件,右键单击,显示包内容,AppData,Library,Caches,然后删除文件。 现在转到 Xcode > Window > Devices > Your device > your app 并右键单击以替换容器。
【讨论】:
【参考方案11】:-
从设备中删除您的应用
关闭设备电源
启动设备
安装并启动应用程序。
【讨论】:
【参考方案12】:适合我的解决方案
-
从设备中删除您的应用
关闭设备
打开设备
清理构建文件夹
再次构建并安装和启动应用程序。
享受
【讨论】:
【参考方案13】:Xcode 10/iOS 12
在尝试了上面提到的所有事情之后,我不得不从 LaunchScreen 中删除 imageview 并用新的替换它。
【讨论】:
将图像定位在资产文件夹之外,并将启动屏幕中的图像视图替换为引用图像的新视图。这对我有用! 对我不起作用:/【参考方案14】:这对我有用:http://arsenkin.com/launch_screen_image_cache.html
再次感谢我上面引用的线程,我找到了一种方法 解决这个问题 - 以不同的方式命名您的新图像 是以前,以防你的新人与旧人同名,并且 将其从 *.xcassets 文件夹中放到项目目录中,然后 在你的 UIImageView 中引用它。就是这样。听起来很愚蠢但是 哦,天哪,我有多愤怒。
我可以确认 @JERC 有效,感谢 arsenkin
在我的例子中,我在一个 react native 项目上工作,并且在 ios/projectname 中有一个 .storyboard 文件 我只想用相同的大小替换旧图像并保留旧的约束。我不希望用户删除应用或重启手机。
我做了什么
-
将图像复制到项目 src(在我的情况下,我将我的图像放在
src/assets
)。
打开 finder 并将图像拖到 xcode 项目中的项目目录中。
将弹出一个窗口,确保您创建了对项目的引用。 here
将 .storyboard 中的图像 src 更改为引用的图像。 here
清理构建文件夹。 here
重建应用程序
【讨论】:
【参考方案15】:好的,所以我找到了问题所在。在我的应用程序的先前版本中,我们使用的是启动屏幕 XIB。在这个新版本的开发中,xib 被删除并只替换为静态启动图像。
解决方案是使用启动屏幕 XIB。我注意到,当我第一次使用启动屏幕 xib 时,存储在快照目录中的文件被替换为 xib 的快照。
【讨论】:
不,我使用的是启动屏幕 XIB,它没有更新。我想你可以通过从启动屏幕 > 静态图像 > 启动屏幕切换来解决这个问题。在 XCode 中修改启动屏幕并运行它仍然会在 iPhone 上显示旧的启动屏幕。图像缓存在设备上。我想如果我更改启动屏幕的名称就可以了 用不同的名称重新创建启动屏幕并没有解决问题,仍然看到旧的。唯一的“希望”是 iOS 在每次应用更新时都会重新生成缓存,但我找不到任何关于此的文档【参考方案16】:这是我发现解决此问题的最快方法,虽然听起来很愚蠢:
右键单击LaunchScreen.xib
或您的启动屏幕文件并选择Remove file
,然后选择Remove to trash
。这将从您的项目中删除该文件的所有引用及其过去的更新。
进入您的回收站并将文件拖放回您的 xCode 项目(在 yourProjectName
内)。
清理并重建。
【讨论】:
【参考方案17】:使用这段代码清理启动屏幕缓存:
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()
【讨论】:
【参考方案18】:确保您已完成所有这些步骤
-
在构建中搜索 ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 键
然后在整个应用程序中设置和搜索其资产值
删除它。
从构建设置中删除 ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME。
创建新的启动屏幕 Xcode -> 文件 -> 新建 -> 文件 -> 启动
屏幕
转到应用程序主目标 -> 常规 -> 应用程序图标和启动图像 ->
启动屏幕文件 -> 选择新的启动屏幕文件。
如果您只是更改旧的启动屏幕,请尝试命名新资产
有不同的名字。
【讨论】:
【参考方案19】:模拟器或真机 您只需要按照这些步骤操作即可。
-
从 xc 资产中删除您的飞溅。
将 png 或 jpg 文件拖放到根目录中。
LaunchScreen.xib 或故事板。打开 ViewController 并设置 ImageView 引用您拖动的特定图像。
如果你没有 ViewController 并且使用旧版本的 react 你会发现那里被命名为 View。所以删除它并制作新的 ViewController 以防该 View 不显示您的 Splash。
【讨论】:
【参考方案20】:也有这个问题。作为一个新手,我天真地将 LaunchScreen.storyboard 更改为 LaunchScreen.xib。运行失败(duh),所以我将它改回 .storyboard 重新运行应用程序只是为了测试我没有搞砸任何其他东西 - 旧屏幕没有首先出现。所以无论我做什么,它一定已经清除了旧缓存。
【讨论】:
【参考方案21】:有同样的问题,但只是在启动屏幕故事板中使用的图像。将图片从资产目录中移到应用程序包中(例如,资产目录中的旧图像称为launch_logo,应用程序包中的图像称为launchscreen_logo.png)为我们解决了这个问题。
【讨论】:
【参考方案22】:我想这些取决于情况。 当它发生在调试或测试时,会在启动屏幕上删除图像。 或者卸载您的应用,然后重新启动。
但是存档后它甚至可以解决,然后它不能通过重置和清理来解决。
【讨论】:
【参考方案23】:在 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")
【讨论】:
【参考方案24】:受 Guilherme Rambo 的博客文章的启发,我创建了一个 cordova-plugin 以编程方式清除 iOS 13+ 上的启动屏幕缓存:
cordova.plugins.launchScreenCache.deleteLaunchScreenCache().finally((result) =>
// returns true in the success case, false if iOS <13
// rejects in an error case
);
更多信息请访问GitHub repo
【讨论】:
【参考方案25】:就我而言,我没有从App Setting -> General -> App Icons and Launch Images -> App Icons Source
中选择App Icons Source
【讨论】:
【参考方案26】:尝试打开模拟器,进入硬件 -> 擦除所有内容和设置。
【讨论】:
以上是关于iOS 更新后保留旧的启动屏幕和应用程序图标的主要内容,如果未能解决你的问题,请参考以下文章
.NET MVC Ajax 表单保留旧的输入值 - 如何更新到模型的值?
临时和企业签名的应用程序在 iOS 13.3.1 的启动屏幕上崩溃