From a2a7c666fb31b18c16686db5bf0d64d3587bc0c9 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven 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 @@ INIntentDefinitionNamespace 88xZPY INIntentDefinitionSystemVersion - 20A294 + 23E224 INIntentDefinitionToolsBuildVersion - 12A6144 + 15E204a INIntentDefinitionToolsVersion - 12.0 + 15.3 INIntents INIntentCategory information + INIntentDescription + RetroArch Launch Widget INIntentDescriptionID tVvJ9c INIntentEligibleForWidgets 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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 yUuqjSqoSsmG%I0p8#6(POw^!cy2eb CFBundleTypeName ROM + LSHandlerRank + Owner LSItemContentTypes com.libretro.rom @@ -23,6 +25,8 @@ CFBundleTypeName All Files + LSHandlerRank + Alternate LSItemContentTypes public.data @@ -48,6 +52,25 @@ $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) + GCSupportedGameControllers + + + ProfileName + ExtendedGamepad + + + ProfileName + DirectionalGamepad + + + ProfileName + MicroGamepad + + + GCSupportsControllerUserInteraction + + ITSAppUsesNonExemptEncryption + LSApplicationCategoryType public.app-category.games LSRequiresIPhoneOS @@ -61,8 +84,10 @@ NSLocalNetworkUsageDescription RetroArch uses the local network to find local Netplay participants. - UIApplicationExitsOnSuspend - + NSUserActivityTypes + + ConfigurationIntent + UIFileSharingEnabled UILaunchStoryboardName @@ -91,23 +116,6 @@ UIViewControllerBasedStatusBarAppearance - GCSupportedGameControllers - - - ProfileName - ExtendedGamepad - - - ProfileName - DirectionalGamepad - - - ProfileName - MicroGamepad - - - GCSupportsControllerUserInteraction - UTImportedTypeDeclarations 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 @@ CFBundleExecutable %CORE% CFBundleName - %CORE% + %BUNDLE% CFBundleIdentifier %IDENTIFIER% CFBundleShortVersionString @@ -13,7 +13,7 @@ CFBundleVersion 1.0.0 MinimumOSVersion - 1.0 + 14.2 CFBundlePackageType FMWK CFBundleInfoDictionaryVersion 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}a!nU}j)sW?*1&{1wp$;syAGxEdQ9pL&yI%D}+T z@9E+gQgQ3;K|@9c28KfmzWV2K#4lhN7|?K?;W0l0W6bFlE+7YZy85}Sb4q9e0Bpe- AbpQYW 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}a!nU}j)pW?*3Gl)Cl1PqLfjEuoR+2_W31_lO>k|4ie2G;QRtIuk-$p)COV_;y3^>lFzskrs#reoG^ z2NAY}*KC)Lv2%15HwerqE%>l+9bba}oV|u$8PgsoyNBHtSi!wm%-`hN_sF+OEWaG; z@Bi79X3Q|8K!Vw7H;drE;?wJ{%Id@zJJ?Q2FuSUM*XNzWhx5;NGn&mzyY=qe{J^tE zrb<2dR^YSk*Tknh>+Z$HPk(;?`@5*PqKL12$FCM{y};ysF23}>oqBfsD;s0m*iV19 zyxa16TkQ99&E@s`uLwmHF~}d%yu00p@sDlrpC8kmd#1a0F-81f<1sX?Q%vJdc)@ht zvNYU0{)c7qi*$?lkIM4{8M^rs>eVOP8GdK`v*+b6`-h+To$Plo+;dzMwSa+ZLHR+B1-vVmxj?*o zK1{L)Z!|DvFjtA63C}2TC~l0wnaR;YGu|rd$VE0oecsIK}9~{zW7QEXkAs zG38c+l|t}4uv&KmD+RL!d?&tGEnv9Sz;vR-dcpDp=>T>Y_9JW}4$H1Hf*m?DkNt~C zOvOK&mH;1yQio-m7)u=(OIVZ}m^2#hu`Xu5)xh+E!;OJ8fL+9)#DP)7!5{8sg`;dA z?g{oVa4le{67K=|1H*egDYspu1*8KQat{QaRcSDLAezRNxrjHSjv;wh4r5Q}f7K@5 zh$^Q0)0p3EzVrIkM%e`Y2G`qnb>B^T`{~RU+jsr_nb-gADB$nDX7X7rcG*m`-Ib3_ z@0+|!yqR8Ltg@yuZPj`c`^7vD7=GRgi(MMarEtAtegxx?${FN=5BKC`CV;eZ{Q7T| e(GDu7;6O)b?NpOvMF%zfrAxXSC8QA$IP3e) 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 Vrc8ioC8z(hrK+frw`5(<1A@~3Q 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 @@ - CFBundleURLTypes - - - CFBundleURLName - RetroArch URL - CFBundleURLSchemes - - retroarch - - - ALTBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) ALTDeviceID @@ -21,6 +10,30 @@ $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName RetroArch + CFBundleDocumentTypes + + + CFBundleTypeName + ROM + LSHandlerRank + Owner + LSItemContentTypes + + com.libretro.rom + + + + CFBundleTypeName + All Files + LSHandlerRank + Alternate + LSItemContentTypes + + public.data + public.content + + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -33,16 +46,19 @@ APPL CFBundleShortVersionString $(MARKETING_VERSION) + CFBundleURLTypes + + + CFBundleURLName + RetroArch URL + CFBundleURLSchemes + + retroarch + + + CFBundleVersion $(CURRENT_PROJECT_VERSION) - LSApplicationCategoryType - public.app-category.games - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - arm64 - GCSupportedGameControllers @@ -60,25 +76,15 @@ GCSupportsControllerUserInteraction - CFBundleDocumentTypes + ITSAppUsesNonExemptEncryption + + LSApplicationCategoryType + public.app-category.games + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities - - CFBundleTypeName - ROM - LSItemContentTypes - - com.libretro.rom - - - - CFBundleTypeName - All Files - LSItemContentTypes - - public.data - public.content - - + arm64 UTImportedTypeDeclarations 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); }