从 Testflight 加载应用程序时捆绑资产检索中断

Bundle asset retrieval broken when app is loaded from Testflight

我遇到了一个问题,涉及我的 iOS SDK 以及当从 Testflight 下载应用程序时它如何检索和显示图像(来自捆绑资产)。

SDK可以通过SPM、Cocoapods和Carthage集成。这个问题是关于 Cocoapods 集成的。

在本地,即使是发布版本,当 运行 在设备上时,一切 运行 都很好并且正在显示图像:

当使用“发布”构建配置在本地构建时,图标显示。当完全相同的应用程序被存档然后通过 Testflight 下载时,所有图标都消失了。

这是我从捆绑包中检索图像的方式:

let background = UIImage(named: "select_chevrons", in: .current, compatibleWith: nil)?.withRenderingMode(.alwaysTemplate)

并且因为我以 3 种方式分发我的 SDK(Swift 包、cocoapods 和迦太基),我必须实现一个 BundleFinder,它定义 .current:

import Foundation

private class BundleFinder {}

extension Foundation.Bundle {
    /// Returns the resource bundle associated with the current Swift module.
    var moduleName = "NAME_OF_MY_SDK"
    static var current: Bundle = {
        #if SWIFT_PACKAGE
            let bundleName = "\(moduleName)_\(moduleName)"
        #else
            let bundleName = moduleName
        #endif

        let candidates = [
            // Bundle should be present here when the package is linked into an App.
            Bundle.main.resourceURL,
            // Bundle should be present here when the package is linked into a framework.
            Bundle(for: BundleFinder.self).resourceURL,
            // For command-line tools.
            Bundle.main.bundleURL,
        ]

        for candidate in candidates {
            let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle")
            if let bundle = bundlePath.flatMap(Bundle.init(url:)) {
                return bundle
            }
        }

        print("unable to find bundle named \(bundleName)")
        
        return Bundle(for: BundleFinder.self)
    }()
}

问:为什么应用来自Testflight时图片不显示?我如何在本地重现此行为?

我发现这个问题有完全相同的问题:

Pod install has required target membership unchecked

问题是,包与模块同名。将包名称更改为其他名称可以解决问题,请参阅我的回答: