Skip to content

Instantly share code, notes, and snippets.

@adamzarn
Last active November 30, 2023 20:17
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save adamzarn/6bb89d91ed4b8c3d3fb25363c221441f to your computer and use it in GitHub Desktop.
Save adamzarn/6bb89d91ed4b8c3d3fb25363c221441f to your computer and use it in GitHub Desktop.
A bash script to add the SwiftSupport folder to an .ipa to resolve the ITMS-90426: Invalid Swift Support error.
#!/bin/bash
# Usage:
# 1. Copy the script into a text editor and save it with no extension
# 2. Make it executable like so: chmod +x path/to/script
# 3. Run it from the Terminal in one of two ways:
# * path/to/script ipa_path="path/to/ipa" archive_path="path/to/xcarchive"
# * path/to/script ipa_path="path/to/ipa" toolchain_path="path/to/toolchain"
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
ipa_path) ipaPath=${VALUE} ;; # Format: "Path/to/app.ipa"
archive_path) archivePath=${VALUE} ;; # Format: "Path/to/app.xcarchive"
toolchain_path) toolchainPath=${VALUE} ;; # Format: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos"
*)
esac
done
# Derived Variables
ipaDirectory=$(dirname "$ipaPath")
ipaName=$(basename "$ipaPath")
zipName=${ipaName/.ipa/.zip}
appName=${ipaName/.ipa/}
zipSuffix=-unzipped
unzippedDirectoryName=${appName}${zipSuffix}
newIpaSuffix=-with-swift-support
newIpaName=${appName}${newIpaSuffix}
swiftSupportPath=SwiftSupport/iphoneos
ipaSwiftSupportDirectory=${ipaDirectory}/${unzippedDirectoryName}/${swiftSupportPath}
# Changes the .ipa file extension to .zip and unzips it
function unzipIPA {
mv "${ipaDirectory}/${ipaName}" "${ipaDirectory}/${zipName}"
unzip "${ipaDirectory}/${zipName}" -d "${ipaDirectory}/${unzippedDirectoryName}"
}
# Copies the SwiftSupport folder from the .xcarchive into the .ipa
function copySwiftSupportFromArchiveIntoIPA {
mkdir -p "$ipaSwiftSupportDirectory"
cd "${archivePath}/${swiftSupportPath}"
for file in *.dylib; do
cp "$file" "$ipaSwiftSupportDirectory"
done
}
# Creates the SwiftSupport folder from the Xcode toolchain and copies it into the .ipa
function copySwiftSupportFromToolchainIntoIPA {
mkdir -p "$ipaSwiftSupportDirectory"
cd "${ipaDirectory}/${unzippedDirectoryName}/Payload/${appName}.app/Frameworks"
for file in *.dylib; do
cp "${toolchainPath}/${file}" "$ipaSwiftSupportDirectory"
done
}
# Adds the SwiftSupport folder from one of two sources depending on the presence of an .xcarchive
function addSwiftSupportFolder {
if [ -z "$archivePath" ]
then
copySwiftSupportFromToolchainIntoIPA
else
copySwiftSupportFromArchiveIntoIPA
fi
}
# Zips the new folder back up and changes the extension to .ipa
function createAppStoreIPA {
cd "${ipaDirectory}/${unzippedDirectoryName}"
zip -r "${ipaDirectory}/${newIpaName}.zip" ./*
mv "${ipaDirectory}/${newIpaName}.zip" "${ipaDirectory}/${newIpaName}.ipa"
}
# Renames original .ipa and deletes the unzipped folder
function cleanUp {
mv "${ipaDirectory}/${zipName}" "${ipaDirectory}/${ipaName}"
rm -r "${ipaDirectory}/${unzippedDirectoryName}"
}
# Execute Steps
unzipIPA
addSwiftSupportFolder
createAppStoreIPA
cleanUp
@steadystatic
Copy link

Thanks for publishing this - crossing my fingers this gets me past an ITMS-90426: Invalid Swift Support App Store rejection 👍

@adamzarn
Copy link
Author

adamzarn commented Jul 8, 2020

Thanks for publishing this - crossing my fingers this gets me past an ITMS-90426: Invalid Swift Support App Store rejection 👍

I was surprised that there weren't more people facing this issue, but it seems like there actually are now that I've posted my solution here and on SO. Hope it works out for you! You should be good once the initial App Store upload is successful.

@ekapradityagk
Copy link

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?

thanks

@adamzarn
Copy link
Author

adamzarn commented Aug 4, 2020

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?

thanks

Yeah, what exactly do you need help with? The basic instructions are at the top of the script. Do you have an .ipa and an .xcarchive to start with?

@ekapradityagk
Copy link

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?
thanks

Yeah, what exactly do you need help with? The basic instructions are at the top of the script. Do you have an .ipa and an .xcarchive to start with?

okay, i got a .ipa using adhoc archiving method, i saw your post in stackoverflow,
so i just using this .ipa? (i thought this script will run when xcode creating .ipa)

correct me if iam wrong,

i open the terminal on where i put my script file and my ipa folder in download folder so the command will be like this?

script ipa_path="path/to/ipa(in Downloads Folder)" archive_path="path/to/xcarchive" ??

how if i put all this 3 file to 1 folder? can i do that?

script ipa_path=".ipa" archive_path=".xcarchive" can i do this?

@adamzarn
Copy link
Author

adamzarn commented Aug 4, 2020

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?
thanks

Yeah, what exactly do you need help with? The basic instructions are at the top of the script. Do you have an .ipa and an .xcarchive to start with?

okay, i got a .ipa using adhoc archiving method, i saw your post in stackoverflow,
so i just using this .ipa? (i thought this script will run when xcode creating .ipa)

correct me if iam wrong,

i open the terminal on where i put my script file and my ipa folder in download folder so the command will be like this?

script ipa_path="path/to/ipa(in Downloads Folder)" archive_path="path/to/xcarchive" ??

how if i put all this 3 file to 1 folder? can i do that?

script ipa_path=".ipa" archive_path=".xcarchive" can i do this?

The script will generate a new .ipa called {original-ipa-name}-with-swift-support.ipa with the SwiftSupport folder added to it. If you use absolute paths you can call the script from any directory. A good way to get the absolute path of the .ipa and the .xcarchive is to right click on them, hold option, then Copy "File/Folder" as Pathname.

@ekapradityagk
Copy link

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?
thanks

Yeah, what exactly do you need help with? The basic instructions are at the top of the script. Do you have an .ipa and an .xcarchive to start with?

okay, i got a .ipa using adhoc archiving method, i saw your post in stackoverflow,
so i just using this .ipa? (i thought this script will run when xcode creating .ipa)
correct me if iam wrong,
i open the terminal on where i put my script file and my ipa folder in download folder so the command will be like this?
script ipa_path="path/to/ipa(in Downloads Folder)" archive_path="path/to/xcarchive" ??
how if i put all this 3 file to 1 folder? can i do that?
script ipa_path=".ipa" archive_path=".xcarchive" can i do this?

The script will generate a new .ipa called {original-ipa-name}-with-swift-support.ipa with the SwiftSupport folder added to it. If you use absolute paths you can call the script from any directory. A good way to get the absolute path of the .ipa and the .xcarchive is to right click on them, hold option, then Copy "File/Folder" as Pathname.

hi,, i sucessfully run the script and i got the new .ipa but after i send to appstore connect i got this email saying i have this issue..
any idea whats wrong ??

ITMS-90428: Invalid Swift Support - The files libswiftAVFoundation.dylib, libswiftQuartzCore.dylib, libswiftos.dylib, libswiftCoreFoundation.dylib, libswiftDispatch.dylib, libswiftMetal.dylib, libswiftUIKit.dylib, libswiftCoreGraphics.dylib, libswiftCoreAudio.dylib, libswiftDarwin.dylib, libswiftCore.dylib, libswiftFoundation.dylib, libswiftsimd.dylib, libswiftCoreImage.dylib, libswiftObjectiveC.dylib, libswiftCoreMedia.dylib don’t match /Payload/Principal ID.app/Frameworks/libswiftAVFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftQuartzCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftos.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftDispatch.dylib, /Payload/Principal ID.app/Frameworks/libswiftMetal.dylib, /Payload/Principal ID.app/Frameworks/libswiftUIKit.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreGraphics.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreAudio.dylib, /Payload/Principal ID.app/Frameworks/libswiftDarwin.dylib, /Payload/Principal ID.app/Frameworks/libswiftCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftsimd.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreImage.dylib, /Payload/Principal ID.app/Frameworks/libswiftObjectiveC.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreMedia.dylib. Make sure the files are correct, rebuild your app, and resubmit it. Don’t apply post-processing to /Payload/Principal ID.app/Frameworks/libswiftAVFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftQuartzCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftos.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftDispatch.dylib, /Payload/Principal ID.app/Frameworks/libswiftMetal.dylib, /Payload/Principal ID.app/Frameworks/libswiftUIKit.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreGraphics.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreAudio.dylib, /Payload/Principal ID.app/Frameworks/libswiftDarwin.dylib, /Payload/Principal ID.app/Frameworks/libswiftCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftsimd.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreImage.dylib, /Payload/Principal ID.app/Frameworks/libswiftObjectiveC.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreMedia.dylib.

@ekapradityagk
Copy link

before using this script i only having this issue

TMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.

already update to latest xcode but still got this error, thats why i follow your solution..

@adamzarn
Copy link
Author

adamzarn commented Aug 5, 2020

@ekapradityagk Maybe try re-signing the new .ipa. Here's a gist for that, but you need to download fastlane: https://gist.github.com/adamzarn/2721d722dc9e584133167eab98dc2b77

@ekapradityagk
Copy link

@ekapradityagk Maybe try re-signing the new .ipa. Here's a gist for that, but you need to download fastlane: https://gist.github.com/adamzarn/2721d722dc9e584133167eab98dc2b77

so is it the same how to used this script? i'll try download fastlane

@ekapradityagk
Copy link

@ekapradityagk Maybe try re-signing the new .ipa. Here's a gist for that, but you need to download fastlane: https://gist.github.com/adamzarn/2721d722dc9e584133167eab98dc2b77

hi Adam,

where i run this gist? in project root or in the ipa folder? i try run from ipa folder yesterday, but it not finished the script,, stuck in bundle update

@krzysztofstepnikowski
Copy link

Hmm... Hello Guys. I have the same problem like you. Could you help me?

@adamzarn
Copy link
Author

adamzarn commented Sep 10, 2020

@krzysztofstepnikowski The script performs these steps:

unzipIPA
addSwiftSupportFolder
createAppStoreIPA
cleanUp

You can do it manually. The logic and comments within the script should tell you exactly what you need to do. The script just makes it easier and allows you to add it to a pipeline.

@CocodingLee
Copy link

I did it again as you described and uploaded it to AppStore Connect. There is no app store error email reply, and the Appstore Connect TestFlight tab also cannot see the ipa I just uploaded. It has been 2 hours since I uploaded the package.

What I want to ask is, is it necessary to re-sign the entire newly generated xxxx-with-swift-support.ipa, including payload and swiftsupport

@krzysztofstepnikowski
Copy link

krzysztofstepnikowski commented Sep 18, 2020

Hello Guys,
I forgot to let you know that I resolved this issue. Three things can help:

  1. Release configuration (The linker should be set as Link Framework SDKs Only and I had added mtoucharguments "-dsym=false", when I removed this redundant arg then was ok).
  2. Downgraded Xcode to stable version 11.6.
  3. I recommended uploading app directly by Xcode (not Visual Studio for Mac);
    You can do "Archive for publishing" inside the VS4Mac and then open Xcode -> Window -> Organizer. There should be generated your archive to publishing. You can validate the app first and if will be ok then you will can distribute app.

Below I pasted my sample of release configuration from iOS.csproj and URL to screenshot presents the optimal build configuration:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
   <DebugType>none</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\iPhone\Release</OutputPath>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <MtouchArch>ARM64</MtouchArch>
    <ConsolePause>false</ConsolePause>
    <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
    <BuildIpa>true</BuildIpa>
    <AutoGenerateBindingRedirects>True</AutoGenerateBindingRedirects>
    <MtouchLink>SdkOnly</MtouchLink>
    <MtouchEnableSGenConc>true</MtouchEnableSGenConc>
  </PropertyGroup>

https://snipboard.io/TF4l5R.jpg

I hope that it can help.

@donfour
Copy link

donfour commented Oct 23, 2020

hi,, i also having this issue, found this link on stackoverflow, but i dont know how to use this,, can you help me on how do i use this script?
thanks

Yeah, what exactly do you need help with? The basic instructions are at the top of the script. Do you have an .ipa and an .xcarchive to start with?

okay, i got a .ipa using adhoc archiving method, i saw your post in stackoverflow,
so i just using this .ipa? (i thought this script will run when xcode creating .ipa)
correct me if iam wrong,
i open the terminal on where i put my script file and my ipa folder in download folder so the command will be like this?
script ipa_path="path/to/ipa(in Downloads Folder)" archive_path="path/to/xcarchive" ??
how if i put all this 3 file to 1 folder? can i do that?
script ipa_path=".ipa" archive_path=".xcarchive" can i do this?

The script will generate a new .ipa called {original-ipa-name}-with-swift-support.ipa with the SwiftSupport folder added to it. If you use absolute paths you can call the script from any directory. A good way to get the absolute path of the .ipa and the .xcarchive is to right click on them, hold option, then Copy "File/Folder" as Pathname.

hi,, i sucessfully run the script and i got the new .ipa but after i send to appstore connect i got this email saying i have this issue..
any idea whats wrong ??

ITMS-90428: Invalid Swift Support - The files libswiftAVFoundation.dylib, libswiftQuartzCore.dylib, libswiftos.dylib, libswiftCoreFoundation.dylib, libswiftDispatch.dylib, libswiftMetal.dylib, libswiftUIKit.dylib, libswiftCoreGraphics.dylib, libswiftCoreAudio.dylib, libswiftDarwin.dylib, libswiftCore.dylib, libswiftFoundation.dylib, libswiftsimd.dylib, libswiftCoreImage.dylib, libswiftObjectiveC.dylib, libswiftCoreMedia.dylib don’t match /Payload/Principal ID.app/Frameworks/libswiftAVFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftQuartzCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftos.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftDispatch.dylib, /Payload/Principal ID.app/Frameworks/libswiftMetal.dylib, /Payload/Principal ID.app/Frameworks/libswiftUIKit.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreGraphics.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreAudio.dylib, /Payload/Principal ID.app/Frameworks/libswiftDarwin.dylib, /Payload/Principal ID.app/Frameworks/libswiftCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftsimd.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreImage.dylib, /Payload/Principal ID.app/Frameworks/libswiftObjectiveC.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreMedia.dylib. Make sure the files are correct, rebuild your app, and resubmit it. Don’t apply post-processing to /Payload/Principal ID.app/Frameworks/libswiftAVFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftQuartzCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftos.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftDispatch.dylib, /Payload/Principal ID.app/Frameworks/libswiftMetal.dylib, /Payload/Principal ID.app/Frameworks/libswiftUIKit.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreGraphics.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreAudio.dylib, /Payload/Principal ID.app/Frameworks/libswiftDarwin.dylib, /Payload/Principal ID.app/Frameworks/libswiftCore.dylib, /Payload/Principal ID.app/Frameworks/libswiftFoundation.dylib, /Payload/Principal ID.app/Frameworks/libswiftsimd.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreImage.dylib, /Payload/Principal ID.app/Frameworks/libswiftObjectiveC.dylib, /Payload/Principal ID.app/Frameworks/libswiftCoreMedia.dylib.

@ekapradityagk I'm running into the same error after using the script. I'm building from Xcode 12.1. Did you solve your issue?

@martinburchell
Copy link

@adamzarn Thanks for posting this.

Does the script assume that the app uses Swift so the libraries will be present under Frameworks in the ipa?

I'm pretty sure my app doesn't use Swift but I'm still getting Invalid Swift Support error. It doesn't make any difference if I have "Always Embed Swift binaries" in the build settings set to Yes or No. If I just add an empty folder I get the 90424 SwiftSupport folder is empty error. This is with XCode 12.4

@liaogang
Copy link

@adamzarn Thanks for posting this.

Does the script assume that the app uses Swift so the libraries will be present under Frameworks in the ipa?

I'm pretty sure my app doesn't use Swift but I'm still getting Invalid Swift Support error. It doesn't make any difference if I have "Always Embed Swift binaries" in the build settings set to Yes or No. If I just add an empty folder I get the 90424 SwiftSupport folder is empty error. This is with XCode 12.4

+1

@martinburchell
Copy link

In my case the error was nothing to do with Swift and was because I was trying to include dynamically linked openssl libraries in my app. Whilst this is fine for running an app in the simulator or on a development device, the Apple Store won't accept random libraries in the Frameworks folder and sends this unhelpful message.

The solution was to link the libraries statically. https://forum.qt.io/post/647893

@NityaSantosh26
Copy link

NityaSantosh26 commented Oct 11, 2023

The script mentioned above does not add all the *.dylib files to swiftsupport directory. Instead use https://github.com/NityaSantosh26/add-swift-support/blob/main/swift-support

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment