Skip to content

Conversation

hellohuanlin
Copy link
Contributor

@hellohuanlin hellohuanlin commented Nov 7, 2022

Validate if any of the icons are still using flutter template icon when building IPA.

The basic idea is to parse the Contents.json file to get a map of (idiom, size, scale) => image_file_name, and then read the bytes of matching pairs of icon images, to check if any conflicts.

Note that flutter_gallery's icons are different from what's used in the template assets (so i had to flutter create a new project). This PR only checks the exact match. It is probably not worth the effort to check for similarity (e.g. machine learning stuff).

When fails the validation, We want to print out both (idiom, size, scale) and the file path. (idiom, size, scale) is helpful if developers want to edit icons in xcode; file path is helpful if they directly replace files in AppIcon.appiconset folder (personally i tend to do the latter, but editing in xcode has the benefit that xcode checks for icon size for you).

We want to print out each conflicting file, because it's possible that developer only updates the home screen icon file when they start developing the app, and forget about other icons later (I made that mistake sometimes).

In the future, we may also want to validate the image size of app icons. Xcode gives warning about the wrong size, but developers may directly replace images without using Xcode (me, for example).

List which issues are fixed by this PR. You must list at least one issue.

#97730

If you had to change anything in the flutter/tests repo, include a link to the migration guide as per the breaking change policy.

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
  • I signed the CLA.
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is test-exempt.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@flutter-dashboard flutter-dashboard bot added platform-ios iOS applications specifically tool Affects the "flutter" command-line tool. See also t: labels. labels Nov 7, 2022
@hellohuanlin hellohuanlin force-pushed the tools_validate_icons branch 4 times, most recently from 70d0d4d to 78dafcd Compare November 7, 2022 20:15
@hellohuanlin hellohuanlin marked this pull request as ready for review November 7, 2022 20:17
@hellohuanlin hellohuanlin requested review from leighajarett and removed request for leighajarett November 7, 2022 20:17
@hellohuanlin
Copy link
Contributor Author

CC @leighajarett for the output format

@leighajarett
Copy link
Contributor

Should we link to the documentation? For example:

You may want to replace the following template icons:
xxxxx
See documentation for more details: https://docs.flutter.dev/deployment/ios#add-an-app-icon

Otherwise LGTM!

Copy link
Member

@jmagman jmagman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to see the full output of flutter build ipa with this change.

The output looks really noisy, I suggest replacing the warnings with something that just says some default images were detected, and maybe listing just the (idiom, size, scale) on one line. We can link to docs that give more info if needed.

This warning is similar:

globals.printError('Action Required: You must set a build name and number in the pubspec.yaml '
'file version field before submitting to the App Store.');

We don't want the output to be a wall of text that scrolls out other useful information. Particularly this being a box, next to the validation also in a box you added to #113412.

@hellohuanlin
Copy link
Contributor Author

@leighajarett @jmagman how about reusing the existing box for App Settings, and shorten the output like this:

You may want to replace the following flutter template icon images under ios/Runner/Assets.xcassets/AppIcon.appiconset: 
[iphone 40x40 1@] [iphone 40x40 2@] [iphone 60x60 2@]

I'd like to keep BOTH path and idiom size scale, because people may either use finder (e.g. me), or update in xcode

@jmagman
Copy link
Member

jmagman commented Nov 9, 2022

I'd like to keep BOTH path and idiom size scale, because people may either use finder (e.g. me), or update in xcode

We can add that info to https://docs.flutter.dev/deployment/ios#add-an-app-icon then? The box seems huge compared to the rest of the output, which may have a lot more important information, the user may not be ready to change their icon. I'd rather add this as a single line to the validation box you added in the other PR, it seems spiritually the same as the other "You must set up the missing settings".

Paste the entire flutter build ipa output and we can see how dominant it is though.

@hellohuanlin
Copy link
Contributor Author

@jmagman @leighajarett does this look good?

No issue:
no issue

Missing settings:
missing setting

Template icons:
template icon

Missing settings + Template icons:
template icon + missing setting

@hellohuanlin hellohuanlin requested a review from jmagman November 10, 2022 20:35
@hellohuanlin hellohuanlin force-pushed the tools_validate_icons branch 2 times, most recently from c0c0533 to 58d88ce Compare November 10, 2022 23:44
Copy link
Member

@jmagman jmagman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor nits.

cc @InMatrix to follow up later: we could use some UXR polish for the changes the iOS team has recently made to add additional info during app publication.


testUsingContext('returns project app icon dirname', () async {
final BuildableIOSApp iosApp = BuildableIOSApp(
IosProject.fromFlutter(FlutterProject.fromDirectory(globals.fs.currentDirectory)),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's extra 2 spaces in a few places in this test file and template_test.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm, i was probably using the wrong IntelliJ settings. It's odd that the linter doesn't catch it. Filed an issue here

@hellohuanlin
Copy link
Contributor Author

@InMatrix Just double check if i answered your question before we land this change. Thanks!

@InMatrix
Copy link

Yes, you did. I think the message is fine, since it seems to be a mild warning the user doesn't have to address right away.

@hellohuanlin
Copy link
Contributor Author

hellohuanlin commented Nov 16, 2022

@InMatrix Thanks for the input. Yes it is more mild than the error output "failed to register bundle identifier" (which is a separate error). In fact, even if developers use the template icons, they can still create a valid IPA (e.g. distribute with TestFlight). Though if they want to submit for app review and release it on the app store, they will want to change their icons

@InMatrix
Copy link

Is the issue going to be pretty obvious when they install the app to their device / simulator?

@hellohuanlin
Copy link
Contributor Author

hellohuanlin commented Nov 16, 2022

Yep. Though it's possible that they only update the home screen app icon and forget about the rest (sometimes do that personally). There are many other icons (such as the ones used in push notification, iOS settings page, etc) that needs update.

BTW there's a potential project that allows developers to just provide a single large icon in flutter, and Flutter tools will just scale it into different sizes for different platforms.

@InMatrix
Copy link

BTW there's a potential project that allows developers to just provide a single large icon in flutter, and Flutter tools will just scale it into different sizes for different platforms.

This sounds very useful. How does Xcode handles this? I remember seeing an asset manager GUI.

@hellohuanlin
Copy link
Contributor Author

hellohuanlin commented Nov 16, 2022

How does Xcode handles this? I remember seeing an asset manager GUI.

With Xcode you have to manually provide like 20 different sizes The GUI you are seeing is helpful that you can drag and drop the files, and Xcode will automatically update JSON for you if you used a different file name.

@hellohuanlin
Copy link
Contributor Author

@jmagman friendly ping

@jmagman
Copy link
Member

jmagman commented Nov 16, 2022

With Xcode you have to manually provide like 20 different sizes

That's not true in Xcode 14, you can just supply one large image: https://useyourloaf.com/blog/xcode-14-single-size-app-icon/

@hellohuanlin hellohuanlin added the autosubmit Merge PR when tree becomes green via auto submit App label Nov 16, 2022
@auto-submit auto-submit bot merged commit dcae424 into flutter:master Nov 16, 2022
@hellohuanlin
Copy link
Contributor Author

Wow nice to see Xcode finally supports single icon. The original idea behind multiple icons is that designers may want to show less details or slight variation in lower resolution, which seems to be a valid argument. But in practice 99% of people just resize the icons

engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Nov 16, 2022
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Nov 16, 2022
* 338841a Revert "Revert "Revert "Scribble mixin (#104128)" (#114647)" (#114698)" (flutter/flutter#115146)

* 229b39e [flutter_tools] Fix so that the value set by `--dart-define-from-file` can be passed to Gradle (flutter/flutter#114297)

* 3895786 Revert "Load assets in flutter_test without turning event loop. (#115123)" (flutter/flutter#115156)

* a6e3ec8 mark firebase test lab test flaky because of upstream infra issues (flutter/flutter#115178)

* 8d808b5 Roll Flutter Engine from 7326e5b3354b to 329900fc85d6 (7 revisions) (flutter/flutter#115185)

* 10dc566 Add drone_dimensions to devicelab_build_test. (flutter/flutter#115183)

* 0a5b531 b6e45ae35 extend const_finder to allow skipping particular classes (flutter/engine#37257) (flutter/flutter#115189)

* 0e9ee36 [web] Add `--local-web-sdk` flag and use precompiled platform kernels for dart2js and ddc (flutter/flutter#114639)

* 9e314ff Make FutureBuilder handle SynchronousFuture correctly, reland SynchronousFuture usage in test assets (flutter/flutter#115173)

* 673fd97 17d428e68 Roll Dart SDK from 2b6909ba35e5 to 190040da0bc8 (2 revisions) (flutter/engine#37536) (flutter/flutter#115191)

* edcdb00 Roll Flutter Engine from 17d428e688a9 to 38c4f1d78630 (2 revisions) (flutter/flutter#115192)

* 8772768 Roll Flutter Engine from 38c4f1d78630 to 1f0dd2c0f5bb (2 revisions) (flutter/flutter#115194)

* 6ec2bd0 M3 Segmented Button widget (flutter/flutter#113723)

* b7b6758 f3dfdf4cc Roll Skia from 3bbdd5bc54f2 to a727f7ac8a98 (1 revision) (flutter/engine#37544) (flutter/flutter#115196)

* 94e753d Roll Flutter Engine from f3dfdf4ccf38 to e3b3950f0fab (3 revisions) (flutter/flutter#115200)

* 61e927d e63c9443b [Impeller] Include the new primitive type in the pipeline hash (flutter/engine#37546) (flutter/flutter#115201)

* c05d887 Roll Flutter Engine from e63c9443bc04 to 9500d8c4a4ce (2 revisions) (flutter/flutter#115212)

* 1f82985 1c8c23754 Roll Fuchsia Linux SDK from xDY5B0-NZzq2idRNU... to IE4logHFoa8ZZQAw3... (flutter/engine#37554) (flutter/flutter#115214)

* 61b3d5a a0d8cd68c Add a limit to the Gaussian blur downsampling curve (flutter/engine#37550) (flutter/flutter#115217)

* 2bf64aa fd56b7ee8 Roll Fuchsia Mac SDK from j3vspnGJcQvIfsXXu... to iPqmEVwAbmYwPlh5a... (flutter/engine#37557) (flutter/flutter#115218)

* 53ab17d Roll Flutter Engine from fd56b7ee87f0 to 1ae285897eae (2 revisions) (flutter/flutter#115220)

* 4488166 d4e2188e9 [Impeller] Fix DrawPaint regression (flutter/engine#37561) (flutter/flutter#115222)

* bf906e6 2bdeaf7d7 Fix inertia cancel event on macOS Ventura (flutter/engine#37067) (flutter/flutter#115226)

* 1a19409 06c390470 Roll Fuchsia Mac SDK from iPqmEVwAbmYwPlh5a... to N-iOLgSVYYh_AfC7Q... (flutter/engine#37566) (flutter/flutter#115236)

* 1a460cf 54795869b Roll Skia from c0f87aed019b to 38edf6197aa9 (1 revision) (flutter/engine#37567) (flutter/flutter#115239)

* 8230ef5 Revert "[web] Add `--local-web-sdk` flag and use precompiled platform kernels for dart2js and ddc (#114639)" (flutter/flutter#115242)

* 8994920 7269f2f91 Roll Skia from 38edf6197aa9 to 0f515e97d535 (1 revision) (flutter/engine#37571) (flutter/flutter#115244)

* 7ac00f7 40b071c75 Roll Fuchsia Linux SDK from IE4logHFoa8ZZQAw3... to AE_mBWzdDqUvn4r1N... (flutter/engine#37572) (flutter/flutter#115247)

* fa94a3c b63e6cf55 [Impeller] dont include sampler offset in float offset (flutter/engine#37573) (flutter/flutter#115248)

* cb224d1 b7567b92c Roll Fuchsia Mac SDK from N-iOLgSVYYh_AfC7Q... to WYzUv6RnWjJpAiqYp... (flutter/engine#37575) (flutter/flutter#115252)

* d587fe4 a1b5507e5 Add playground to demonstrate mask blur problems (flutter/engine#37574) (flutter/flutter#115260)

* f5205b1 6f7447efa Roll Fuchsia Linux SDK from AE_mBWzdDqUvn4r1N... to dRHIZSishiboEHMdw... (flutter/engine#37577) (flutter/flutter#115266)

* 2c4051f b077c1c46 Roll Dart SDK from 996fe4d7ea9a to 45b7433f9015 (1 revision) (flutter/engine#37578) (flutter/flutter#115271)

* 0b5f3fd 743cec5ba Roll Skia from 0f515e97d535 to b2109e6bbbe7 (1 revision) (flutter/engine#37580) (flutter/flutter#115279)

* 80bcc3a 035313ae2 Roll Dart SDK from 45b7433f9015 to 7cbcf48157cf (1 revision) (flutter/engine#37582) (flutter/flutter#115281)

* fdd2fe4 036f8ea88 Roll Fuchsia Mac SDK from WYzUv6RnWjJpAiqYp... to XvXKIR_SSUfSyGwxe... (flutter/engine#37583) (flutter/flutter#115293)

* 436fb4c c290de693 Roll Skia from b2109e6bbbe7 to 2ad14e25f6f7 (7 revisions) (flutter/engine#37585) (flutter/flutter#115294)

* 2449907 Fixed the color curve issue (flutter/flutter#115188)

* 9359c25 1a79e8686 [macOS] Move to new update semantics embedder API (flutter/engine#37404) (flutter/flutter#115301)

* 59e1edc Roll Flutter Engine from 1a79e8686036 to 8c73ffff5b6f (2 revisions) (flutter/flutter#115302)

* f2ec1c4 42bc762b6 Roll Skia from 2ad14e25f6f7 to a434f9b69660 (11 revisions) (flutter/engine#37591) (flutter/flutter#115304)

* ea4e11d Fix test in preparation of the Dart VM dropping support for language versions < 2.12.0 (flutter/flutter#115176)

* a0a7b3a 14ecaeb91 [Impeller] error earlier on uint types (flutter/engine#37593) (flutter/flutter#115308)

* 2e51077 Do not strip architecture suffixes from host local-engine (flutter/flutter#115320)

* 8e3ea14 Incorrect rendering of `SnapshotWidget` (flutter/flutter#114400)

* 59ecc75 [flutter_tools] add uint compilation test (flutter/flutter#115317)

* 1aeb172 Roll Flutter Engine from 14ecaeb915e0 to 78ae2414003a (10 revisions) (flutter/flutter#115335)

* e391812 9dedab305 Roll Skia from b474a43dcc34 to 2cebc1ce363c (2 revisions) (flutter/engine#37612) (flutter/flutter#115338)

* 9d64a0f 31ee28684 Combine results of all the test batches. (flutter/engine#37610) (flutter/flutter#115340)

* e9c6212 [Impeller] Add shader include with FlutterFragCoord for use by FragmentProgram (flutter/flutter#114214)

* a27bb3c 06bd5a816 Roll Skia from 2cebc1ce363c to d758b240cad0 (1 revision) (flutter/engine#37614) (flutter/flutter#115341)

* abbffcc c6a513ecd Roll Fuchsia Mac SDK from XvXKIR_SSUfSyGwxe... to 32kfSm94FGtJJeUjg... (flutter/engine#37615) (flutter/flutter#115344)

* 0f56ed1 f01de9f6b Roll Skia from d758b240cad0 to 24523449b1b3 (1 revision) (flutter/engine#37616) (flutter/flutter#115346)

* 25d74e6 0b338ed86 Roll Dart SDK from 6f5478a58387 to 987faaf6d1d4 (2 revisions) (flutter/engine#37617) (flutter/flutter#115352)

* 1f28f99 721fbe111 Roll Skia from 24523449b1b3 to 4d519a8ba97a (3 revisions) (flutter/engine#37618) (flutter/flutter#115354)

* c37f255 [tools] Fix plugin_ffi template lint violation (flutter/flutter#115356)

* 3c3f136 b4fd07fa4 Roll Dart SDK from 987faaf6d1d4 to 42f87c0521f8 (1 revision) (flutter/engine#37619) (flutter/flutter#115362)

* 2ed5283 58495f077 [Impeller] Add debug names to additional VK objects (flutter/engine#37592) (flutter/flutter#115363)

* afafde6 7f74f34a4 Roll Fuchsia Linux SDK from B0OuUvWOY24LI1WoF... to agStiOtzmc9Fmw6gc... (flutter/engine#37621) (flutter/flutter#115365)

* af2ec91 Roll Plugins from 3ca3410 to e500884 (10 revisions) (flutter/flutter#115366)

* 3a298d0 Roll Flutter Engine from 7f74f34a408a to eead7b0d8656 (2 revisions) (flutter/flutter#115369)

* acf01eb 905862722 [dart] Run generate_sdk_version_file.py to be compatible with dart ch… (flutter/engine#37624) (flutter/flutter#115372)

* 95ace11 Include initial offset when using PlatformViewSurface (flutter/flutter#114103)

* 39a9ed5 Updated tokens to v0.141 (flutter/flutter#115298)

* ba47c29 216702f3d Roll Skia from 1991515dd191 to 826b3ea577f3 (4 revisions) (flutter/engine#37628) (flutter/flutter#115377)

* 2d77ac5 49f8326df Roll Skia from 826b3ea577f3 to 02e2101a75f7 (4 revisions) (flutter/engine#37631) (flutter/flutter#115385)

* 136b46b Hint text semantics to be excluded in a11y read out if textfield in not empty and label text is provided  (flutter/flutter#115010)

* 700de09 Change button and label text to sentence case for Material 3 (flutter/flutter#115187)

* b2b8391 Roll Flutter Engine from 49f8326df6f0 to 84cb1f833ac4 (3 revisions) (flutter/flutter#115387)

* 2c44f4a Remove dev branch reference from build ios-frameworks error (flutter/flutter#115166)

* 792eefe Roll Flutter Engine from 84cb1f833ac4 to af6e47f1d5c4 (4 revisions) (flutter/flutter#115395)

* 341a9b1 6d41b2ffb update Scene.toImageSync test to use proper bounds in the request (flutter/engine#37638) (flutter/flutter#115398)

* e66183d Bump github/codeql-action from 2.1.25 to 2.1.32 (flutter/flutter#115394)

* d0e5b2f Add a way to customize padding in BottomAppBar  (flutter/flutter#115175)

* 349d648 baad8f2c5 Roll Skia from 02e2101a75f7 to cfb6de45f39b (7 revisions) (flutter/engine#37640) (flutter/flutter#115399)

* 7d2b011 Fix logic error in `markNeedsPaint` (flutter/flutter#112735)

* 93c4b09 Add `RestorableEnumN<T>` and `RestorableEnum<T>` to restorable primitive types (flutter/flutter#115050)

* 2c1536a Create a main alias for master channel. (flutter/flutter#115388)

* bbb349b Roll Flutter Engine from baad8f2c553b to e56ed93faab5 (6 revisions) (flutter/flutter#115406)

* bacd770 c062f7ea7 Roll Skia from cfb6de45f39b to cdf8348e6fba (4 revisions) (flutter/engine#37649) (flutter/flutter#115407)

* 27ff6a5 Roll Flutter Engine from c062f7ea7195 to 03e9a97f8abe (3 revisions) (flutter/flutter#115410)

* 58728c6 Roll Flutter Engine from 03e9a97f8abe to 21a572e4e4d0 (2 revisions) (flutter/flutter#115411)

* e54c8a8e2 3e15c1925 Roll Dart SDK from 7163c9627d98 to c3f1b3642181 (2 revisions) (flutter/engine#37664) (flutter/flutter#115417)

* 484e09e Roll Flutter Engine from 3e15c192560f to 0241f18cbedf (2 revisions) (flutter/flutter#115423)

* 4fdaf7a Revert "Roll Flutter Engine from 3e15c192560f to 0241f18cbedf (2 revisions) (#115423)" (flutter/flutter#115456)

* 4301731 Make Flutter Driver actively wait for runnable isolate (flutter/flutter#113969)

* c940f31 Marks Mac_ios flavors_test_ios to be unflaky (flutter/flutter#115458)

* 243a830 Roll Flutter Engine from 3e15c192560f to 223e1f092dd5 (4 revisions) (flutter/flutter#115463)

* d7454d5 removing default values for [reporter] and [timeout] in flutter test (flutter/flutter#115160)

* a2233ea [flutter_tools] remove all body_might_complete_normally_catch_error ignores (flutter/flutter#115184)

* b5345ff d72164776 Revert "[Impeller] Refactor color source resolution to use explicit factory types (#37656)" (flutter/engine#37673) (flutter/flutter#115467)

* dcae424 [tools]build ipa validate template icon files (flutter/flutter#114841)
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 17, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
engine-flutter-autoroll added a commit to engine-flutter-autoroll/plugins that referenced this pull request Nov 18, 2022
shogohida pushed a commit to shogohida/flutter that referenced this pull request Dec 7, 2022
* [tools]build ipa validate template icon files

* use the same box for both validations, and added some unit test, and some nits

* add unit test for templateImageDirectory

* use fs.path.join intead of raw path

* use the correct filesystem

* lint

* use absolute path for flutter_template_images

* fix rebase

* update indentation
gspencergoog pushed a commit to gspencergoog/flutter that referenced this pull request Jan 19, 2023
* [tools]build ipa validate template icon files

* use the same box for both validations, and added some unit test, and some nits

* add unit test for templateImageDirectory

* use fs.path.join intead of raw path

* use the correct filesystem

* lint

* use absolute path for flutter_template_images

* fix rebase

* update indentation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App platform-ios iOS applications specifically tool Affects the "flutter" command-line tool. See also t: labels.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants