Xcode的“build立和存档”从命令行

Xcode 3.2提供了一个非常棒的新function,它可以生成一个适合Ad Hoc分发的.ipa文件。 您也可以打开pipe理器,转到“已存档的应用程序”和“提交应用程序到iTunesConnect”。

有没有办法从命令行(作为构build脚本的一部分)使用“构build和存档”? 我假设xcodebuild会以某种方式参与,但man页似乎没有说到这一点。

更新 Michael Grinich要求澄清; 以下是命令行构build无法完成的function,在“构build和存档”之后,您只能使用Xcode的Organizer进行这些function。

  1. 您可以点击“共享应用程序…”与betatesting人员分享您的IPA。 正如Guillaume指出的那样,由于一些Xcode的魔力,这个IPA文件不需要betatesting者需要安装的单独分发的.mobileprovision文件。 这是神奇的。 没有命令行脚本可以做到这一点。 例如,Arrix的脚本(5月1日提交)不符合要求。
  2. 更重要的是,在testing版本之后,您可以单击“提交应用程序到iTunes Connect”,将相同的内部版本提交给Apple,这是您testing的二进制文件,无需重新编译。 这在命令行中是不可能的,因为签名应用程序是构build过程的一部分; 您可以签署位进行Ad Hoctesting,或者您可以签名提交给App Store,但不能同时提交。 没有build立在命令行上的IPA可以在手机上testing,然后直接提交给苹果公司。

我喜欢有人来certificate我错了:这两个function在Xcode GUI中都很好用,不能从命令行复制。

我发现如何从命令行自动化构build和存档过程,我只写了一篇博客文章,解释如何实现这一点。

您必须使用的命令是xcrun

 /usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}" 

你会在文章中find所有的细节。 如果您有任何疑问,请不要犹豫。

使用Xcode 4.2,您可以使用-scheme标志来执行此操作:

 xcodebuild -scheme <SchemeName> archive 

在此命令之后,存档将显示在Xcode Organizer中。

这是用于创build归档和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 5testing,并为我工作得很好。

我一直在使用我自己的构build脚本来生成临时分发的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 

该脚本还会增加版本号。 如果不需要,可以删除该部分。 希望它有帮助。

我们开发了一个带有XCode 4.2.1的iPad应用程序,并且希望将这个构build集成到我们持续集成(Jenkins)的OTA发布中。 这是我提出的解决scheme:

 # 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和htmlfile upload到我们的networking服务器。

这是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> 

要进行设置,您必须将分发证书和configuration文件导入到指定用户的钥匙串中。

xcodebuild工具可以使用-exportArchive标志(从Xcode 5开始)构build和导出归档产品。 导出步骤以前只能通过Xcode Organizer UI进行。

先存档你的应用程序:

 xcodebuild -scheme <scheme name> archive 

给定$ARCHIVE_PATH.xcarchive文件的path),使用以下之一导出应用程序:

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版本的configuration文件指定了AdHoc发行版configuration文件,Mac应用程序的签名标识指定了作为第三方应用程序(即,不通过Mac App Store发布)导出的Developer ID。

我发现一些其他的答案很难做到。 这篇文章 ,如果对我来说。 有些path可能需要是绝对的,正如其他答案中提到的那样。

命令:

 xcrun -sdk iphoneos PackageApplication \ "/path/to/build/MyApp.app" \ -o "output/path/to/MyApp.ipa" \ --sign "iPhone Distribution: My Company" \ --embed "/path/to/something.mobileprovision" 

您实际上可以像XCode一样退出构build,以便您可以testing并提供相同的二进制文件。 例如在我的脚本(类似于上面的那样)中,我构build了我的发行版本,签名为AdHoc版本,然后将其归档为IPA进行testing,然后用我的发行证书进行辞职并创build一个zip文件,这就是我发送给苹果。 相关的行是:

 codesign -f -vv -s "$DistributionIdentity" "$APPDIR" 

对于Xcode 7 ,你有一个更简单的解决scheme。 唯一的额外的工作是,你必须创build一个configurationplist文件导出档案。

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

步骤1 ,将目录切换到包含.xcodeproject或.xcworkspace文件的文件夹。

 cd MyProjectFolder 

第2步 ,使用Xcode或/usr/libexec/PlistBuddy exportOptions.plist创build导出选项plist文件。 顺便说一下, xcrun xcodebuild -help会告诉你什么键你要插入到plist文件。

第3步 ,创build.xcarchive文件(实际上文件夹)如下(build /目录将由Xcode自动创build),

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

第4步 ,导出为这样的.ipa文件,这与Xcode6不同

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

现在,你在build /目录下得到一个ipa文件。 只要把它发送到苹果App Store。

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

我已经简要描述了要遵循的步骤,以及使用以下terrminal生成ipa时要传递的参数:

  1. 转到terminal中包含MyApp.xcodeproject文件的文件夹

  2. 通过使用下面给出的命令,您将获得应用程序的所有目标

     /usr/bin/xcodebuild -list 
  3. 执行上述命令后,您将得到一个目标列表,您应该select需要生成.ipa的特定目标

     /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release 
  4. 上述命令构build项目并创build一个.app文件。find.app文件的path是./build/Release-iphoneos/MyApp.app

  5. Build成功后,执行以下命令,使用以下语法使用Developer Name和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”) 
  1. ipa将在选定的输出目录“ $ {OUTDIR} ”中生成

Xcode 8:


IPA格式:

 xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile' 

使用供应configuration文件MyMobileApp Distribution Profile将归档MyMobileApp.xcarchive作为IPA文件导出到pathMyMobileApp.ipa。

APP格式:

 xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team' 

使用应用程序阳离子签名身份将存档MyMacApp.xcarchive作为PKG文件导出到pathMyMacApp.pkg开发人员ID应用程序:我的团队。 安装程序签名身份“开发者ID安装程序:我的团队”隐式用于对导出的包进行签名。

Xcodebuild手册页

转到您的项目根目录下的文件夹:

 xcodebuild -project projectname -activetarget -activeconfiguration archive 

更进一步,用Xcode 7通过命令行上传到iTunesConnect! (假设您已经使用正确的发行版configuration文件和签名标识签署了.ipa 。)

inputaltool ,即应用程序加载器的CLI界面( docs ,第38页)。 隐藏在Xcode.app的结构中,是一个方便的function,可以让我们直接上传到ItunesConnect。

 /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool 

只需运行$ altool --upload-app -f file -u username [-p password]将您刚刚铸造的.ipa直接上传到Apple。 密码是可选的,如果你离开命令,会提示你。

如果在validation步骤中应用程序有任何问题,控制台将打印出来。

如果不想保存位置,则可能必须将path导出到altool

 export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/ 

而已! 只需login到iTunesConnect.com并select您的新版本以使用testflight进行testing。

最后注意:如果Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application ,你可以按照这个SO回答的build议,运行一个符号链接到正确的位置:

 ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms 

文森特的答案改善,我写了一个脚本来做到这一点: xcodearchive
它允许你通过命令行来存档(生成一个ipa)你的项目。 把它看作是xcodebuild命令的姊妹,而不是归档。

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

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

请尝试xctool,它是Apple的xcodebuild的替代品,可以更轻松地构build和testingiOS和Mac产品。 这对持续集成特别有用。 它有一些额外的function:

  1. 运行与Xcode.app相同的testing。
  2. 结构化输出的构build和testing结果。
  3. 人性化的ANSI颜色输出。

No.3是非常有用的。 我不知道,如果任何人都可以读取xcodebuild的控制台输出,我不能,通常它给了我一行5000 +字符。 甚至比一篇论文还难读。

xctool: https : //github.com/facebook/xctool

如果你使用下一个工具: https : //github.com/nomad/shenzhen

那么这个任务很简单:

 which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc' ipa build --verbose --scheme "${schemeName}" 

资源

更新到Xcode 8后,我发现企业ipa生成

 /usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}" 

由于某些签名问题,命令不能启动。 该日志表示“警告:PackageApplication已弃用,请改用xcodebuild -exportArchive

所以我切换到xcodebuild -exportArchive ,一切都恢复正常。

你的意思是validation/分享/提交选项? 我认为这些是特定于Xcode,不适合命令行构build工具。

有一些聪明,我敢打赌,你可以写一个脚本来为你做。 看起来他们只是存储在~/Library/MobileDevice/Archived Applications/ UUDI和plist。 我无法想象这将是很难反向工程validation者。

我感兴趣的自动化过程是将构build发送给betatesting人员。 (由于App Store提交不经常发生,我不介意手动执行,特别是因为我经常需要添加新的描述文本。)通过使用Xcode的CLI执行伪Build + Archive,我可以从每个代码提交中触发自动构build,使用embedded式configuration文件创buildIPA文件,并将其发送给testing人员。