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

时间:2015-10-07 21:37:06

标签: ios objective-c cocoa-touch

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

我使用iExplorer打开了应用程序并注意到/ Library / Caches / Shapshots目录中保存了旧的启动画面的图像(我不知道它是如何或为什么到达那里)。当我通过iExplorer手动删除它时,它会停止显示。但是,当我尝试使用NSFileManager方法使用代码删除它时,我收到错误,说我禁止删除此目录中的文件。

以前有没有人经历过这个并有任何建议?

29 个答案:

答案 0 :(得分:224)

通过这样做,我已经能够可靠地清除跳板缓存以测试启动图像更改:

  1. 从设备中删除您的应用
  2. 关闭设备电源
  3. 打开设备电源,安装并启动应用程序。
  4. 图像每次都会正确更新。惭愧我需要关闭设备以使其继续运行 - 但至少我已经能够以这种方式取得进展。我希望这有助于某人。

答案 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的回答添加一些修改。

  1. 从Xcode资产中删除图像集(例如,launch_image)
  2. 添加新图像集并向其添加图像。
  3. 关闭并打开iOS设备。 (重置模拟器的内容和设置)。
  4. 清理Xcode构建文件夹(按Command + Option + Shift + K)。
  5. 从设备/模拟器中删除应用程序(如果有)。
  6. 再次跑步。

答案 7 :(得分:4)

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

  

再次,由于我上面引用了线程,我找到了一种方法   解决此问题-为您的新图像命名与此处不同   如果以前的新名称与旧的名称相同,   将其从* .xcassets文件夹移至项目目录,然后   在您的UIImageView中引用它。就是这样。听起来很愚蠢,但是   哦,我真生气。

答案 8 :(得分:3)

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

答案 9 :(得分:3)

  1. 从设备中删除您的应用
  2. 关闭设备电源
  3. 启动设备
  4. 安装并启动应用

答案 10 :(得分:1)

为我做什么

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

没有对我有什么帮助:

  • 删除应用
  • 重新启动iPhone,Mac或Xcode
  • 删除派生数据
  • 删除设备的容器
  • 清洁
  • 燃烧3个史蒂夫·乔布斯伏都教娃娃

答案 11 :(得分:1)

<块引用>

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

再次感谢我在上面引用的线程,我找到了一种方法 解决这个问题 - 命名您的新图像与那里的图像不同 之前,以防您的新名称与旧名称相同,并且 把它从 *.xcassets 文件夹中放到项目目录中 在您的 UIImageView 中引用它。就是这样。听起来很简单,但是 哦,我有多么愤怒。

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

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

我做了什么

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

答案 12 :(得分:1)

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

  1. 将您从xc资产中删除。
  2. 将png或jpg文件拖放到Root中。
  3. LaunchScreen.xib或情节提要。打开ViewController并设置ImageView ref拖动的特定图像。

如果您没有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)

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

  1. 右键单击LaunchScreen.xib或启动屏幕文件,然后选择Remove file,然后选择Remove to trash。这将从您的项目中删除该文件的所有引用及其过去的更新。

  2. 进入回收站,然后将文件拖放回xCode项目中(在yourProjectName内)。

  3. 清洁并重建。

答案 15 :(得分:1)

老实说,我没有冒险上线而不确定是否会更新。

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

  
      
  1. 删除旧图像集
  2.   
  3. 使用其他名称重新创建并添加启动画面图像
  4.   
  5. 更新故事板以使用此“新”图像集参考
  6.   

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

答案 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

enter image description here

答案 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)

为我工作的解决方案

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

    享受

答案 26 :(得分:0)

确保已完成所有这些步骤

  1. 在构建中搜索ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME密钥 在整个应用程序中设置和搜索其资产值,然后 删除它。
  2. 从“构建”设置中删除ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME。
  3. 创建新的启动屏幕Xcode-> File-> New-> File-> Launch 屏幕
  4. 转到应用主目标->常规->应用图标和启动图像-> 启动屏幕文件->选择新的启动屏幕文件。
  5. 如果您只是更改旧的“启动”屏幕,请尝试命名新资产 用不同的名称。

答案 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重新运行应用程序只是为了测试我没有搞砸任何其他东西 - 旧屏幕没有出现。所以无论我做了什么,它都必须冲掉旧的缓存。