From a2a7c666fb31b18c16686db5bf0d64d3587bc0c9 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven <eric@warmenhoven.org> Date: Thu, 9 May 2024 12:54:28 -0400 Subject: [PATCH] iOS/tvOS: some updates for packaging for app store (#16508) --- core_info.c | 9 ++ .../RetroArchWidgetExtension.intentdefinition | 8 +- .../RetroArch_iOS13.xcodeproj/project.pbxproj | 6 +- .../Contents/Resources/css/bootstrap.css | 2 +- .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes pkg/apple/iOS/Info.plist | 46 +++++----- pkg/apple/iOS/fw.tmpl | 4 +- pkg/apple/make-frameworks.sh | 9 +- pkg/apple/rebuild-assets.sh | 60 ++++++++++--- .../Content.imageset/Contents.json | 7 +- .../retroarch_logo_back-1.png | Bin 0 -> 215 bytes .../Content.imageset/Contents.json | 7 +- .../retroarch_logo_front-1.png | Bin 0 -> 1233 bytes .../Content.imageset/Contents.json | 7 +- .../retroarch_logo_middle-1.png | Bin 0 -> 11058 bytes pkg/apple/tvOS/Info.plist | 80 ++++++++++-------- pkg/apple/update-cores.sh | 5 +- playlist.c | 12 +++ 18 files changed, 169 insertions(+), 93 deletions(-) delete mode 100644 pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.woff create mode 100644 pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/retroarch_logo_back-1.png create mode 100644 pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/retroarch_logo_front-1.png create mode 100644 pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/retroarch_logo_middle-1.png diff --git a/core_info.c b/core_info.c index b7fe2e0d45..faa4b5bde0 100644 --- a/core_info.c +++ b/core_info.c @@ -1552,6 +1552,15 @@ static bool core_info_get_file_id(const char *core_filename, /* > Remove extension */ strlcpy(core_file_id, core_filename, len); path_remove_extension(core_file_id); +#if IOS + /* iOS framework names, to quote Apple: + * "must contain only alphanumerics, dots, hyphens and must not end with a dot." + * + * Since core names include underscore, which is not allowed, but not dot, + * which is, we change underscore to dot. Here, we need to change it back. + */ + string_replace_all_chars(core_file_id, '.', '_'); +#endif /* > Remove suffix */ last_underscore = (char*)strrchr(core_file_id, '_'); diff --git a/pkg/apple/RetroArchWidgetExtension/RetroArchWidgetExtension.intentdefinition b/pkg/apple/RetroArchWidgetExtension/RetroArchWidgetExtension.intentdefinition index bdb404554a..b6d6b0d814 100644 --- a/pkg/apple/RetroArchWidgetExtension/RetroArchWidgetExtension.intentdefinition +++ b/pkg/apple/RetroArchWidgetExtension/RetroArchWidgetExtension.intentdefinition @@ -9,16 +9,18 @@ <key>INIntentDefinitionNamespace</key> <string>88xZPY</string> <key>INIntentDefinitionSystemVersion</key> - <string>20A294</string> + <string>23E224</string> <key>INIntentDefinitionToolsBuildVersion</key> - <string>12A6144</string> + <string>15E204a</string> <key>INIntentDefinitionToolsVersion</key> - <string>12.0</string> + <string>15.3</string> <key>INIntents</key> <array> <dict> <key>INIntentCategory</key> <string>information</string> + <key>INIntentDescription</key> + <string>RetroArch Launch Widget</string> <key>INIntentDescriptionID</key> <string>tVvJ9c</string> <key>INIntentEligibleForWidgets</key> diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj index 5875a56634..b78be7686b 100644 --- a/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj @@ -120,7 +120,6 @@ 92CC05B921FE3C1700FF79F0 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059B21FE3C1700FF79F0 /* GCDWebServerDataRequest.m */; }; 92CC05BA21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */; }; 92CC05BB21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */; }; - 92CC05BC21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */; }; 92CC05BD21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */; }; 92CC05BE21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */; }; 92CC05BF21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */; }; @@ -1467,7 +1466,6 @@ 07F7FB022A2DA8B800037C04 /* filters in Resources */, 9222F2092315DAD50097C0FD /* Launch Screen.storyboard in Resources */, 9204BE231D319EF300BD49DB /* InfoPlist.strings in Resources */, - 92CC05BC21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */, 9222F20B2315DD3D0097C0FD /* retroarch_logo.png in Resources */, 929784502200EEE400989A60 /* iOS/Resources/Icons.xcassets in Resources */, 9222F1FF2314BA7C0097C0FD /* assets.zip in Resources */, @@ -1755,7 +1753,9 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = RetroArchTopShelfExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = RetroArchTopShelfExtension; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 RetroArch. All rights reserved."; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1822,7 +1822,9 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = RetroArchTopShelfExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = RetroArchTopShelfExtension; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 RetroArch. All rights reserved."; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css b/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css index 7f36651961..fbd42848bc 100644 --- a/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css +++ b/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css @@ -2377,7 +2377,7 @@ input[type="button"].btn-block { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; diff --git a/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.woff b/pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23320 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 diff --git a/pkg/apple/iOS/Info.plist b/pkg/apple/iOS/Info.plist index 11d753a048..bbdf203c8f 100644 --- a/pkg/apple/iOS/Info.plist +++ b/pkg/apple/iOS/Info.plist @@ -15,6 +15,8 @@ <dict> <key>CFBundleTypeName</key> <string>ROM</string> + <key>LSHandlerRank</key> + <string>Owner</string> <key>LSItemContentTypes</key> <array> <string>com.libretro.rom</string> @@ -23,6 +25,8 @@ <dict> <key>CFBundleTypeName</key> <string>All Files</string> + <key>LSHandlerRank</key> + <string>Alternate</string> <key>LSItemContentTypes</key> <array> <string>public.data</string> @@ -48,6 +52,25 @@ <string>$(MARKETING_VERSION)</string> <key>CFBundleVersion</key> <string>$(CURRENT_PROJECT_VERSION)</string> + <key>GCSupportedGameControllers</key> + <array> + <dict> + <key>ProfileName</key> + <string>ExtendedGamepad</string> + </dict> + <dict> + <key>ProfileName</key> + <string>DirectionalGamepad</string> + </dict> + <dict> + <key>ProfileName</key> + <string>MicroGamepad</string> + </dict> + </array> + <key>GCSupportsControllerUserInteraction</key> + <true/> + <key>ITSAppUsesNonExemptEncryption</key> + <false/> <key>LSApplicationCategoryType</key> <string>public.app-category.games</string> <key>LSRequiresIPhoneOS</key> @@ -61,8 +84,10 @@ </array> <key>NSLocalNetworkUsageDescription</key> <string>RetroArch uses the local network to find local Netplay participants.</string> - <key>UIApplicationExitsOnSuspend</key> - <false/> + <key>NSUserActivityTypes</key> + <array> + <string>ConfigurationIntent</string> + </array> <key>UIFileSharingEnabled</key> <true/> <key>UILaunchStoryboardName</key> @@ -91,23 +116,6 @@ </array> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> - <key>GCSupportedGameControllers</key> - <array> - <dict> - <key>ProfileName</key> - <string>ExtendedGamepad</string> - </dict> - <dict> - <key>ProfileName</key> - <string>DirectionalGamepad</string> - </dict> - <dict> - <key>ProfileName</key> - <string>MicroGamepad</string> - </dict> - </array> - <key>GCSupportsControllerUserInteraction</key> - <true/> <key>UTImportedTypeDeclarations</key> <array> <dict> diff --git a/pkg/apple/iOS/fw.tmpl b/pkg/apple/iOS/fw.tmpl index 509712694d..15d68100b3 100644 --- a/pkg/apple/iOS/fw.tmpl +++ b/pkg/apple/iOS/fw.tmpl @@ -5,7 +5,7 @@ <key>CFBundleExecutable</key> <string>%CORE%</string> <key>CFBundleName</key> - <string>%CORE%</string> + <string>%BUNDLE%</string> <key>CFBundleIdentifier</key> <string>%IDENTIFIER%</string> <key>CFBundleShortVersionString</key> @@ -13,7 +13,7 @@ <key>CFBundleVersion</key> <string>1.0.0</string> <key>MinimumOSVersion</key> - <string>1.0</string> + <string>14.2</string> <key>CFBundlePackageType</key> <string>FMWK</string> <key>CFBundleInfoDictionaryVersion</key> diff --git a/pkg/apple/make-frameworks.sh b/pkg/apple/make-frameworks.sh index 1e079b5056..44f4be3f93 100755 --- a/pkg/apple/make-frameworks.sh +++ b/pkg/apple/make-frameworks.sh @@ -29,15 +29,14 @@ mkdir -p "$OUTDIR" for dylib in $(find "$BASE_DIR"/modules -maxdepth 1 -type f -regex '.*libretro.*\.dylib$') ; do intermediate=$(basename "$dylib") intermediate="${intermediate/%.dylib/}" - identifier="${intermediate/%$SUFFIX/}" - intermediate="${identifier/%_libretro/}" - fwName="${intermediate}_libretro" + intermediate="${intermediate/%$SUFFIX/}" + fwName="${intermediate//_/.}" echo Making framework $fwName from $dylib fwDir="${OUTDIR}/${fwName}.framework" mkdir -p "$fwDir" lipo -create "$dylib" -output "$fwDir/$fwName" - sed -e "s,%CORE%,$fwName," -e "s,%IDENTIFIER%,$identifier," iOS/fw.tmpl > "$fwDir/Info.plist" + sed -e "s,%CORE%,$fwName," -e "s,%BUNDLE%,$fwName," -e "s,%IDENTIFIER%,$fwName," iOS/fw.tmpl > "$fwDir/Info.plist" echo "signing $fwName" - codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der "$fwDir" + codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "$fwDir" done diff --git a/pkg/apple/rebuild-assets.sh b/pkg/apple/rebuild-assets.sh index 6c5bf4f8f4..d054ba7974 100755 --- a/pkg/apple/rebuild-assets.sh +++ b/pkg/apple/rebuild-assets.sh @@ -2,36 +2,53 @@ WD=$(realpath $(dirname $0)) +include_autoconfig="" include_cheats="" +include_databases="" include_overlays="" include_shaders="" +include_xmb="" assets_zip="$WD/assets.zip" -args=`getopt achmos $*` +args=`getopt acdhimosx $*` set -- $args while :; do case "$1" in -a) + include_autoconfig=1 include_cheats=1 + include_databases=1 include_overlays=1 include_shaders=1 + include_xmb=1 shift ;; -c) include_cheats=1 shift ;; + -d) + include_databases=1 + shift + ;; -h) echo "$(basename $0) -- Rebuild assets.zip" echo "Meant to be used when building RetroArch yourself. The buildbot does not use this." echo + echo " -a Include all assets, cheats, databases, input autoconfig, overlays, and shaders" echo " -c Include cheats" + echo " -d Include databases" + echo " -i Include input autoconfig" echo " -o Include overlays" echo " -s Include shaders" - echo " -a Include cheats, overlays, and shaders" - echo " -m Build for macOS (places in OSX directory" + echo " -x Include XMB assets" + echo " -m Build for macOS (places in OSX directory)" exit 0 ;; + -i) + include_autoconfig=1 + shift + ;; -m) assets_zip="$WD/OSX/assets.zip" shift @@ -44,6 +61,10 @@ while :; do include_shaders=1 shift ;; + -x) + include_xmb=1 + shift + ;; --) shift break @@ -64,8 +85,12 @@ pushd "$WD" &>/dev/null rm -rf .media fetch_zip retroarch-assets -fetch_zip retroarch-joypad-autoconfig -fetch_zip libretro-database +if [ -n "$include_autoconfig" ] ; then + fetch_zip retroarch-joypad-autoconfig +fi +if [ -n "$include_cheats" -o -n "$include_databases" ] ; then + fetch_zip libretro-database +fi fetch_zip libretro-super if [ -n "$include_overlays" ] ; then fetch_zip common-overlays @@ -78,19 +103,28 @@ fi pushd .media &>/dev/null echo "Packaging assets" -mkdir assets ; mv retroarch-assets/{COPYING,glui,menu_widgets,ozone,pkg,rgui,sounds,xmb} assets ; rm -rf retroarch-assets +mkdir assets ; mv retroarch-assets/{COPYING,glui,menu_widgets,ozone,pkg,rgui,sounds} assets +if [ -n "$include_xmb" ] ; then + mv retroarch-assets/xmb assets +fi +rm -rf retroarch-assets rm -rf assets/pkg/wiiu -echo "Packaging autoconfig" -mv retroarch-joypad-autoconfig autoconfig -rm -rf autoconfig/{android,dinput,linuxraw,parport,qnx,sdl2,udev,x,xinput} +if [ -n "$include_autoconfig" ] ; then + echo "Packaging autoconfig" + mv retroarch-joypad-autoconfig autoconfig + rm -rf autoconfig/{android,dinput,linuxraw,parport,qnx,sdl2,udev,x,xinput} +fi if [ -n "$include_cheats" ] ; then echo "Packaging cheats" mv libretro-database/cht cht fi -echo "Packaging database" -mkdir database ; mv libretro-database/{cursors,rdb} database ; rm -rf libretro-database +if [ -n "$include_databases" ] ; then + echo "Packaging database" + mkdir database ; mv libretro-database/{cursors,rdb} database +fi +rm -rf libretro-database echo "Packaging info" mv libretro-super/info info ; rmdir libretro-super @@ -106,9 +140,9 @@ if [ -n "$include_shaders" ] ; then mkdir shaders ; mv glsl-shaders shaders/shaders_glsl ; mv slang-shaders shaders/shaders_slang fi -rm -f ../assets.zip +rm -f $assets_zip echo "Zipping final assets bundle..." -zip -qr ../assets.zip * +zip -qr $assets_zip * popd &>/dev/null diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json index 48ecb4fa43..370111ab31 100644 --- a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +++ b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -1,11 +1,12 @@ { "images" : [ { + "filename" : "retroarch_logo_back-1.png", "idiom" : "tv" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/retroarch_logo_back-1.png b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/retroarch_logo_back-1.png new file mode 100644 index 0000000000000000000000000000000000000000..26c974c4e86ffea5c0b1631bfce4b36c435efc69 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0y~yU<ERn85o&?l;f|6J`gX!C&bm**!a|&BvT-_-_yl0 vq~g}wgNBSi-k}9w{c}0u7XX<90UE9|JmzO$j5)o+1!TRatDnm{r-UW|Y{40I literal 0 HcmV?d00001 diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json index 48ecb4fa43..86856d5b87 100644 --- a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -1,11 +1,12 @@ { "images" : [ { + "filename" : "retroarch_logo_front-1.png", "idiom" : "tv" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/retroarch_logo_front-1.png b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/retroarch_logo_front-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e31e0d9220b1d024d6e724442941c9ba3f1bb9b GIT binary patch literal 1233 zcmeAS@N?(olHy`uVBq!ia0y~yU<ERn8CaNsRHxMSe?Uq)z$e7jy}-xJ%*@Eh2uPZM z0g!DB2FgA+)&rGslmz(&Gq8rgUwu}yO*X)M9RmYPtfz}(NX4x;HyyKXJBY9)yk@&} zjGd#ixIth>X~Bnm>-ZA%=j=87%9!>z**)yGzzXigV*V!AzDK@QV)^AzfB(;>G-II2 zLkJ|8t#-2r{wqGc?y9U#jIo35qy)38`geWaDSSBpY&WCX%(PqY&dm=zdt|EAgKq^s z+kQ=a%CqiXT>SLs=fA&;iYtov%6I%~;noXG-sj>=@7t+o$G@^MwvGMtXUn@SueZg1 zKi6DdzyFF*L=l7hA<etneHj1P2LJgn-MMGFdlys04>le{(>ld8?t~Xi*DXuK&EtPq zCcj9xi2tZOKaioDKcQZIvYp{~wm*Ab{<44gncvBN2g5xF2I15@4KIy36J9d%DDyn< zWXL^W|Nbin^9p9GCfS2`Vi;r(T0NL9chGDBZ^SXSD~zlc1kaSrZ(_XwWdH1+{r3UK zvux%Uz8tAJ4*5<qP6@7I=31aE!6@Ru_{CPiY5@b+g7SkL3wT#BbAfpGe3)bp-e_RT zV6GBB6P{7xP~zaefmfs91xV->keb(&>mVy28^8dk7+u)Eh~$7Jfoi~}+-k5=2!01v z>uzABV77qo#2299w;GsElvpoVo**5-?!tbAO~hf@b)b8J4xO0?G$W?spG`}E4@0TL zvQ3Po4vZx%$_-2!4fj|VGXr(L;BaGL4PX}mx(Miaf4G|!j<S8YC)fk@2Sb&356B-F z-s?%Z?IJB84RrH?z_Th1W)DQuxH1><M$|DR@5*89>HM$S#2Zn?bblK2o6UD#zuG99 zpx@wn`>yW0NpC-$*<$;yzd!T(za0hq-PcS$tHmyxX|}uak?DPtcZoOC3yf9PRHm(3 zZ(_fg=K;gdTVb(FW4RQrcg&Aq976emT&I4xCnqxjq?zN_f2)jkP&ow$Iy!5onjAYK Qc^@R=>FVdQ&MBb@0LK1C!~g&Q literal 0 HcmV?d00001 diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json index 48ecb4fa43..1025860f98 100644 --- a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -1,11 +1,12 @@ { "images" : [ { + "filename" : "retroarch_logo_middle-1.png", "idiom" : "tv" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/retroarch_logo_middle-1.png b/pkg/apple/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/retroarch_logo_middle-1.png new file mode 100644 index 0000000000000000000000000000000000000000..54c979d3dbba884dc931192ddb0974d6476cc3ee GIT binary patch literal 11058 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 Pk1th4Erm)sM9BXE%^D&2 literal 0 HcmV?d00001 diff --git a/pkg/apple/tvOS/Info.plist b/pkg/apple/tvOS/Info.plist index ed1ecc42f6..4052eaf10f 100644 --- a/pkg/apple/tvOS/Info.plist +++ b/pkg/apple/tvOS/Info.plist @@ -2,17 +2,6 @@ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> - <key>CFBundleURLTypes</key> - <array> - <dict> - <key>CFBundleURLName</key> - <string>RetroArch URL</string> - <key>CFBundleURLSchemes</key> - <array> - <string>retroarch</string> - </array> - </dict> - </array> <key>ALTBundleIdentifier</key> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> <key>ALTDeviceID</key> @@ -21,6 +10,30 @@ <string>$(DEVELOPMENT_LANGUAGE)</string> <key>CFBundleDisplayName</key> <string>RetroArch</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeName</key> + <string>ROM</string> + <key>LSHandlerRank</key> + <string>Owner</string> + <key>LSItemContentTypes</key> + <array> + <string>com.libretro.rom</string> + </array> + </dict> + <dict> + <key>CFBundleTypeName</key> + <string>All Files</string> + <key>LSHandlerRank</key> + <string>Alternate</string> + <key>LSItemContentTypes</key> + <array> + <string>public.data</string> + <string>public.content</string> + </array> + </dict> + </array> <key>CFBundleExecutable</key> <string>$(EXECUTABLE_NAME)</string> <key>CFBundleIdentifier</key> @@ -33,16 +46,19 @@ <string>APPL</string> <key>CFBundleShortVersionString</key> <string>$(MARKETING_VERSION)</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleURLName</key> + <string>RetroArch URL</string> + <key>CFBundleURLSchemes</key> + <array> + <string>retroarch</string> + </array> + </dict> + </array> <key>CFBundleVersion</key> <string>$(CURRENT_PROJECT_VERSION)</string> - <key>LSApplicationCategoryType</key> - <string>public.app-category.games</string> - <key>LSRequiresIPhoneOS</key> - <true/> - <key>UIRequiredDeviceCapabilities</key> - <array> - <string>arm64</string> - </array> <key>GCSupportedGameControllers</key> <array> <dict> @@ -60,25 +76,15 @@ </array> <key>GCSupportsControllerUserInteraction</key> <true/> - <key>CFBundleDocumentTypes</key> + <key>ITSAppUsesNonExemptEncryption</key> + <false/> + <key>LSApplicationCategoryType</key> + <string>public.app-category.games</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UIRequiredDeviceCapabilities</key> <array> - <dict> - <key>CFBundleTypeName</key> - <string>ROM</string> - <key>LSItemContentTypes</key> - <array> - <string>com.libretro.rom</string> - </array> - </dict> - <dict> - <key>CFBundleTypeName</key> - <string>All Files</string> - <key>LSItemContentTypes</key> - <array> - <string>public.data</string> - <string>public.content</string> - </array> - </dict> + <string>arm64</string> </array> <key>UTImportedTypeDeclarations</key> <array> diff --git a/pkg/apple/update-cores.sh b/pkg/apple/update-cores.sh index 2606ab28c7..df0ae90787 100755 --- a/pkg/apple/update-cores.sh +++ b/pkg/apple/update-cores.sh @@ -154,7 +154,7 @@ else race quicknes smsplus - blastem + #blastem vice_x128 vice_x64 vice_x64sc @@ -202,7 +202,8 @@ else virtualxt geolith vircon32 - melondsds + #melondsds + 2048 ) for dylib in "${exports[@]}" ; do find_dylib $dylib diff --git a/playlist.c b/playlist.c index eb946f90a5..122cdbe78f 100644 --- a/playlist.c +++ b/playlist.c @@ -1131,11 +1131,23 @@ void playlist_resolve_path(enum playlist_file_mode mode, string_starts_with(path, ":/modules/") && string_ends_with(path, ".dylib")) { + /* iOS cores used to be packaged as .dylib files in the modules + * directory; App Store rules require turning them into Frameworks and + * putting them in the Frameworks directory. Because some playlists + * include the old core path, we'll translate it here. + */ path[string_index_last_occurance(path, '.')] = '\0'; if (string_ends_with(path, "_ios")) path[string_index_last_occurance(path, '_')] = '\0'; strlcpy(tmp, ":/Frameworks/", STRLEN_CONST(":/Frameworks/") + 1); strlcpy(tmp + STRLEN_CONST(":/Frameworks/"), path + STRLEN_CONST(":/modules/"), sizeof(tmp) - STRLEN_CONST(":/Frameworks/")); + /* iOS framework names, to quote Apple: + * "must contain only alphanumerics, dots, hyphens and must not end with a dot." + * + * Since core names include underscore, which is not allowed, but not dot, + * which is, we change underscore to dot. + */ + string_replace_all_chars(tmp, '_', '.'); strlcat(tmp, ".framework", sizeof(tmp)); fill_pathname_expand_special(path, tmp, len); }