问题
As discussed here & here, the only apparent way to host re-usable images in a Framework's .xcassets
file, then use those images in the storyboard / XIB of an app, is to manually create a reference to that catalog file directly within the app's project. This puts the assets within the app's main bundle, and avoids this error when trying to use them via Interface Builder:
Could not load the "ImageName" image referenced from a nib in the bundle with identifier "BundleName"
My question, though, is: Does this lead to duplication of the assets at build-time? Is iOS smart enough not to double-up assets which are both:
- Referenced in the app's main bundle and
- Included in the bundle of an embedded framework
If this does lead to duplication, what other approach can achieve the same result more efficiently? The framework needs to be embedded in the app, because it contains other reusable code, and the assets need to be in the framework's catalog, because they're also used in other apps.
回答1:
Apple's goal is to minimize the space required for assets, so assets are combined and compressed into one file called 'Asset.car'.
When you submit to the app store a process called App Thinning is started that creates variants for different actual devices.
You can mimic the process locally and with a third-party tools even take a look inside the 'Asset.car' file.
I described the whole process in detail in this answer: Pixelated images on iOS10 when building with Xcode 10
To test it myself I did the following:
- I created a workspace
- I added a framework
- I added an app
- inside the framework I added a 'Media.xcassets'
- I reference this Media.xcassets from the app
- I added one picture called 'Regensburg.jpg' to Media.xcassets
- I use this image in a storyboard
Then I do the process described in my linked answer above and extract the Asset.car file.
When taking a look with the third-party tool inside, one can see that the image is just once there.
So good news: like expected no duplication happens.
Screenshot
In the screenshot you can see:
Xcode project structure with framework and app as well as .xcassets in the background
usage of the only image inside in the storyboard
the extracted Assets.car in Finder in the lower right area
finally the mentioned third-party tool in the lower left area, where you see that the file is there just once
More information
Like in my other answer I would recommend to take a look at this WWDC 2018 video: Session 227, Optimizing App Assets, https://developer.apple.com/videos/play/wwdc2018/227/
来源:https://stackoverflow.com/questions/55859440/does-both-referencing-an-asset-catalogue-and-including-it-from-a-framework-creat