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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 mX4Rts 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~yUX~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=l7hAle{(>ld8?t~Xi*DXuK&EtPq zCcj9xi2tZOKaioDKcQZIvYp{~wm*Ab{<44gncvBN2g5xF2I15@4KIy36J9d%DDyn< zWXL^W|Nbin^9p9GCfS2`Vi;r(T0NL9chGDBZ^SXSD~zlc1kaSrZ(_XwWdH1+{r3UK zvux%Uz8tAJ4*5keb(&>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|!jHM$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 @@ - 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); }