当前位置:  开发笔记 > 前端 > 正文

Xcode从命令行"构建和存档"

如何解决《Xcode从命令行"构建和存档"》经验,为你挑选了12个好方法。

Xcode 3.2在Build菜单"Build and Archive"下提供了一个很棒的新功能,它可以生成一个适合Ad Hoc分发的.ipa文件.您也可以打开管理器,转到"已存档的应用程序"和"将应用程序提交到iTunesConnect".

有没有办法从命令行使用"构建和存档"(作为构建脚本的一部分)?我认为xcodebuild会以某种方式涉及,但man页面似乎没有说明这一点.

更新 Michael Grinich要求澄清; 这就是命令行构建无法完成的功能,在"构建和存档"后,您只能使用Xcode的管理器.

    您可以点击"共享应用程序..."与Beta测试人员分享您的IPA.正如Guillaume在下面指出的,由于一些Xcode魔术,这个IPA文件不需要beta测试人员需要安装的单独分发的.mobileprovision文件; 这太神奇了.没有命令行脚本可以做到这一点.例如,Arrix的脚本(5月1日提交)不符合该要求.

    更重要的是,在您对测试版进行beta测试后,您可以单击"将应用程序提交到iTunes Connect",将完全相同的版本提交给Apple,即您测试的二进制文件,而无需重建.这在命令行中是不可能的,因为签署应用程序是构建过程的一部分; 您可以为Ad Hoc beta测试签名,或者您可以签名提交到App Store,但不能同时签署.在命令行上构建的IPA不能在手机上进行beta测试,然后直接提交给Apple.

我喜欢有人过来证明我错了:这两个功能在Xcode GUI中运行良好,无法从命令行复制.



1> vdaubry..:

我找到了如何从命令行自动化构建和归档过程,我刚刚写了一篇博客文章,解释了如何实现这一目标.

您必须使用的命令是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}"

您将在文章中找到所有细节.如果您有任何问题,请不要犹豫.


一段时间以来对我来说并不明显,但`RELEASE_BUILDDIR`需要是绝对的路径.
请注意,`-o"$ {ipa_path}"`中的ipa文件路径必须是绝对路径.否则你可能会得到'错误:无法创建'.../... ipa'`或者它会被默默地忽略创建.该死的,浪费了我几个小时.
另请注意,如果您希望在构建.app时保持使用相同的签名/配置文件,则不需要--sign或--embed选项.这将是您在Release配置的代码签名构建设置中设置的任何内容.
Xcode 8.3 Beta 1完全删除PackageApplication命令.不要再使用它并使用"xcodebuild -scheme archive",如下所示.
有人能告诉我{}大括号是做什么的吗?我假设他们照顾空白,但我可能是错的.

2> Reid Ellis..:

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

xcodebuild -scheme  archive

在此命令之后,存档将显示在Xcode管理器中.


请注意,除了工作空间和方案之外,`archive` action**不会遵循您通过此调用提供的任何设置** - 这只花费我**小时**!
这适用于创建存档,但xcrun中的PackageApplication实际上创建了.ipa文件.您需要通过TestFlight等方式将此文件分发给beta测试人员
在**Xcode 4.4**中正常工作,我确信它在4.3中也没问题.确保使用`xcode-select 的路径`选择了正确的Xcode版本
是的,好多了!为了使它工作,我做了以下操作:cd到你的项目文件夹,然后运行"xcodebuild -scheme MyProjectName archive"(因为通常,你有一个与你的项目名称同名的方案)
另外,你必须**用"-scheme `"指定方案
我正在尝试将此过程与持续集成工具集成,以便我可以分发给测试人员.文件系统上的.ipa放在哪里?

3> Raj..:

使用Xcode 9和Swift更新我的答案

档案

xcodebuild -workspace /.xcworkspace -scheme  clean archive -configuration release -sdk iphoneos -archivePath .xcarchive

IPA导出(请注意导出选项plist)

xcodebuild -exportArchive -archivePath  .xcarchive -exportOptionsPlist  /exportOptions.plist -exportPath  .ipa

对于那些不了解exportOptions.plist的人,https: //blog.bitrise.io/new-export-options-plist-in-xcode-9


那些使用它来构建CI/CD工具(如teamcity/jenkins)项目的人,请确保使用构建代理中安装的正确xcode进行存档和导出.

您可以使用以下2个选项中的任何一个.

    使用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测试的,对我来说工作正常.


它在Xcode6.1.1上运行得很好.我选择从终端构建我的应用程序,因为当我尝试从组织者构建AdHoc分发时,Xcode6给了我"您的帐户已经有一个有效的证书"错误.

4> Arrix..:

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

该脚本还会增加版本号.如果不需要,您可以删除该部分.希望能帮助到你.


这是一个很好的解决方案,尽管您的代码在没有注释的情况下有点难以阅读.你会写一些关于发生了什么的事吗?
现在使用WatchKit应用程序这个脚本是不够的.有谁知道使用watchkit应用程序的ipa文件的新规范?

5> FuePi..:

我们开发了一个带有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="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/\(

Aktuelle Version<\/h3>\)\(.*\)\(

Ältere Versionen<\/h3>.
    .
  • \)/\1\ ${ITUNES_LINK}\ \3\2<\/li>\
  • /g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

然后Jenkins将ipa,plist和html文件上传到我们的网络服务器.

这是plist模板:





    items
    
        
            assets
            
                
                    kind
                    software-package
                    url
                    https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa
                
                
                    kind
                    full-size-image
                    needs-shine
                    
                    url
                    https://xxx.xxx.xxx/iPadApp.png
                
                
                    kind
                    display-image
                    needs-shine
                    
                    url
                    https://xxx.xxx.xxx/iPadApp_sm.png
                
            
            metadata
            
                bundle-identifier
                xxx.xxx.xxx.iPadApp
                bundle-version
                ${VERSION}
                kind
                software
                subtitle
                iPad2-App
                title
                iPadApp
            
        
    


要进行此设置,您必须将分发证书和配置文件导入指定用户的钥匙串.


您还可以使用Apple的Plistbuddy命令更改plist文件,例如:/ usr/libexec/PlistBuddy -c"Set:CFBundleVersion 1.2.3.4"/path/to/info.plist.而不是玩SED :)

6> Nik..:

The xcodebuild tool can build and export archive products with the -exportArchive flag (as of Xcode 5). The export step was previously only possible via the Xcode Organizer UI.

First archive your app:

xcodebuild -scheme  archive

Given $ARCHIVE_PATH (the path to the .xcarchive file), export the app from the archive with one of the following:

iOS .ipa file:

xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"

Mac .app file:

xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"

In both commands the -exportProvisioningProfile and -exportSigningIdentity arguments are optional. man xcodebuild for details on the semantics. In these examples, the provisioning profile for the iOS build specified an AdHoc distribution provisioning profile, and the signing identity for the Mac app specified a Developer ID for export as a 3rd party application (i.e. not distributed via the Mac App Store).



7> zekel..:

我发现其他一些答案很难开始.这篇文章对我有用.某些路径可能需要是绝对的,如其他答案中所述.

命令:

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"



8> Duane Fields..:

实际上,您可以像XCode一样重新构建构建,以便您可以测试和发送相同的二进制文件.例如在我的脚本中(类似于上面的那些)我构建了我的发布版本,签名为AdHoc版本,然后我将其存档为IPA进行测试,然后使用我的发行版证书辞职并创建一个zip文件,这是我发送到的苹果.相关的是:

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



9> Teja Swaroop..:

我已经简要介绍了要遵循的步骤,以及使用下面的terrminal生成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成功之后,执行以下命令,使用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”)

    将在选定的输出目录" $ {OUTDIR} "中生成ipa



10> DawnSong..:

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

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

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

cd MyProjectFolder

第2步,使用Xcode或/usr/libexec/PlistBuddy exportOptions.plist创建导出选项plist文件.顺便xcrun xcodebuild -help说一句,会告诉你必须插入plist文件的键.

步骤3,按如下方式创建.xcarchive文件(实际上是文件夹)(build /目录将立即由Xcode自动创建),

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文件.只需将其发送到Apple App Store即可.

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



11> Suhaib..:

Xcode 8:


IPA格式:

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

使用配置文件MyMobileApp分发配置文件将存档MyMobileApp.xcarchive作为IPA文件导出到路径MyMobileApp.ipa.

APP格式:

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

使用应用程序阳离子签名身份开发者ID应用程序:我的团队将存档MyMacApp.xcarchive作为PKG文件导出到路径MyMacApp.pkg.安装程序签名标识Developer ID Installer:My Team隐式用于对导出的包进行签名.

Xcodebuild手册页



12> erick2red..:

转到项目根目录的文件夹,然后:

xcodebuild -project projectname -activetarget -activeconfiguration archive


这似乎不起作用."归档"构建操作在XCode 3.2.2(最终版)中不可用.
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有