From cf3535fdf2e7fe52b36aaa4b94a53525fd6640f4 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Mon, 8 Aug 2022 18:33:36 +0200 Subject: [PATCH] CMake: Add manual test for various iOS asset handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes: - setting a custom Info.plist - Bundling non-image assets - Bundling image assets using asset catalogs - Bundling app icons - Bundling a launch screen Projects added for both qmake and CMake. The executable uses testlib to check that non-image assets, icons and asset catalogs were successfully bundled upon deployment to a device. Task-number: QTBUG-104519 Change-Id: Iaab6112e31e1098dcd2548e18b58bed5b64e6f83 Reviewed-by: Jörg Bornemann --- .../AppIcon.appiconset/Contents.json | 98 ++++++++++++++++++ .../ios_assets/Assets.xcassets/Contents.json | 6 ++ .../Face.imageset/Contents.json | 23 ++++ .../Assets.xcassets/Face.imageset/Face-16.png | Bin 0 -> 173 bytes .../Assets.xcassets/Face.imageset/Face-32.png | Bin 0 -> 407 bytes .../Assets.xcassets/Face.imageset/Face-48.png | Bin 0 -> 750 bytes tests/manual/ios_assets/CMakeLists.txt | 92 ++++++++++++++++ .../ios_assets/CustomLaunchScreen.storyboard | 48 +++++++++ tests/manual/ios_assets/Info.ios.cmake.plist | 93 +++++++++++++++++ tests/manual/ios_assets/Info.ios.qmake.plist | 78 ++++++++++++++ .../ios_assets/appicon/AppIcon29x29.png | Bin 0 -> 340 bytes .../ios_assets/appicon/AppIcon29x29@2x.png | Bin 0 -> 992 bytes .../appicon/AppIcon29x29@2x~ipad.png | Bin 0 -> 992 bytes .../ios_assets/appicon/AppIcon29x29~ipad.png | Bin 0 -> 340 bytes .../ios_assets/appicon/AppIcon40x40@2x.png | Bin 0 -> 1444 bytes .../appicon/AppIcon40x40@2x~ipad.png | Bin 0 -> 1444 bytes .../ios_assets/appicon/AppIcon40x40~ipad.png | Bin 0 -> 585 bytes .../appicon/AppIcon50x50@2x~ipad.png | Bin 0 -> 1913 bytes .../ios_assets/appicon/AppIcon50x50~ipad.png | Bin 0 -> 794 bytes .../ios_assets/appicon/AppIcon57x57.png | Bin 0 -> 967 bytes .../ios_assets/appicon/AppIcon57x57@2x.png | Bin 0 -> 2200 bytes .../ios_assets/appicon/AppIcon60x60@2x.png | Bin 0 -> 2335 bytes .../appicon/AppIcon72x72@2x~ipad.png | Bin 0 -> 2897 bytes .../ios_assets/appicon/AppIcon72x72~ipad.png | Bin 0 -> 1301 bytes .../appicon/AppIcon76x76@2x~ipad.png | Bin 0 -> 3060 bytes .../ios_assets/appicon/AppIcon76x76~ipad.png | Bin 0 -> 1386 bytes tests/manual/ios_assets/foo.txt | 1 + tests/manual/ios_assets/ios_assets.pro | 48 +++++++++ tests/manual/ios_assets/main.cpp | 70 +++++++++++++ tests/manual/ios_assets/utils.mm | 18 ++++ 30 files changed, 575 insertions(+) create mode 100644 tests/manual/ios_assets/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 tests/manual/ios_assets/Assets.xcassets/Contents.json create mode 100644 tests/manual/ios_assets/Assets.xcassets/Face.imageset/Contents.json create mode 100644 tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-16.png create mode 100644 tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-32.png create mode 100644 tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-48.png create mode 100644 tests/manual/ios_assets/CMakeLists.txt create mode 100644 tests/manual/ios_assets/CustomLaunchScreen.storyboard create mode 100644 tests/manual/ios_assets/Info.ios.cmake.plist create mode 100644 tests/manual/ios_assets/Info.ios.qmake.plist create mode 100644 tests/manual/ios_assets/appicon/AppIcon29x29.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon29x29@2x.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon29x29@2x~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon29x29~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon40x40@2x.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon40x40@2x~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon40x40~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon50x50@2x~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon50x50~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon57x57.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon57x57@2x.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon60x60@2x.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon72x72@2x~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon72x72~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon76x76@2x~ipad.png create mode 100644 tests/manual/ios_assets/appicon/AppIcon76x76~ipad.png create mode 100644 tests/manual/ios_assets/foo.txt create mode 100644 tests/manual/ios_assets/ios_assets.pro create mode 100644 tests/manual/ios_assets/main.cpp create mode 100644 tests/manual/ios_assets/utils.mm diff --git a/tests/manual/ios_assets/Assets.xcassets/AppIcon.appiconset/Contents.json b/tests/manual/ios_assets/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..9221b9bb1a3 --- /dev/null +++ b/tests/manual/ios_assets/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/manual/ios_assets/Assets.xcassets/Contents.json b/tests/manual/ios_assets/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/tests/manual/ios_assets/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Contents.json b/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Contents.json new file mode 100644 index 00000000000..2108ce2651d --- /dev/null +++ b/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Face-16.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Face-32.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Face-48.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-16.png b/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-16.png new file mode 100644 index 0000000000000000000000000000000000000000..670beb4fbbc533f5fb2d204245002b7f43c1e03f GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAN<3X0LnI_w4{j7an83hx!2gMA zt4Yw(Z4GY6mAXQtxHB|LA`h^6i5Yeae%kZ@4l9Ggfpp_NjRz9>r;D;Mavbt-x_e2e zifh%ZPK^XMxkp?K+=c87OBopa7Y1Idc<3`@!jj_-0gNn-(d@f*S$@pzi&tP^s9&sd Vr*K1C(Uq8JzBL z1q|IF@-73zCm{6|q~H~h@r41V;0ML~)fh<6h# zcJnquei9>8!4F7~!Q<0MA3`&B!yL$*1tMA5A>!{DzJlq8@Sp}V|3bo8KwLpxpD7Az zKn^0h%~-(H)W(X!j6|qE+!&D)466isYR+Z&g_0&&*#4o&n=!mcOSA?I6$t5F46Oe! zlKl-v28~T1#uU!s002ovPDHLkV1gEL BnvMVf literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-48.png b/tests/manual/ios_assets/Assets.xcassets/Face.imageset/Face-48.png new file mode 100644 index 0000000000000000000000000000000000000000..f0783cd53375d33577b427234e68eaea1aa9627d GIT binary patch literal 750 zcmV%tm$FWoy) zco_Nq01wC(+$2esq9h2&Mu$%rw*j&9B*{9|lFg_hNvc*X>44ve4IE1C?Db2(U~x5A z@!j`TjS3xb9d#z@d;&liyok~PaacAuXSb1@t*@OCnsodSfC`7fe;HZEcnxp~;2lm$ zWuIZxOdwYPkMK|e(&VSJRRCppBUw{qKoLMO-b>bP5}-f;B^Z=|E#ZI)yq17X@|G+D zXvRIs8e!C^NEW~-j+&oPzdqu)cGL0(Y*GX#9&11XS=TH>YDMG9ofq!{*Ay5^L9U%1Y48QeQXDm7a=E5 z84!I(AEh@PNc$OPWVv$zB$T#|OuN5z*JLR`eAhpQ;(X<1?IJ8khSxH7y*&e;vZEzs{bu?OtC{EdT%j07*qoM6N<$f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/manual/ios_assets/Info.ios.cmake.plist b/tests/manual/ios_assets/Info.ios.cmake.plist new file mode 100644 index 00000000000..ebbb6d93efa --- /dev/null +++ b/tests/manual/ios_assets/Info.ios.cmake.plist @@ -0,0 +1,93 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundlePackageType + APPL + + CFBundleName + $(PRODUCT_NAME) + + CFBundleDisplayName + $(PRODUCT_NAME) + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + + CFBundleExecutable + $(EXECUTABLE_NAME) + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + CFBundleShortVersionString + $(MARKETING_VERSION) + + NSHumanReadableCopyright + + + CFBundleIconFile + + + CFBundleDevelopmentRegion + English + + LSRequiresIPhoneOS + + + UILaunchStoryboardName + CustomLaunchScreen.storyboard + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon29x29.png + AppIcon29x29@2x.png + AppIcon40x40@2x.png + AppIcon57x57.png + AppIcon57x57@2x.png + AppIcon60x60@2x.png + + + + CFBundleIcons~ipad + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon29x29.png + AppIcon29x29@2x.png + AppIcon40x40@2x.png + AppIcon57x57.png + AppIcon57x57@2x.png + AppIcon60x60@2x.png + AppIcon29x29~ipad.png + AppIcon29x29@2x~ipad.png + AppIcon40x40~ipad.png + AppIcon40x40@2x~ipad.png + AppIcon50x50~ipad.png + AppIcon50x50@2x~ipad.png + AppIcon72x72~ipad.png + AppIcon72x72@2x~ipad.png + AppIcon76x76~ipad.png + AppIcon76x76@2x~ipad.png + + + + + diff --git a/tests/manual/ios_assets/Info.ios.qmake.plist b/tests/manual/ios_assets/Info.ios.qmake.plist new file mode 100644 index 00000000000..e97150e47b5 --- /dev/null +++ b/tests/manual/ios_assets/Info.ios.qmake.plist @@ -0,0 +1,78 @@ + + + + + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + ${ASSETCATALOG_COMPILER_APPICON_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${QMAKE_SHORT_VERSION} + CFBundleSignature + ${QMAKE_PKGINFO_TYPEINFO} + CFBundleVersion + ${QMAKE_FULL_VERSION} + LSRequiresIPhoneOS + + MinimumOSVersion + ${IPHONEOS_DEPLOYMENT_TARGET} + UILaunchStoryboardName + CustomLaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon29x29.png + AppIcon29x29@2x.png + AppIcon40x40@2x.png + AppIcon57x57.png + AppIcon57x57@2x.png + AppIcon60x60@2x.png + + + + CFBundleIcons~ipad + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon29x29.png + AppIcon29x29@2x.png + AppIcon40x40@2x.png + AppIcon57x57.png + AppIcon57x57@2x.png + AppIcon60x60@2x.png + AppIcon29x29~ipad.png + AppIcon29x29@2x~ipad.png + AppIcon40x40~ipad.png + AppIcon40x40@2x~ipad.png + AppIcon50x50~ipad.png + AppIcon50x50@2x~ipad.png + AppIcon72x72~ipad.png + AppIcon72x72@2x~ipad.png + AppIcon76x76~ipad.png + AppIcon76x76@2x~ipad.png + + + + + diff --git a/tests/manual/ios_assets/appicon/AppIcon29x29.png b/tests/manual/ios_assets/appicon/AppIcon29x29.png new file mode 100644 index 0000000000000000000000000000000000000000..f220ad51a3dc79b046d9fe07940695d378585a2a GIT binary patch literal 340 zcmV-a0jvIrP)Z~ zj}I^qFZ*s$>-3x0Wv{a`Feun-GcYjB$B_NU!mt*~yvN4y09Ez|Lj#h57Z|FLW$!UO z{{R0ovW4YHvJ7|s|2Jg-Dfxe$fguJYatkgikN{%c)~N+ikHKO$7+|vBz^uCr9AJU3 z5FI?dP+6^FBpbIgFc^X8*9=fu2CRXDUzTkjnEL~}tY;ON`xLuuTnd=`8@sG?JwAJx zPGZQ4V!GKe3dAsniXIn$#tT&TA6PS|AXLvIh{3C2rm9xny<&a!{q#J~`~2Q>-t(O2 z58^*RTu1$%tuM|@07vTFRUiB|el&2f$btH#Z}@Xu=C)Vj2tavo&jn2OSr$VKCjy;E(b!*mt8x~d2r2W)_KCv~GPFTw7}^7^`e>etAtn*>#|*Q1G7POH z-R>qFO$HX4cYg=2Ff@mktkBt;o) z4)ww%6J0^2#^)s3Dt#UXO|-(y2esbl(H~`21z)~OfySp3Mm6ToiB*ni4{nW5H(b$} zw{x3N98CoV}W zz!SMtL-r4fwkedK5*>_XzibeY72Z0$@w}%L@|#1oCKS1c$&%6`C+@Q1U8<{3cvQkXTNDcjCcLp&fkCZ?0^s{TLH*B235@icDIC~?} ziwS1-`0iB4frNgOJmX-KwQRGxn9)wgEfOk(Tp$%{D{d+Y`R-yEp$+mOeTaqP1nL#`}_^d=oR z@EA;LjXF2I9|yV3kzn7tIPmmcW#sC)54h#!(`J3>uPZblrG6YU;^~D3Fd?U``i(6c zs|u$8q-`A@-(-5ecD8z*Tn`<)mU(!ndGo5`yL0C)Teth%_1XXbp#K8Q-a!|R4AQv( O0000xny<&a!{q#J~`~2Q>-t(O2 z58^*RTu1$%tuM|@07vTFRUiB|el&2f$btH#Z}@Xu=C)Vj2tavo&jn2OSr$VKCjy;E(b!*mt8x~d2r2W)_KCv~GPFTw7}^7^`e>etAtn*>#|*Q1G7POH z-R>qFO$HX4cYg=2Ff@mktkBt;o) z4)ww%6J0^2#^)s3Dt#UXO|-(y2esbl(H~`21z)~OfySp3Mm6ToiB*ni4{nW5H(b$} zw{x3N98CoV}W zz!SMtL-r4fwkedK5*>_XzibeY72Z0$@w}%L@|#1oCKS1c$&%6`C+@Q1U8<{3cvQkXTNDcjCcLp&fkCZ?0^s{TLH*B235@icDIC~?} ziwS1-`0iB4frNgOJmX-KwQRGxn9)wgEfOk(Tp$%{D{d+Y`R-yEp$+mOeTaqP1nL#`}_^d=oR z@EA;LjXF2I9|yV3kzn7tIPmmcW#sC)54h#!(`J3>uPZblrG6YU;^~D3Fd?U``i(6c zs|u$8q-`A@-(-5ecD8z*Tn`<)mU(!ndGo5`yL0C)Teth%_1XXbp#K8Q-a!|R4AQv( O0000Z~ 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 JCgv$zwIEI zzT5Mcs>2qaUzGx+=Ds(#9S~FQ-#Nj5f%!pp0B!0teeS!Bk&@Z2yoTz6xN~yI(?G7a zXP@I}V2ro;zy827Da73x9EX&XyM2D@8gB@>!a8Od@PHKZ6_BM2iyw-(uew2bXa2N# zg|hd1?h=TrkwNl+92Mj}V5$0D_60tZLHYq-sf1J7zK@aw@iZH2rD%vUOJ0T|+gV3-DE z9WccT=?+GvQn>_pSOc;V_?s2d)3oU93gO$p4QP5EX(iS3WtdO%|TI#XTUOnox1Fn|sj8}qFZSo0_re}-8Wst{# zRZ8^?t>>KpERaDKTMib|NFqLAwHneHj4~Od!U?H<0Zzq~+13nG%>^~%fB_jEX$09F z_{2Q62XqVSX}%gcUmDiV1jfn3)O_F(bI2bDv@5Y^98I#u!9ob(?f~qNLnNyX#>gT&1L98Go*BCbK8pA(5nzn$^JW9BD{UTRoc+P{BcPdoGI@U+fC1+$Q|)m9 zGLzX1#2mGUcy0xT`s-!6q7cUS_M2BcI5&8>_9QUWr~wSTdJ$fDY9uKGkt5J+Vj(8nF1ndg)-Zk8;E zlj*=+9z`nZW2Y%BYmDg%Udn%d&a4^JCQleQcGQT+9~(C4{--3V_1Zguq$A4A-6X(R zB$_58CFw31r1o|od~K5$(*Y*xBsx!A2}G`M0wWh-K%G{~_CP8Sz9dwHdpy96=QNYg z#Yuo8H?->D`G){9Pid#o_a*}jJQD(=tP8*mC-rmnqO=`A`sdo2`hsQvy`^Ul+tS9d z?f}lG^d9C=UjY6ruTt0-X=?sz03^Rwt3;fc91Rfpirr%dscEfl;Vo7ztPYAenUe^> zHG4%9AfjT3H*uCSrOZ~p=!qC_v2m*Xttje@Tk0!(j;y?5x25;O7ZWq;eP!Qof~^Wg zF|+QihG|H?H)mCG{p#@?-??OBuVxKhJw6G(^ps`Ux)nE@vW-SmtMvAlw+uHqeAhtL z`An;dUHnXIyS>rqJoAX!i1h05?xN{EqAi3=`#oQ(WvTjq7F6#l$bRq-?OVjhBqVq2 zIdtkf`*pLsP54K`;|^8j;x8o^A-{jfuOR;igwS)ypIcwx00000NkvXXu0mjfKBRvO literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon50x50~ipad.png b/tests/manual/ios_assets/appicon/AppIcon50x50~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7b8edc4fd05872bf09463a44b30942501d78e2 GIT binary patch literal 794 zcmV+#1LgdQP){iHPh1 z#{V{KflV&r8$?9>lUZv={IQ%C5$Pc8=o}6i#taBIpVU5tTQ+1ni$p}^IdkP4n?yw9 z9V36p8D<&YWN4rl(uUiNMl=!7C?X;?><|&mBbgNSLN>DBeBGPzgq|=|4@n|k#u_Uh zp#clxchTwK+yq81baCEXE$55{sb!^OJf;DqJu8ptXaiZsZQJQz5d|V5txqiJ5Qaa9 zgb}bIpGeVOx|{}ubQ5RaZZmyrl?sX#^27{^^JLD-OK$MQ??W%+$!BEEN zDdvDIpgD--_2k}1U(f#KD;na$l4A{|8P<@Hre3G&lD;baIvLh_iNtt(A)K`kU6H&{ zi)8AoND;Y)QU!%UB$w4nf5z}$RoNZNTSL3=Ca2|-ul;AIU%W&F-7?LrFx4)OF{!7L zhXxxzHHtW?l1{lYiEXC#Wkq^w@{FX!abx0EDdLq&eU(C5!>H_ga{`qA7&wA03Fju%WM!^m!s|{cZy;j=)vb&#WwQLDt=1yJ^`M z4fA~cj@KVM+`xpK!iwXiThc;+6wiP|JW#vXtwNc2z&FUhi*NO($_^g8^!h*e?df0s Y048N!p*DsTdjJ3c07*qoM6N<$f-<~%9smFU literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon57x57.png b/tests/manual/ios_assets/appicon/AppIcon57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..5d558bbb08a482a1daa38c3ff0147bb63dd9f920 GIT binary patch literal 967 zcmV;&133JNP)aPjk-w|L&bT z=bV{?{MW(rLw0pPJ6X4Lexd>3n3`Adu-D{oA3E?G>E*88ko9i>M%vbj`aAdAZk#Py z77Gk4cJ)O5yAnu0@kI4CebN^a&W0z?$3jL^&^kJc`arHL47ms5tF`;_APZjkCnT8< z?>q_>h2xP7`!fW&1vZ8WV8Z|s{??LTLxG5hl)w6NR*U6tEI;S@!{&jEcWTJS2y#V4 zq!gfko9S+Q4T!zq+2km)gGpC1)7>H>;$UsnQ1kO56R@R36M0KSL{7oaLFDH|-xU!N zH#EvB)_L63*sn=@Dmfl=4RKEb$a|4|WlpEzm<$yjV>|Oin*P+*1e4zws_x1E|`avZgqMWnD-A?q_^(P$=fNaO8<2NpSpFEpBTb1wpq5q`JG*D2OW z-eixSyl#j2jbyla4vPRAL7=8-YT%4lI+m|R)$rWUI!=Ka~s6Bc^F&fQ8@RDb+ zKk~jZCg4k@j908&X8E5c@f3L`e`-Fz0+s$`F)221q!XO)ea?V-WL z2D4ou?(92d{a;^B1QxdT*n@QxI)KRZk4uhKRUX>5XfQy=m0tCIuHzXIY7!-Gz1{m>(^<27 p^~^CzBPT7$KhgT!cjNyP`4rtU-h>78^b-I8002ovPDHLkV1kHY&r<*Z literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon57x57@2x.png b/tests/manual/ios_assets/appicon/AppIcon57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea14c9c0b95cf5e29e6ac024b89d23eb1b2ddc3a GIT binary patch literal 2200 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 FV1k1UO2GgC literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon72x72@2x~ipad.png b/tests/manual/ios_assets/appicon/AppIcon72x72@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..cb988891ffead32addf7c76cc1f4cdc7f664050f GIT binary patch literal 2897 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 literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon72x72~ipad.png b/tests/manual/ios_assets/appicon/AppIcon72x72~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..a0072bcfa1707f432fc8674763ec5801e13bc0be GIT binary patch literal 1301 zcmV+w1?u{VP)<18tmf8cC>8Xwn$8(X@xtgpV|*QS%X#GETtYBOS3q z%x0rWvK-%|&KSy&QI3=E2b7gEfJXQtOk5UjANIlC-Tz${^FtpzpYA>P?C<~I`#Ez|3TF$0HZe4$?EpXxe-9XyDk2K z+7=o>pZ%lOBU(R+12ejhe$}h>jQK;403Gt@yX4WD@xL(fskcWf|_DrrhR+vOahFH z-S@P1Vd~g-&N?PFQLsz}>db%%?e=lD-IEL5HYO0jP~?~%4@P%D0s0sQ-LwyXg#laF z1QF?a{r!3f2mrovC@c`&tO=?Q$LRFJ{ZJspOK{D(nhYyj@2%4l<7Cf(H#I@8!F$f} zSx7jtqc>qzhvEv17ea`saMGc=5sm(Y2I!ogfq%PZW9@si&^bR2ON0=j2wXd3alk!5 z)8VtO*J~I7Fxi!V>L67JA+q3%D@P22<6fZp0L)hRP~W+9MU~rp6f9_L%GD9y6+YYH z6)(_-u-cb1A2r(ltZt9n!^{LVdx8=P{L^Pxd>sm4+TyOugHjJrEo3SPmuKx0LI}~A zpEYr%95prYf(NJ=K2?BTCbV7knuF=pCWEFzt-^RBx>gnFZK#$(@$^?EvuwDn0+m6r z1iEV=O=Ua{uB+D0z#Iv55pq<5*vV39$y;U|T$ z1-AJJpGz`m8>~`QA47+$Ql2f6=nfh5mys0L`k`@OX#TFZcC@w;uwJ{+sxlDb zmcp!y6XRl^i0;=XEF{pNgK_eAoC{-YiW)K(Vj8qM-ws=QTdTZ5o1ph)RWWKC55t=M z>hsDC=y$8j<6Frv{F)z}G9#?@Rj}8`!IS5^ZSwQ=u-tbGQJ)B*WxhE#vVj%dH8nTW zfGLeWIJ*ZzKxy}FmUWR1!V6Ue$mvYr@hZPM$U|lzDo?`^Ix8mWK{x$|pRH)iQWFr6 zxkV}-tjCte0VEviL6==OHyA({o1I&_>u|-v@^$mZ_5xstrM+i;f79wDyu>v5K*s~z zL|k0^Vq_P@m^5q0od>=f>1?R{aznwYqLN*wS|45e{C_|X>-z9tmK9iGBx~Di00000 LNkvXXu0mjf=e257 literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/appicon/AppIcon76x76@2x~ipad.png b/tests/manual/ios_assets/appicon/AppIcon76x76@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa1d4729a6225c7e7f7d5a91ae642eba67de82e GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/tests/manual/ios_assets/foo.txt b/tests/manual/ios_assets/foo.txt new file mode 100644 index 00000000000..ce013625030 --- /dev/null +++ b/tests/manual/ios_assets/foo.txt @@ -0,0 +1 @@ +hello diff --git a/tests/manual/ios_assets/ios_assets.pro b/tests/manual/ios_assets/ios_assets.pro new file mode 100644 index 00000000000..a6a610dcd8d --- /dev/null +++ b/tests/manual/ios_assets/ios_assets.pro @@ -0,0 +1,48 @@ +TEMPLATE = app +SOURCES += main.cpp +QT += core gui testlib +CONFIG += app_bundle +TARGET = tst_manual_ios_assets + +# Custom Info.plist +ios { + QMAKE_INFO_PLIST = Info.ios.qmake.plist +} + +# Custom resources +textFiles.files = $$files(*.txt) +# On iOS no 'Resources' prefix is needed because iOS app bundles are shallow, +# so the final location of the text file will be +# tst_manual_ios_assets.app/textFiles/foo.txt +# Specifying a Resources prefix actually causes code signing error for some reason. +# On macOS the location will be +# tst_manual_ios_assets.app/Contents/Resources/textFiles/foo.txt +ios { + textFiles.path = textFiles +} +macos { + textFiles.path = Contents/Resources/textFiles +} +QMAKE_BUNDLE_DATA += textFiles + +# App icons +ios { + ios_icon.files = $$files($$PWD/appicon/AppIcon*.png) + QMAKE_BUNDLE_DATA += ios_icon +} + +# Asset catalog with images +ios { + # The asset catalog needs to have an empty AppIcon.appiconset, otherwise Xcode refuses + # to compile the asset catalog. + QMAKE_ASSET_CATALOGS += Assets.xcassets + SOURCES += utils.mm + LIBS += -framework UIKit +} + +# Set custom launch screen +ios { + # Underneath, this uses QMAKE_BUNDLE_DATA, prevents the default launch screen from being set + # and bundles the custom one. + QMAKE_IOS_LAUNCH_SCREEN = $$PWD/CustomLaunchScreen.storyboard +} diff --git a/tests/manual/ios_assets/main.cpp b/tests/manual/ios_assets/main.cpp new file mode 100644 index 00000000000..020f3f940be --- /dev/null +++ b/tests/manual/ios_assets/main.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include + +#ifdef DEBUG_APP_DATA_LOCATION + #include +#endif + +class AssetsIos : public QObject +{ + Q_OBJECT +private slots: + void bundledTextFiles(); + void bundledAppIcons(); + void bundledImageInAssetCatalog(); +}; + +void AssetsIos::bundledTextFiles() +{ +#ifdef DEBUG_APP_DATA_LOCATION + auto paths = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); + qDebug() << paths; + + for (const QString& path: paths) { + QDir oneDir = QDir(path); + qDebug() << "path" << path << "entries" << oneDir.entryList(); + } +#endif + + /* + AppDataLocation returns the following 3 paths on iOS + /var/mobile/Containers/Data/Application/uuid/Library/Application Support/tst_manual_ios_assets + /Library/Application Support/tst_manual_ios_assets + /private/var/containers/Bundle/Application//tst_manual_ios_assets.app + + The textFiles/foo.txt file only exists in the third location at + /private/var/containers/Bundle/Application//tst_manual_ios_assets.app/textFiles/foo.txt + + AppDataLocation returns the following 3 paths on macOS + /Users//Library/Application Support/tst_manual_ios_assets + /Library/Application Support/tst_manual_ios_assets + /tst_manual_ios_assets.app/Contents/Resources + + Once again the file only exists in the third location at + /tst_manual_ios_assets.app/Contents/Resources/textFiles/foo.txt + */ + QString textFile = QStandardPaths::locate(QStandardPaths::AppDataLocation, + QStringLiteral("textFiles/foo.txt")); + QVERIFY(!textFile.isEmpty()); +} + +void AssetsIos::bundledAppIcons() { + // Confirm one of the app icons are present. + QString appIcon = QStandardPaths::locate(QStandardPaths::AppDataLocation, + QStringLiteral("AppIcon40x40@2x.png")); + QVERIFY(!appIcon.isEmpty()); +} + +bool imageExistsInAssetCatalog(QString imageName); + +void AssetsIos::bundledImageInAssetCatalog() { + // Asset catalog images can be accessed only via a name, not a path. + QVERIFY(imageExistsInAssetCatalog(QStringLiteral("Face"))); +} + +QTEST_MAIN(AssetsIos) +#include "main.moc" diff --git a/tests/manual/ios_assets/utils.mm b/tests/manual/ios_assets/utils.mm new file mode 100644 index 00000000000..c3b657084eb --- /dev/null +++ b/tests/manual/ios_assets/utils.mm @@ -0,0 +1,18 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include + +#ifdef Q_OS_IOS +#include +#endif + +bool imageExistsInAssetCatalog(QString imageName) { +#ifdef Q_OS_IOS + UIImage* image = [UIImage imageNamed:imageName.toNSString()]; + return image != nil; +#else + // Don't fail the test when building on platforms other than iOS. + return true; +#endif +}