Batch Build and Archive of iOS apps via Terminal
Asked Answered
A

2

8

I am trying to simplify the build->archive->submit process for iOS app publishing. We have over 50 mobile apps that have nearly identical framework, but with different artwork and configuration settings.

I normally would load each project in xcode 4.2 and build->archive->submit the usual way with the xcode GUI, but we are up over 50 apps now and this process is very tiresome any time we push out an update.

That being said, I am trying to speed up this process with using a shell function. I did plenty of research and found that xcodebuild (See Reid's answer) should work, however the Archive option is not working as I get the following error:

unsupported build action 'archive'

So I wrote the following:

# $1 should be a date like: 2012-07-17
# $2 should be a time like: 10.31AM
# $mybase will be the current directory at the time the function was called
# so make sure to cd into the folder containing the xcode project folders first

function xcodeArchive {
    mkdir ~/Library/Developer/Xcode/Archives/$1
    mybase=$PWD
    for x in `ls`
    do
        mkdir ~/Library/Developer/Xcode/Archives/$1/$x
        mkdir ~/Library/Developer/Xcode/Archives/$1/$x/dSYMs
        mkdir ~/Library/Developer/Xcode/Archives/$1/$x/Products
        mkdir ~/Library/Developer/Xcode/Archives/$1/$x/Products/Applications
        cd $mybase/$x
        xcodebuild
        #read -p "Press [Enter] to continue"
        cd $mybase/$x
        cp $x/$x-Info.plist ~/Library/Developer/Xcode/Archives/$1/$x/Info.plist
        cp -r build/Release-iphoneos/$x.app.dSYM ~/Library/Developer/Xcode/Archives/$1/$x/dSYMs/$x.app.dSYM
        cp -r build/Release-iphoneos/$x.app ~/Library/Developer/Xcode/Archives/$1/$x/Products/Applications/$x.app
        cd ~/Library/Developer/Xcode/Archives/$1/
        mv $x $x\ $1\ $2.xcarchive
        cd $mybase
    done
}
export -f xcodeArchive

I put this in my .bash_profile and everything runs correctly as I would expect, except I'm not copying the correct "Info.plist" and I can't figure out where to copy it from or how to generate it. So now I am stuck.

Xcode will recognize the archives, but it lists them under "Unknown Schema" and "Unnamed Archive" in the organizer.

Any help regarding now to get the correct Info.plist is greatly appreciated.

I also welcome recommendations on how to improve the script and/or a more efficient way to batch build+archive these iOS apps.

Note:

  • I am unable to upgrade beyond Xcode 4.2 as that requires (as I understand it) OS X 10.7+ which I am not able to obtain yet (company computer).

  • I am still very much a bash/shell novice, so I apologize for any ugly code/practice above.

  • Also, this is for official app submission, not for ad-hoc or anything like that.

Thanks again for your help.

Athiste answered 17/7, 2012 at 16:10 Comment(0)
A
1

OK I found a solution that will work. After doing a lot more searching and a lot of guess and check, I found I can still use the "archive" option with xcodebuild, I just have to specify a workspace and scheme and apparently I wasn't doing that correctly before as it now works.

So, for anyone looking for a similar solution (to batch archive xcode projects), here is my function:

# $mybase will be the current directory at the time the function was called
# so make sure to cd into the folder containing the xcode project folders first

function xcodeArchive {
    mybase=$PWD
    for x in `ls`
    do
        cd $mybase/$x
        xcodebuild -workspace $x.xcodeproj/project.xcworkspace -scheme $x archive
        cd $mybase
    done
}
export -f xcodeArchive
Athiste answered 20/7, 2012 at 15:14 Comment(0)
C
13

I had the same issue with the archive command, and found this question via Google. It would fail with this build command:

xcodebuild -verbose -project $ProductName.xcodeproj -target $ProductName -configuration Release -sdk $SDK clean archive CONFIGURATION_BUILD_DIR="$PROJECT_PATH/build" PROVISIONING_PROFILE="${DIST_PROVISONING_PROFILE}"

Yet, it would succeed with this build command:

xcodebuild -verbose -project $ProductName.xcodeproj -scheme $ProductName -configuration Release -sdk $SDK clean archive CONFIGURATION_BUILD_DIR="$PROJECT_PATH/build" PROVISIONING_PROFILE="${DIST_PROVISONING_PROFILE}"

The only difference is specifying the scheme in lieu of the target to build. If there is a sensible reason for this behavior, I'd enjoy hearing it.

I'm running XCode 4.5.1 on Mac OS X 10.7.5

Contractor answered 24/10, 2012 at 21:21 Comment(3)
Indeed, that was my finding as well. I still have not found an explanation for this, but my assumption is that it is just how that program was designed to execute, requiring a scheme... but that does not explain why the error message returned is so vague...Athiste
@Athiste What is espicially confusing as you muddle your way though, is the top command (the failure) works just fine if you are merely building, not attempting to archive that build for store submit.Contractor
oh that is indeed confusing (and strangely interesting). I had not tried it for non-archive purposes, but just tested it and you're right, it worked just fine... How strange!Athiste
A
1

OK I found a solution that will work. After doing a lot more searching and a lot of guess and check, I found I can still use the "archive" option with xcodebuild, I just have to specify a workspace and scheme and apparently I wasn't doing that correctly before as it now works.

So, for anyone looking for a similar solution (to batch archive xcode projects), here is my function:

# $mybase will be the current directory at the time the function was called
# so make sure to cd into the folder containing the xcode project folders first

function xcodeArchive {
    mybase=$PWD
    for x in `ls`
    do
        cd $mybase/$x
        xcodebuild -workspace $x.xcodeproj/project.xcworkspace -scheme $x archive
        cd $mybase
    done
}
export -f xcodeArchive
Athiste answered 20/7, 2012 at 15:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.