Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Errors converting xcarchive to IPA - single-bundle archive + missing plist method values

I'm trying to convert my xcarchive to an IPA (XCode 7.1.1). The following command

xcodebuild 
    -exportArchive -archivePath foo.xcarchive -exportPath . -exportFormat IPA

Fails with the error

the archive at path 'foo.xcarchive' is not a single-bundle archive

Since the above command is technically deprecated, I also tried the new form:

xcodebuild 
    -exportArchive -archivePath foo.xcarchive -exportPath . 
    -exportOptionsPlist ipa.plist

Where the ipa.plist is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
</dict>
</plist>

Which then resulted in the error:

error: exportArchive: exportOptionsPlist error for key 'method': expected one of {}, but found app-store

Now, trying to debug this I opened the xcarchive folder and inspected its structure. I noticed that I have a folder on the same level as Products\Applications\foo.app so I deleted it and tried again to no avail (same results). I then proceeded to delete files from within foo.app until I remained with nothing but the DWARF binary - still no cigar (same result), though that could have been due to the fact that I messed up the app signature by deleting files manually.

like image 445
Ohad Schneider Avatar asked Dec 14 '15 17:12

Ohad Schneider


2 Answers

Apple got back to me with a solution. As of Xcode 7 we should use xcodebuild instead of PackageApplication to produce the .ipa file.

xcodebuild has a new -exportArchive option to create an .ipa that works more like Xcode Organizer.

So we should now:

  1. build an archive with xcodebuild archive

  2. create the .ipa with xcodebuild -exportArchive

We now build the archive like this:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/myApp.xcarchive

We now export the .ipa like this:

xcodebuild -exportArchive -archivePath $PWD/build/myApp.xcarchive -exportOptionsPlist exportOptions.plist -exportPath $PWD/build

These two command create the files build/myApp.xcarchive and build/myApp.ipa

Note that xcodebuild -exportArchive requires a -exportOptionsPlist argument that points to a .plist file with export options. For a complete list of what you can put in that plist, run xcodebuild -help. The minimal contents of the file looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>YOUR_TEN_CHARACTER_TEAM_ID</string>
</dict>
</plist>
like image 93
Gaurav Gudaliya Avatar answered Sep 28 '22 09:09

Gaurav Gudaliya


Since the way you are creating an IPA is deprecated, you should do the following instead:

xcodebuild -scheme "Foo" -configuration Release clean build CODE_SIGN_IDENTITY="iPhone Distribution: Foo Corporation" -derivedDataPath "/path/to/some/folder/"

xcrun -sdk iphoneos PackageApplication "/path/to/some/folder/Build/Products/Release-iphoneos/foo.app" -o "/path/to/some/folder/foo.ipa"

Make sure you replace "Foo" with your schema name, and "iPhone Distribution: Foo Corporation" with your signing identity. And "/path/to/some/folder/" should be some build folder.

like image 38
Mohamed Mansour Avatar answered Sep 28 '22 07:09

Mohamed Mansour