web-dev-qa-db-ja.com

コマンドラインからXcode "Build and Archive"

Xcode 3.2では、ビルドメニューの下に、アドホック配布に適した.ipaファイルを生成する「ビルドとアーカイブ」という素晴らしい新機能が追加されました。オーガナイザーを開いて、「アーカイブされたアプリケーション」および「iTunesConnectにアプリケーションを送信する」に進むこともできます。

(ビルドスクリプトの一部として)コマンドラインから "Build and Archive"を使用する方法はありますか?私はxcodebuildが何らかの形で関与すると思いますが、manページはこれについて何も言っていないようです。

UPDATEMichael Grinichは説明を求めました。これがまさにあなたが「ビルドとアーカイブ」した後にあなたがXcodeのオーガナイザーでのみできる機能、コマンドラインビルドではできないことです。

  1. IPAをベータテスターと共有するには、[Share Application ...]をクリックします。 Guillaumeが以下に指摘するように、いくつかのXcodeの魔法のために、このIPAファイルはベータテスターがインストールする必要がある別に配布された.mobileprovisionファイルを必要としません。それは魔法です。コマンドラインスクリプトでは実行できません。たとえば、5月1日に提出されたArrixのスクリプトは、その要件を満たしていません。
  2. さらに重要なのは、ビルドをベータテストした後、「アプリケーションをiTunes Connectに送信」をクリックして、まったく同じビルドを、再ビルドせずにテスト済みのバイナリとしてAppleに送信することです。アプリへの署名はビルドプロセスの一部であるため、コマンドラインからは不可能です。 Ad Hocベータテスト用のビットに署名することができますOR App Storeに提出するために署名することはできますが、両方には適用できません。コマンドライン上に構築されたIPAは、電話でベータテストを行い、その後直接アップルに提出することはできません。

誰かが一緒に来て、私が間違っていることを証明したいと思います。これらの機能は両方ともXcode GUIでうまく機能し、コマンドラインから複製することはできません。

374
Dan Fabulich

コマンドラインからビルドとアーカイブのプロセスを自動化する方法を見つけたので、それを達成する方法を説明した ブログ記事 を書きました。

使用しなければならないコマンドは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}"

あなたは 記事 にすべての詳細を見つけるでしょう。ご質問がありましたらお気軽にお尋ねください。

308
vdaubry

Xcode 4.2では、これを行うために-schemeフラグを使用できます。

xcodebuild -scheme <SchemeName> archive

このコマンドの後、アーカイブはXcode Organizerに表示されます。

274
Reid Ellis

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ツールでプロジェクトをビルドするためにこれを使っていた人は、あなたがアーカイブとエクスポートの両方にbuild agentにインストールされている正しいxcodeを使っていることを確認してください。

これには以下の2つのオプションのいずれかを使用できます。

  1. Xcodebuildのフルパスを使います。

/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild

  1. Xcode-selectを使う

xcode-select -switch /Applications/Xcode 9.3.1.app


以下は古い答えです

これは、アーカイブを作成するためのコマンドラインスクリプトとIPAの例です。私はDesktop/MyiOSAppフォルダにあるiPhone xcodeプロジェクトを持っています。

以下のコマンドを順番に実行してください。

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でテストされ、私のためにうまく働いています。

125
Raj

アドホック配布用の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

スクリプトはバージョン番号も増やします。不要な場合はその部分を削除できます。それが役に立てば幸い。

27
Arrix

私たちはXCode 4.2.1でiPadアプリを開発し、そのビルドをOTA配布用の継続的インテグレーション(Jenkins)に統合したいと考えました。これが私が思いついた解決策です:

# 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>

これを設定するには、配布証明書とプロビジョニングプロファイルを指定されたユーザーのキーチェーンにインポートする必要があります。

24
FuePi

xcodebuildツールは(Xcode 5以降) - exportArchiveフラグを使用してアーカイブ製品を構築およびエクスポートできます。エクスポート手順は、以前は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はサードパーティアプリケーションとしてエクスポートするための開発者IDを指定しました(つまり、Mac App Store経由で配布されません)。

23
Nik

私は他のいくつかの答えをここで見つけるのが難しいと思った。 この記事 は私のためでした。他の答えで述べたように、いくつかの経路は絶対である必要があるかもしれません。

コマンド:

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"
16
zekel

XCodeがそうであるように、あなたは実際にビルドを辞任することができますので、あなたは同じバイナリをテストして出荷することができます。たとえば、私のスクリプトでは(上記のスクリプトと同様に)AdHocビルドとして署名された自分のリリースバージョンをビルドし、それをテスト用のIPAとしてアーカイブし、配布証明書で辞任してZipファイルを作成します。林檎。関連する行は次のとおりです。

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
15
Duane Fields

以下の手順と、ターミナルを使用してipaを生成する際に渡すパラメータについて簡単に説明しました。

  1. ターミナルでMyApp.xcodeprojectファイルを含むフォルダに移動します

  2. 下記のコマンドを使用すると、アプリケーションのすべてのターゲットが表示されます。

    /usr/bin/xcodebuild -list 
    
  3. 上記のコマンドが実行された後、あなたは.ipaを生成する必要がある特定のターゲットを選択する必要があるターゲットのリストを取得します。

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
    
  4. 上記のコマンドはプロジェクトをビルドし、.appファイルを作成します。appファイルを見つけるためのパスは./build/Release-iphoneos/MyApp.appです。

  5. ビルドが成功したら、次のコマンドを実行して、開発者名とプロビジョニングプロファイルを使用して以下の構文を使用してアプリケーションの.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}"
14
Teja Swaroop

Xcode 7では、もっと簡単な解決策があります。唯一の追加作業は、アーカイブをエクスポートするための構成plistファイルを作成する必要があるということです。

xcrun xcodebuild -help-exportFormatおよび-exportProvisioningProfileオプションの結果では、Xcode 6と比較して、これ以上言及されていません。前者は削除され、後者は-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よりもはるかに大きくなっています。

14
DawnSong

Xcode 8:


IPAフォーマット:

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

プロビジョニングプロファイルMyMobileApp Distribution Profileを使用して、アーカイブMyMobileApp.xcarchiveをIPAファイルとしてパスMyMobileApp.ipaにエクスポートします。

APPフォーマット:

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

アプリケーションMyCacApp.xcarchiveをPKGファイルとしてMyMacApp.pkgというパスに、アプリケーションアプリケーションカチオン署名IDの開発者IDアプリケーション:My Teamを使ってエクスポートします。インストーラ署名ID開発者IDインストーラ:私のチームは、エクスポートされたパッケージに署名するために暗黙的に使用されます。

Xcodebuildのmanページ

8
Suhaib

プロジェクトのルートとなるフォルダに移動して、

xcodebuild -project projectname -activetarget -activeconfiguration archive
6
erick2red

さらに一歩進んで、Xcode 7を使ってコマンドラインからiTunesConnectにアップロードしましょう。 (あなたが正しいリリースプロファイルと署名のアイデンティティで署名された.ipaから始めていると仮定します。)

Application Loader用のCLIインターフェイスであるaltoolを入力します( docs 、page 38)。 Xcode.appの構造の奥深くに隠れていますが、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を直接アップルにアップロードしてください。パスワードはオプションです。コマンドを省略すると、パスワードの入力を求められます。

確認手順中にアプリに問題があると、コンソールにそれらが表示されます。

場所を保存したくない場合は、おそらくパスをaltoolにエクスポートする必要があります。

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

それでおしまい! iTunesConnect.comにログインしてtestflightでテストするための新しいビルドを選択するだけです。

最後の注意:Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the applicationというエラーが表示された場合は、 this SO answer の提案に従ってください。正しい場所にシンボリックリンクを実行します。

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

Vincentの答えを改良して、私はそれをするためのスクリプトを書きました:xcodearchive
コマンドラインを使ってプロジェクトをアーカイブ(ipaを生成)することができます。これはxcodebuildコマンドの姉妹のようだが、アーカイブ用だと考えてください。

コードはgithubで入手できます。 http://github.com/gcerquant/xcodearchive


スクリプトの1つのオプションは、タイムスタンプ付きアーカイブ内のdSYMシンボルのアーカイブを有効にすることです。シンボルをもう保管しないという言い訳はしません。また、後で受け取る可能性があるクラッシュログを象徴することはできません。

3
Guillaume

あなたが次のツールを使用する場合: 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}"

ソース

2

xctoolを試してみてください。これはAppleのxcodebuildに代わるもので、iOSおよびMac製品の構築とテストを容易にします。継続的な統合に特に役立ちます。いくつかの追加機能があります。

  1. Xcode.appと同じテストを実行します。
  2. ビルドおよびテスト結果の構造化出力.
  3. 人間に優しい、ANSIカラーの出力。

3番は非常に便利です。誰かがxcodebuildのコンソール出力を読むことができるかどうか私はできません、私はできません、通常5000 +文字で1行を与えてくれました。論文よりも読むのが難しいです。

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

2
Zitao Xiong

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}" 

何らかの署名の問題のため、コマンドを起動できません。ログには、「warning:PackageApplicationは推奨されていません。代わりにxcodebuild -exportArchiveを使用してください。

だから私はxcodebuild -exportArchiveに切り替えると、すべて正常に戻りました。

2
Jidong Chen

コマンドでiOSプロジェクトをビルドするにはどうすればいいですか?

Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name 

&&

Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive 

&&

Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist


ExportOptions.plistとは何ですか?

XcodeではExportOptions.plistが必要です。 ipaファイルを作成するときにいくつかのオプションを指定できます。 Xcodeを使ってアプリをアーカイブするときに、使いやすいUIでオプションを選択できます。

重要:ExportOptions.plistではリリースと開発の方法が異なります

AppStore:

exportOptions_release〜method = app-store

開発

exportOptions_dev〜method = development

あなたは検証/共有/送信オプションを意味ですか?これらはXcode特有のもので、コマンドラインビルドツールには適していないと思います。

いくらか巧みに、私はあなたがあなたのためにそれをするためにスクリプトを作ることができると思います。それらはUUDIとplistと共に~/Library/MobileDevice/Archived Applications/に格納されているようです。バリデータをリバースエンジニアリングするのもそれほど難しいことではないと思います。

私が興味を持っているプロセスは、ベータテスターに​​ビルドを送ることです。 (App Storeからの送信はめったに行われないので、特に新しい説明テキストを追加する必要がある場合が多いので、手動で入力することをお勧めします)埋め込みプロビジョニングプロファイルを使用してIPAファイルを作成し、それをテスターに​​電子メールで送信します。

1
Michael Grinich