ChatGPT解决这个技术问题 Extra ChatGPT

iOS 更新后保留旧的启动屏幕和应用程序图标

ios

我有一个应用程序,我最近替换了启动图像和应用程序图标,我从项目的任何地方删除了所有旧资产。当我通过构建 Xcode 将应用程序从旧版本升级到新版本时,一切都很好。但是,如果我安装了旧版本的应用程序然后从 TestFlight 升级它,每次我杀死应用程序然后重新启动它时,旧的启动图像会在显示新的启动图像之前短暂出现。同样,当我关闭应用程序时,旧应用程序图标会短暂闪烁,然后再切换回我的新应用程序。

我使用 iExplorer 打开应用程序,发现 /Library/Caches/Shapshots 目录中保存了一张旧启动屏幕的图像(我不知道它是如何或为什么会出现在那里)。当我通过 iExplorer 手动删除它时,它会停止出现。但是,当我尝试使用 NSFileManager 方法使用代码删除它时,我收到错误消息,提示我禁止删除此目录中的文件。

有没有人经历过这种情况并有任何建议?

同样的问题,对于启动屏幕,新的启动屏幕永远不会显示,它使用的是以前版本的缓存图像。

P
Preetam Jadakar

通过执行以下操作,我已经能够可靠地清除跳板缓存以测试启动图像更改:

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

图像每次都会正确更新。遗憾的是,我需要关闭设备才能让它运行——但至少我已经能够以这种方式取得进展。我希望这可以帮助别人。

如果是模拟器,只需重新启动模拟器即可。


这是唯一对我有用的解决方案。非常感谢!
也适用于模拟器。
这也是TestFlight的修复吗?从 TestFlight 更新应用程序也会缓存启动图像。您确定这不会发生在与 testflight 不同的应用程序版本上吗?
这可能是我见过的最愚蠢的错误
我同意@EFE。它仍在 2020 年发生。这修复了它,但如果所有其他图标都可以在不这样做的情况下更新,则启动图标也可以!苹果?
M
Michal Šrůtek

Springboard 使用这些缓存来快速切换应用程序。这不是会影响您的生产用户的问题,理论上应该在 Springboard 下次决定对您的应用程序进行快照时消失。

话虽如此,这不是您可以解决的问题。这是 Apple 代码中的错误,而不是您的错误。

更新:似乎有一种不需要重新启动设备的解决方法。

这将在第二次发布后生效!

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


您能否链接到可以确认您的声明“这不是会影响您的生产用户的问题”的文档?我有完全相同的问题,如果这只是开发人员,我可以,但如果没有明确说明你所说的官方文件,我不会冒险。
对于某些人来说,App Store 更新也是如此 :(。
不幸的是,我可以确认这个问题甚至会影响生产用户(所以在从 App Store 升级应用程序之后)。
是的,它确实会影响生产版本/ App Store 版本。
这有什么来源吗?
M
Murray Sagal

对于模拟器,只需 Reset Contents and Settings...


这不是一个问题。关键是,在部署带有新图标或图像的新应用程序时,它们不会以相同的方式刷新,并且有些在被删除时会保持显示。
J
JERC

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

再次感谢我在上面引用的线程,我找到了解决此问题的方法 - 将新图像命名为与以前的图像不同,以防新图像与旧图像同名并将其从 * .xcassets 文件夹到项目目录并在你的 UIImageView 中引用它。就是这样。听起来很愚蠢,但哦,天哪,我有多少愤怒。


这里的关键是将这些图像保留在资产目录之外。谢谢!
如果您关心生产用户的良好 UX 并希望避免旧图像和新图像之间的丑陋过渡,这个解决方案真的很有帮助。
最后,一个真正有效的解决方案!这里的关键是将图像从资产文件夹中取出。
无需重新启动或删除应用程序即可完美运行。
诡异的。但是我从资产目录中移出的背景图像有时没有加载并且我得到黑色背景。现在我需要再次调试它,但不幸的是我不知道如何重现。
Y
Yu-Sen Han

如果您真的想解决此问题,我找到了解决方法。 Apple 有一些机制来缓存按图像文件名索引的启动屏幕图像。

当您更改启动屏幕上的任何图像并希望在下次运行时立即看到这些更改。请使用您更改的图像的新图像名称并链接到情节提要或 xib 中的新图像文件。

再次运行,你会看到新的变化出现了。


我不想删除该应用程序,所以我尝试了这个。这加上重新启动我的设备对我有用。
这对我不起作用。重新启动设备也没有用......我现在放弃了。
没有为我工作。我什至删除了 imageView 并使用新图像创建了一个新图像,但它仍然无法正常工作。
它对我不起作用。我没有加载旧的一个图像(仍然显示背景颜色而不是图像),并且在新的启动屏幕出现之前它仍然显示了几分之一秒。
A
Ankit Pundhir

卸载您的应用程序,重新启动您的手机并再次安装您的应用程序......这在我的情况下实际上已修复。


如果在生产中发生这种情况怎么办?你不能指望每个用户都卸载、重启设备。
C
Community

什么对我有用:

删除 LaunchScreen 的 Scene 和 View Controller 并创建一个新的(确保在 Attributes Inspector 中将其设置为“Initial View Controller”)。

什么对我不起作用:

删除应用程序

重启 iPhone、Mac 或 Xcode

删除派生数据

删除设备的容器

打扫

燃烧 3 个史蒂夫乔布斯巫毒娃娃

笔记:

有时也需要擦除(模拟器)


我不相信。我将需要史蒂夫乔布斯巫毒娃娃的来源位置来确认。
s
shim

我也面临同样的问题。发生这种情况是因为模拟器/ iOS 设备在您首次启动应用程序时缓存了启动图像。我对 Brian Trzupek's answer 添加了一些修改:

从 Xcode 资产中删除图像集(例如,launch_image) 添加一个新图像集并向其中添加图像。关闭并打开 iOS 设备。 (重置模拟器的内容和设置)。清理 Xcode 构建文件夹(按 command + option + shift + K)。从设备/模拟器中删除应用程序(如果可用)。再次运行。


h
hico

老实说,在不确定是否会更新的情况下,我没有冒险上线。

因此,假设您使用的是 xcassets,一个简单的解决方案是:

删除旧图像集 使用不同名称重新创建一个并添加初始屏幕图像 更新情节提要以使用此“新”图像集参考

它肯定会更新! (我什至用设备上已经安装的应用程序进行了测试)。无需清理设备缓存。


佚名

只需连接您的设备,转到 Xcode > Window > Devices > Your device,现在在已安装的应用程序中,选择您的应用程序,右键单击并下载容器,转到生成的文件,右键单击,显示包内容,AppData,库,缓存,并删除文件。现在转到 Xcode > Window > Devices > Your device > your app 并右键单击以替换容器。


S
Stephen Rauch

从设备中删除您的应用程序关闭设备电源启动设备安装并启动应用程序。


M
M Murteza

为我工作的解决方案

从设备中删除您的应用程序关闭设备打开设备清洁构建文件夹再次构建并安装并启动应用程序。享受


a
ahbou

Xcode 10/iOS 12

在尝试了上面提到的所有事情之后,我不得不从 LaunchScreen 中删除 imageview 并用一个新的替换它。


将图像放置在资产文件夹之外,并将启动屏幕中的图像视图替换为引用该图像的新图像。这对我有用!
对我不起作用:/
S
Sorakris Chaladlamsakul

这对我有用:http://arsenkin.com/launch_screen_image_cache.html 再次感谢我在上面引用的线程,我找到了解决此问题的方法 - 以不同的方式命名您的新图像,以防您的新图像一个与旧的同名,并将其从 *.xcassets 文件夹中放到项目目录中,并在您的 UIImageView 中引用它。就是这样。听起来很愚蠢,但哦,天哪,我有多少愤怒。

我可以确认@JERC 有效,感谢 arsenkin

就我而言,我在一个 react native 项目上工作,并且在 ios/projectname 中有一个 .storyboard 文件,我只想用相同的大小替换旧图像并保留旧约束。我不希望用户删除应用程序或重新启动他们的手机。

我做了什么

将图像复制到项目 src(在我的情况下,我将图像放在 src/assets 中)。打开 finder 并将图像拖到 xcode 项目中的项目目录中。将弹出一个窗口,确保您创建了对项目的引用。这里将 .storyboard 中的图像 src 更改为引用的图像。这里清理构建文件夹。这里重建应用程序


l
lramirez135

好的,所以我发现了这个问题。在我的应用程序的先前版本中,我们使用的是启动屏幕 XIB。在这个新版本的开发中,xib 被删除并只替换为静态启动图像。

解决方案是使用启动屏幕 XIB。我注意到,当我第一次使用启动屏幕 xib 时,存储在快照目录中的文件被替换为 xib 的快照。


不,我使用的是启动屏幕 XIB,它没有更新。我想您可以通过从启动屏幕 > 静态图像 > 启动屏幕切换来解决这个问题。在 XCode 中修改启动屏幕并运行它仍然会在 iPhone 上显示旧的启动屏幕。图像缓存在设备上。我想如果我更改启动屏幕的名称就可以了
用不同的名称重新创建启动屏幕并不能解决问题,仍然看到旧的。唯一的“希望”是 iOS 在每次应用更新时都会重新生成缓存,但我找不到任何关于此的文档
W
Walter Monecke

这是我发现解决此问题的最快方法,尽管听起来很愚蠢:

右键单击启动屏幕文件上的 LaunchScreen.xibor 并选择删除文件,然后选择删除到垃圾箱。这将从您的项目中删除该文件的所有引用及其过去的更新。进入您的垃圾箱并将文件拖放回您的 xCode 项目(在您的项目名称中)。清洁和重建。


M
Mor4eza

使用这段代码清理启动屏幕缓存:

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()

j
jeff ayan

确保您完成了所有这些步骤

在构建设置中搜索 ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 键并在整个应用程序中搜索其资产值,然后将其删除。从构建设置中删除 ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME。 Create New Launch screen Xcode -> File -> New -> File -> Launch Screen Goto App main Target -> General -> App Icons and Launch Images -> Launch Screen File -> 选择 New Launch Screen File。如果您只是更改旧的启动屏幕,请尝试用不同的名称命名新资产。


S
SecretAgentMan

对于模拟器或真实设备您只需要按照以下步骤操作。

从 xc 资产中删除你的飞溅。将 png 或 jpg 文件拖放到 Root 中。 LaunchScreen.xib 或故事板。打开 ViewController 并设置 ImageView 引用您拖动的特定图像。

如果你没有 ViewController 并且使用旧版本的 react 你会发现那里被命名为 View。所以删除它并制作新的 ViewController 以防该 View 不显示您的 Splash。


r
richard s. hill

也有这个问题。作为一个新手,我天真地将 LaunchScreen.storyboard 更改为 LaunchScreen.xib。运行失败(duh),所以我将它改回 .storyboard 重新运行应用程序只是为了测试我没有搞砸任何其他东西 - 旧屏幕没有首先出现。所以无论我做什么,它一定已经清除了旧缓存。


T
Tigran Iskandaryan

尝试打开模拟器,进入硬件 -> 擦除所有内容和设置。


A
Anton Filimonov

有同样的问题,但仅限于启动屏幕故事板中使用的图像。将图片从资产目录移动到应用程序包中(例如,资产目录中的旧图像称为launch_logo,应用程序包中的图像称为launchscreen_logo.png)为我们解决了这个问题。


이혜린

我想这些取决于情况。当它发生在调试或测试时,将在启动屏幕上删除图像。或卸载您的应用程序,然后重新启动。

但它甚至在存档后仍然存在,然后它不能通过重置和清理来解决。


D
Denis Kreshikhin

在 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")
    }

t
timbru31

受 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


M
MilanPanchal

就我而言,我没有从 App Setting -> General -> App Icons and Launch Images -> App Icons Source 中选择 App Icons Source

https://i.stack.imgur.com/IyHsr.png


M
Moustaoui Salaheddine

首先

清理和构建项目

方法一:重命名 LaunchScreen.storyboard 中加载的 Splash 图片。

例如,我加载了“splash”,但将其更改为“splashNew”。

方法二:

在不同的设备或模拟器上运行您的应用

例如,如果您在模拟器 iphone 11 中运行应用程序,请将其运行到 iphone 12