Search code examples
iosswiftxcodeswift-package-manager

Can't submit iOS app to iTunes connect when using a SPM package


When I try to submit an iOS app that includes an SPM package which uses the new binary target the submission fails with the following two errors:

Invalid Swift Support. The file MyApp.app/Frameworks/libHello.a doesn’t have the correct file type for this location. Ensure you’re using the correct file, rebuild your app using the current public (GM) version of Xcode, and resubmit it.

Invalid Bundle Structure - The binary file 'MyApp.app/Frameworks/libHello.a' is not permitted. Your app can’t contain standalone executables or libraries, other than a valid CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure.

I believe it's to do with SPM as when I manually drag the Hello.xcframework package to the project it allows me to submit successfully.

Trying to do other things like changing Xcode build settings, customising the package.swift and using lipo to make sure the architecture slices are valid doesn't lead to anyway.

I looked at the embed framework in Build phases, it's not been included only in the link framework phase. One thing I noticed is when I archived the app the static library libHello.a was in the app's framework folder, which is weird since it shouldn't be there as they are integrated with the app binary. When I delete that file I can continue the app submission without any issues. But I don't think this workaround would be ideal long term.

I've created a simple static library with one class and method to keep thing simple. I then use Xcode archive the resulting static library in an XCFramework using xcodebuild -create-xcframework. See Github Repo: https://github.com/shams-ahmed/Hello

Steps to reproduce:

  • Create a new Xcode project
  • Add the Hello SPM package using the SPM interface with URL: https://github.com/shams-ahmed/Hello
  • Archive the project
  • Validate the App
  • You can deselect all the options
  • Fails with the above error message

What do I need to do to get SPM working with a static library? This is now meant to be supported with Xcode 12 and Swift 5.3

Info:

  • Xcode 12.0
  • Swift 5.3
  • Using a new Xcode project
  • P.S must use a static library

Solution

  • Looks like it's not possible with static libraries (.a files) because .binaryTarget with a xcframework is associated with dynamic frameworks and XCode just copy a platform depended entity from the xcframework to Frameworks folder of your .app instead of linking to your application's binary.

    XCode build log:

    PBXCp .../Hello.xcframework/ios-x86_64-simulator/libHello.a .../Test.app/Frameworks/libHello.a 
    

    There are two solutions:

    1. Compile library sources as dynamic frameworks and make the xcframework from them.
    2. If you have .a files only you can make dynamic frameworks wrappers which link static libraries and provides API access to them and then make the xcframework.