Xcode 3.2在Build菜单下提供了一个很棒的新功能,“Build and Archive”,它可以生成一个适合Ad Hoc分发的。ipa文件。你也可以打开管理器,选择“存档应用程序”和“向iTunesConnect提交应用程序”。

有没有办法从命令行(作为构建脚本的一部分)使用“构建和存档”?我假设xcodebuild会以某种方式涉及到,但手册页似乎没有说任何关于这方面的内容。

Michael Grinich要求澄清;以下是你不能用命令行构建的功能,这些功能你只能在“构建和存档”之后用Xcode的管理器实现。

You can click "Share Application..." to share your IPA with beta testers. As Guillaume points out below, due to some Xcode magic, this IPA file does not require a separately distributed .mobileprovision file that beta testers need to install; that's magical. No command-line script can do it. For example, Arrix's script (submitted May 1) does not meet that requirement. More importantly, after you've beta tested a build, you can click "Submit Application to iTunes Connect" to submit that EXACT same build to Apple, the very binary you tested, without rebuilding it. That's impossible from the command line, because signing the app is part of the build process; you can sign bits for Ad Hoc beta testing OR you can sign them for submission to the App Store, but not both. No IPA built on the command-line can be beta tested on phones and then submitted directly to Apple.

我希望有人能来证明我是错的:这两个功能在Xcode GUI中都很好用,不能从命令行复制。


当前回答

我们使用XCode 4.2.1开发了一款iPad应用,并希望将其整合到我们的持续集成(Jenkins)中,以便OTA发行。下面是我想到的解决方案:

# Unlock keychain
security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain

# Build and sign app
xcodebuild -configuration Distribution clean build

# Set variables
APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app"
VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString`
REVISION=`defaults read $APP_PATH/Info CFBundleVersion`
DATE=`date +"%Y%m%d-%H%M%S"`
ITUNES_LINK="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>"

# Package and verify app
xcrun -sdk iphoneos PackageApplication -v build/Distribution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa

# Create plist
cat iPadApp.plist.template | sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATE}/$DATE/" -e "s/\${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist

# Update index.html
curl https://xxx.xxx.xxx/index.html -o index.html.$DATE
cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>&Auml;ltere Versionen<\/h3>.<ul>.<li>\)/\1\
${ITUNES_LINK}\
\3\2<\/li>\
<li>/g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

然后Jenkins将ipa、plist和html文件上传到我们的web服务器。

这是plist模板:

<?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>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp.png</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp_sm.png</string>
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>xxx.xxx.xxx.iPadApp</string>
                <key>bundle-version</key>
                <string>${VERSION}</string>
                <key>kind</key>
                <string>software</string>
                <key>subtitle</key>
                <string>iPad2-App</string>
                <key>title</key>
                <string>iPadApp</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

要设置此设置,必须将分发证书和配置配置文件导入到指定用户的keychain中。

其他回答

为了改进Vincent的回答,我写了一个脚本:xcodearchive 它允许您通过命令行存档(生成ipa)您的项目。 可以把它看作xcodebuild命令的姐妹,但用于归档。

代码可在github: http://github.com/gcerquant/xcodearchive

该脚本的一个选项是启用dSYM符号在时间戳存档中的存档。没有理由不再保留这些符号,也没有理由不再标记以后可能收到的崩溃日志。

进入你的项目根目录,然后:

xcodebuild -project projectname -activetarget -activeconfiguration archive

我一直在使用自己的构建脚本为临时分发生成ipa包。

die() {
    echo "$*" >&2
    exit 1
}

appname='AppName'
config='Ad Hoc Distribution'
sdk='iphoneos3.1.3'
project_dir=$(pwd)

echo using configuration $config

echo updating version number
agvtool bump -all
fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))"
echo building version $fullversion

xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed"

echo making ipa...
# packaging
cd build/"$config"-iphoneos || die "no such directory"
rm -rf Payload
rm -f "$appname".*.ipa
mkdir Payload
cp -Rp "$appname.app" Payload/
if [ -f "$project_dir"/iTunesArtwork ] ; then
    cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork
fi

ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa"
zip -r $ipaname Payload

echo finished making $ipaname

脚本还增加版本号。如果不需要,你可以去掉那部分。希望能有所帮助。

打开终端,拖放你的项目文件夹:

cd / \用户/用户名/桌面演示

依次执行以下命令:

将应用程序构建为-“demo”。Xcodeproj”放入存档

Xcodebuild存档项目演示。xcodeproj -scheme demo -archivePath /Users/username/Desktop/demo.xcarchive

如果你的应用程序有Podfile fie as-"demo.xcworkspace"-

xcodebuild -workspace项目名称。xcworkspace -scheme Scheme-Name -sdk iphoneos -configuration Release provision - profile = " Provision-Name " Development_Team= " Team-ID " archive -archivePath /Path/To/Output/AppName。xcarchive存档

IPA导出构建命令

下载ExportOptions。plist文件从这里

xcodebuild -exportArchive -archivePath / ulpa /桌面/演示。xcarchive -exportPath /用户/shilpa/桌面/演示。科学exportionspite /用户/shilpa/导出

对于Xcode 7,你有一个更简单的解决方案。唯一的额外工作是您必须创建一个用于导出存档的配置plist文件。

(与Xcode 6相比,在xrun的结果中xcodebuild -help, -exportFormat和-exportProvisioningProfile选项不再被提及;前者被删除,后者被-exportOptionsPlist取代。)

步骤1,将目录更改为包含.xcodeproject或.xcworkspace文件的文件夹。

cd MyProjectFolder

第二步,使用Xcode或/usr/libexec/PlistBuddy exportOptions。创建导出选项的Plist文件。顺便说一下,xcrun xcodebuild -help会告诉你必须向plist文件插入哪些键。

第三步,创建。xcarchive文件(实际上是文件夹),如下所示(build/ directory将由Xcode立即自动创建),

xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive

第四步,像这样导出。ipa文件,这与Xcode6不同

xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist

现在,您将在build/ directory中获得一个ipa文件。只要把它发送到苹果应用商店。

顺便说一下,Xcode 7创建的ipa文件比Xcode 6大得多。