我有一个应用程序,我最近更换了启动图像和应用程序图标,我从项目的所有地方删除了所有旧资产。只需在xcode中构建,将应用程序从旧版本升级到新版本,一切都很好。但是,如果我安装了旧版本的应用程序,那么从testflight升级它,每次我杀死应用程序然后重新启动它,旧的启动图像会在显示新的启动图像之前短暂出现。同样,当我关闭应用程序时,旧应用程序图标会短暂闪烁,然后再切换回新应用程序。
我使用iExplorer打开了应用程序并注意到/ Library / Caches / Shapshots目录中保存了旧的启动画面的图像(我不知道它是如何或为什么到达那里)。当我通过iExplorer手动删除它时,它会停止显示。但是,当我尝试使用NSFileManager方法使用代码删除它时,我收到错误,说我禁止删除此目录中的文件。
以前有没有人经历过这个并有任何建议?
答案 0 :(得分:224)
通过这样做,我已经能够可靠地清除跳板缓存以测试启动图像更改:
图像每次都会正确更新。惭愧我需要关闭设备以使其继续运行 - 但至少我已经能够以这种方式取得进展。我希望这有助于某人。
答案 1 :(得分:33)
Springboard使用这些缓存来快速切换应用程序。这不会影响您的生产用户,并且理论上应该在下次Springboard决定对您的应用进行快照时消失。
话虽如此,这不是你可以解决的问题。这是Apple的代码中的错误,而不是你的。
答案 2 :(得分:24)
仅适用于"prod"
答案 3 :(得分:12)
@InkGolem
这不是一个会影响您的生产用户的问题
是真的。
当我更改Launch Screen,SplashScreen和App Icon时,我遇到了这个问题。我试过各种方法,但它没有用。最后,我刚刚发布了我的应用程序,并使用我没有用于开发的设备从App商店下载了我的应用程序。 SplashScreen和App Icon正常工作!!!
答案 4 :(得分:11)
如果您真的想解决此问题,我找到了解决方法。 Apple有一些机制来缓存按图像文件名索引的启动画面图像。
当您在启动屏幕上更改任何图像时,您希望立即在下次运行中看到这些更改。请使用新图像名称更改您更改的图像并链接到storyboard或xib中的新图像文件。
再次运行,您将看到新的更改。
答案 5 :(得分:8)
卸载您的应用,重新启动手机并再次安装您的应用......这实际上已修复了我的情况。
答案 6 :(得分:5)
我也面临同样的问题。它的发生是因为模拟器/ iOS设备在我们第一次启动应用程序时缓存启动图像。我正在为Brian Trzupek的回答添加一些修改。
答案 7 :(得分:4)
这对我有用:http://arsenkin.com/launch_screen_image_cache.html
再次,由于我上面引用了线程,我找到了一种方法 解决此问题-为您的新图像命名与此处不同 如果以前的新名称与旧的名称相同, 将其从* .xcassets文件夹移至项目目录,然后 在您的UIImageView中引用它。就是这样。听起来很愚蠢,但是 哦,我真生气。
答案 8 :(得分:3)
只需连接您的设备,转到Xcode>窗口>装置>你的设备, 现在,在已安装的应用程序中,选择您的应用程序,右键单击并下载容器,转到生成的文件,右键单击,显示包内容,AppData,库,缓存和删除文件。 现在转到Xcode>窗口>装置>您的设备>您的应用并右键单击以替换容器。
答案 9 :(得分:3)
答案 10 :(得分:1)
为我做什么:
没有对我有什么帮助:
答案 11 :(得分:1)
这对我有用:http://arsenkin.com/launch_screen_image_cache.html
再次感谢我在上面引用的线程,我找到了一种方法 解决这个问题 - 命名您的新图像与那里的图像不同 之前,以防您的新名称与旧名称相同,并且 把它从 *.xcassets 文件夹中放到项目目录中 在您的 UIImageView 中引用它。就是这样。听起来很简单,但是 哦,我有多么愤怒。
我可以确认 @JERC 有效,感谢 arsenkin
在我的例子中,我在一个 react native 项目上工作,并且在 ios/projectname 中有一个 .storyboard 文件 我只想用相同的大小替换旧图像并保留旧的约束。我不希望用户删除应用或重启手机。
我做了什么
答案 12 :(得分:1)
用于模拟器或用于真实设备 您只需要按照以下步骤操作即可。
如果您没有ViewController并使用旧版本的react进行操作,则会在其中找到名为View的名称。因此请将其删除,并新建一个ViewController,以防万一该View不显示您的Splash。
答案 13 :(得分: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()
答案 14 :(得分:1)
这是我发现解决此问题的最快方法,尽管听起来很愚蠢:
右键单击LaunchScreen.xib
或启动屏幕文件,然后选择Remove file
,然后选择Remove to trash
。这将从您的项目中删除该文件的所有引用及其过去的更新。
进入回收站,然后将文件拖放回xCode项目中(在yourProjectName
内)。
清洁并重建。
答案 15 :(得分:1)
老实说,我没有冒险上线而不确定是否会更新。
因此,假设您使用的是xcassets,一个简单的解决方案是:
- 删除旧图像集
- 使用其他名称重新创建并添加启动画面图像
- 更新故事板以使用此“新”图像集参考
醇>
它肯定会更新! (我甚至测试过已经安装在设备上的应用程序)。无需清理设备缓存等。
答案 16 :(得分:1)
好的,所以我想出了这个问题。在我的应用程序的早期版本中,我们使用的是Launch Screen XIB。在这个新版本的开发中,xib被删除并仅用静态启动图像替换。
解决方案是使用Launch Screen XIB。我注意到,当我第一次使用启动屏幕xib时,存储在snapshots目录中的文件被替换为xib的快照。
答案 17 :(得分:0)
Xcode 10 / iOS 12
尝试了上述所有内容之后,我不得不从LaunchScreen中删除imageview并将其替换为新的。
答案 18 :(得分:0)
尝试打开模拟器,然后转到“硬件->擦除所有内容和设置”。
答案 19 :(得分:0)
有同样的问题,但仅适用于启动屏幕情节提要中使用的图像。将图像从资产目录更改为名称更改为应用程序包(例如,资产目录中设置的旧图像称为launch_logo,应用程序包中的图像称为launchscreen_logo.png)为我们解决了这个问题。
答案 20 :(得分:0)
有时我们会遇到诸如更改初始屏幕之类的问题,但是即使我们删除应用程序并退出Xcode并再次启动,它也没有更新,因此这是清除初始屏幕缓存的代码。
func clearLaunchScreenCache() {
do {
try FileManager.default.removeItem(atPath: NSHomeDirectory()+"/Library/SplashBoard")
} catch {
print("Failed to delete lunch screen cache: \(error)")
}
}
答案 21 :(得分:0)
@Chino
@InkGolem
这不会影响您的生产用户 是真实的。
当我更改Launch Screen,SplashScreen和App时,我遇到了这个问题 图标。我尝试了每种方法,但它没有用。最后,我刚刚发布了我的应用程序 并使用我没有使用的设备从App Store下载了我的应用程序 发展。 SplashScreen和App Icon正常工作!!!
在此设备上,您是否安装了以前的版本?我相信这与上述答案相同,即删除并重新安装或删除,重新启动并重新安装。
我遇到了同样的问题,它与开发和生产设备,模拟器和appstore有关。我也可以使用模拟器重新创建问题。我首先使用以前版本的代码运行模拟器,然后使用更高版本运行模拟器。在这两种情况下,旧的发射屏幕都会延续。在模拟器中删除快照不起作用,因为它只是重新创建。当您通过点击主页按钮关闭应用程序时,将拍摄具有较旧启动屏幕的新快照。现在......如果我从手机或模拟器中删除旧版本的应用程序然后使用xcode或应用商店安装,启动屏幕会正确更新。然而,对于最终用户来说,这不是一个理想的解决方案。
有没有人想出一个不涉及从手机中删除以前的应用程序的解决方案?
我试过了: 重命名LaunchScreen xib文件 重命名LaunchScreen使用的图像 将空白图像添加到applicationDidEnterBackground上的screen.window以隐藏快照之前的屏幕
在[application didFinishLaunchingWithOptions]上添加一个中断我可以看到旧的LaunchScreen在调用didFinishLaunchingWithOptions之前出现。
答案 22 :(得分:0)
我想这些取决于情况。 当它在调试或测试中发生时,可用于删除启动屏幕上的图像。 或卸载您的应用程序,然后重新启动。
但是即使在存档后也可以使用,然后通过重置和清除无法解决。
答案 23 :(得分:0)
就我而言,我尚未从App Icons Source
中选择App Setting -> General -> App Icons and Launch Images -> App Icons Source
答案 24 :(得分: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")
}
答案 25 :(得分:0)
为我工作的解决方案
重新构建并安装并启动应用。
享受
答案 26 :(得分:0)
确保已完成所有这些步骤
答案 27 :(得分:0)
受Guilherme Rambo博客条目的启发,我创建了一个cordova插件来以编程方式清除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
答案 28 :(得分:0)
也有这个问题。作为一个新手我天真地将LaunchScreen.storyboard更改为LaunchScreen.xib。运行失败(呃),所以我把它改回了.storyboard重新运行应用程序只是为了测试我没有搞砸任何其他东西 - 旧屏幕没有出现。所以无论我做了什么,它都必须冲掉旧的缓存。