Xcode 3.2在“生成”菜单的“生成和存档”下提供了一个很棒的新功能,该功能生成一个适用于Ad Hoc分发的.ipa文件。 您也可以打开管理器,转到“存档的应用程序”,然后“将应用程序提交到iTunesConnect”。
有没有一种方法可以从命令行使用“构建和存档”(作为构建脚本的一部分)? 我以为xcodebuild
会以某种方式参与其中,但是man
页似乎没有对此发表任何评论。
更新 Michael Grinich要求澄清; 这就是您完全无法使用命令行构建的功能,这些功能只有在“构建并存档”之后才能使用Xcode的Organizer进行。
- 您可以单击“共享应用程序...”与Beta测试人员共享IPA。 正如Guillaume在下面指出的那样,由于Xcode的神奇之处,此IPA文件不需要Beta测试人员需要安装的单独分发的.mobileprovision文件。 太神奇了。 没有命令行脚本可以做到这一点。 例如,Arrix的脚本(5月1日提交)不符合该要求。
- 更重要的是,在对Beta版本进行Beta测试之后,您可以单击“将应用程序提交到iTunes Connect”以将完全相同的版本提交给Apple(您测试过的二进制文件),而无需重新构建。 在命令行中这是不可能的,因为对应用程序进行签名是构建过程的一部分。 您可以签名进行Ad hoc beta测试,也可以签名以提交到App Store,但不能同时签名。 无法在手机上对基于命令行的IPA进行Beta测试,然后直接提交给Apple。
我希望有人能证明我做错了:这两个功能在Xcode GUI中都很好用,并且不能从命令行复制。
#1楼
我们使用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>Ältere Versionen<\/h3>.<ul>.<li>\)/\1\
${ITUNES_LINK}\
\3\2<\/li>\
<li>/g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html
然后,詹金斯将ipa,plist和html文件上传到我们的网络服务器。
这是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>
要进行此设置,您必须将分发证书和配置文件导入到指定用户的钥匙串中。
#2楼
请尝试使用xctool,它是Apple xcodebuild的替代产品,可以更轻松地构建和测试iOS和Mac产品。 对于持续集成特别有用。 它具有一些额外的功能:
- 运行与Xcode.app相同的测试。
- 构建和测试结果的结构化输出。
- 人性化的ANSI彩色输出。
3号非常有用。 如果有人能阅读xcodebuild的控制台输出,我也不知道,通常它给了我一行5000多个字符。 比论文更难读。
xctool: https : //github.com/facebook/xctool
#3楼
我在下面给出了要执行的步骤的简要说明,以及在以下使用Terminal生成ipa时要传递的参数:
转到终端中包含MyApp.xcodeproject文件的文件夹
通过使用下面给出的命令,您将获得应用程序的所有目标
/usr/bin/xcodebuild -list
执行上述命令后,您将获得一个目标列表,您应该选择一个目标来生成.ipa。
/usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
上面的命令将构建项目并创建一个.app文件。找到该.app文件的路径是
./build/Release-iphoneos/MyApp.app
Build成功后,执行以下命令以使用开发人员名称和Provisioning Profile使用以下语法生成应用程序的.ipa:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}”
上面语法中每个参数的说明:
${TARGET}.app == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app)
${OUTDIR} == Select the output directory(Where you want to save .ipa file)
${IDENTITY} == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access)
${PROVISONING_PROFILE} == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”)
- 将在选定的输出目录“ $ {OUTDIR} ”中生成ipa
#4楼
xcodebuild
工具可以使用-exportArchive标志(从Xcode 5开始)构建和导出存档产品。 以前只能通过Xcode Organizer UI进行导出步骤。
首先存档您的应用程序:
xcodebuild -scheme <scheme name> archive
给定$ARCHIVE_PATH
( .xcarchive文件的路径),请使用以下选项之一从存档中导出应用程序:
iOS .ipa文件:
xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"
Mac .app文件:
xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"
在这两个命令中, -exportProvisioningProfile和-exportSigningIdentity参数都是可选的。 请参阅man xcodebuild
以获取有关语义的详细信息。 在这些示例中,iOS构建的配置文件指定了AdHoc分发配置文件,而Mac应用程序的签名身份指定了要作为第三方应用程序导出的开发人员ID(即未通过Mac App Store分发)。
#5楼
使用Xcode 9和Swift更新我的答案
封存
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive
IPA导出 ( 请注意导出选项plist )
xcodebuild -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist <ProjectName>/exportOptions.plist -exportPath <ProjectName>.ipa
对于那些不了解exportOptions.plist的人, 请https://blog.bitrise.io/new-export-options-plist-in-xcode-9
那些使用此工具在teamcity / jenkins等CI / CD工具中构建项目的人,请确保使用正确的xcode安装在构建代理中进行存档和导出。
您可以使用以下两个选项之一。
- 使用完整路径进行xcodebuild,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
- 使用xcode-select,
xcode-select -switch /Applications/Xcode 9.3.1.app
下面是老答案
这是用于创建存档和IPA示例的命令行脚本。 我有一个iPhone xcode项目,它位于Desktop / MyiOSApp文件夹中。
一一执行以下命令。
cd /Users/username/Desktop/MyiOSApp/
xcodebuild -scheme MyiOSApp archive \
-archivePath /Users/username/Desktop/MyiOSApp.xcarchive
xcodebuild -exportArchive -exportFormat ipa \
-archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \
-exportPath "/Users/username/Desktop/MyiOSApp.ipa" \
-exportProvisioningProfile "MyCompany Distribution Profile"
这已通过Xcode 5进行了测试,对我来说工作正常。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3165545