App thinning without @3x images and when some imag

2020-07-18 03:58发布

问题:

For an upcoming update to one of my apps I have packed all the image resources into Asset Catalogs.

However, at the moment I do not have @3x version for most of my images. I have checked with the simulator and on iPhone 6 Plus @2x versions are used.

I don't mind this behaviour for two reasons:

  1. The result is good enough for images which I am using
  2. Only 50% of my users are using iOS 9. If I add @3x images the size of my app will skyrocket for those on older OS

Although images load correctly in the Simulator for iPhone 6 plus, I am a bit worried about what happens when I archive my app. In particular, I am afraid that with App Thinning iPhone 6 Plus users will get an app without any images :)

So, I have two questions:

  1. If I do not provide @3x images will @2x be loaded on iPhone 6 plus after my update goes live on the App Store?
  2. Will I still benefit from App Thinning because users with @2x and @3x displays will not be downloading @1x images (and vice versa)? Or will App Thinning not work in this case and users will get the same assets irrespective of their device's screen?

These are trivial questions, but I couldn't find info anywhere online as to what happens when you do not follow Apple's guidelines by not providing @3x images in asset catalogs but your app is still available for iPhone 6 +. In addition, some of my images are in JPG format which adds extra uncertainty because it is not an ideal format for iPhone.

Thanks in advance for any assistance!

回答1:

I performed several additional tests using the procedure proposed by Matt:

  1. When minimum deployment target is iOS 6 no Assets.car is being generated. [UIImage imageNamed:] returns nil for JPG images unless ".jpg" extensions is provided as part of the image name
  2. When minimum deployment target is iOS 7 Assets.car is generated but it contains only those images which were imported in Asset Catalog as PNGs. All JPGs get copied outside of Assets.car. [UIImage imageNamed:] returns nil for JPG images unless ".jpg" extensions is provided as part of the image name.
  3. When minimum deployment target is iOS 8 Assets.car contains all images. Its size is 13MB. [UIImage imageNamed:] returns JPG images correctly even when not specifying ".jpg" extension. Images also load correctly when ".jpg" extension is included
  4. When minimum deployment target is iOS 9 Assets.car contains all images. Its size is 11.5MB. [UIImage imageNamed:] returns JPG images correctly even when not specifying ".jpg" extension. Images also load correctly when ".jpg" extension is included

I have used the image extractor tool suggested by Matt to extract images from these Assets. I was only able to export from archives for devices which are with Retina and I can confirm that all images had correct resolutions (i.e. only retina size, iPad specific images ignored). The tool, however, saved all of them in PNGs format and so the resulting size of the folder was always bigger then Assets.car.

What is most surprising is that the size of the folder was the same (39.4MB) for cases 3 and 4. Also, the images seem to be exactly the same. So, I really wonder what happens there because there is a difference of 2MB in the size of Assets.car for these cases.

To conclude, we are still not sure if such testing method can be used to accurately mimic the App Thinning behaviour. So, if anyone had a personal experience with this it would be awesome if they could share it.

However, assuming that exporting for specific device for AdHoc produces the same result as actual App Thinning performed by App Store we can conclude that:

  1. App thinning only kicks in when deployment target is iOS 7 or later
  2. App thinning for JPG images only works starting from a minimum deployment target of iOS 8
  3. [UIImage imageNamed:] returns JPG images correctly without providing ".jpg" extension only when JPG images are correctly processed through Asset Catalogs. Which, as mentioned earlier, only happens when minimum deployment target is iOS 8 or later
  4. [UIImage imageNamed:] always loads correct images if ".jpg" extensions is specified.

The last two conclusions seem to be irrelevant to this question, but I have found several conflicting opinions on Stack Overflow about how to load JPG images correctly with Asset Catalogs. Some people claimed that you can load them without providing ".jpg" extension whilst others complained that this approach doesn't work. I think 3 and 4 above explain in details what is happening in this case and why people get different results.



回答2:

Answer your own question. Archive the app. Export the app for the target device you're interested in:

Now look inside the exported app and see what resources it contains. An .ipa is just a .zip file by another name; it's easy to look inside it by changing the suffix. Now you know what resources an iPhone 6 Plus user will download from the App Store.



回答3:

After getting iPhone4s and iPhone 6SPlus archive, from a project with missing 3x images

then using the image extractor tool suggested by Matt,

deployment target iOS 7

here's the result: