tools - xcodebuild command line




Xcode的“建立和存檔”從命令行 (12)

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'

使用應用程序陽離子簽名身份將存檔MyMacApp.xcarchive作為PKG文件導出到路徑MyMacApp.pkg開發人員ID應用程序:我的團隊。 安裝程序簽名標識Developer ID Installer:My Team隱式用於簽名導出的包。

Xcodebuild手冊頁

Xcode 3.2在構建菜單“構建和存檔”下提供了一個非常棒的新功能,它可以生成適用於Ad Hoc分發的.ipa文件。 您也可以打開管理器,轉到“存檔應用程序”和“提交應用程序到iTunesConnect”。

有沒有辦法從命令行(作為構建腳本的一部分)使用“構建和存檔”? 我假設xcodebuild會以某種方式參與進來,但man頁似乎沒有提到這件事。

更新 Michael Grinich要求澄清; 以下是您無法使用命令行構建的功能,這是您在“構建和存檔”後只能使用Xcode的組織者執行的功能。

  1. 您可以點擊“共享應用程序...”與beta測試人員分享您的IPA。 正如Guillaume指出的那樣,由於一些Xcode的魔力,這個IPA文件不需要beta測試者需要安裝的單獨分發的.mobileprovision文件; 這很神奇。 沒有命令行腳本可以做到。 例如,Arrix的腳本(5月1日提交)不符合該要求。
  2. 更重要的是,在測試版本之後,您可以單擊“將應用程序提交到iTunes Connect”,將相同的內部版本提交給蘋果公司(您測試的二進製文件),而無需重新構建它。 這在命令行中是不可能的,因為簽名應用程序是構建過程的一部分; 您可以為Ad Hoc beta測試簽名,或者您可以簽署它們以提交給App Store,但不能同時提交。 沒有建立在命令行上的IPA可以在手機上進行beta測試,然後直接提交給Apple。

我非常喜歡有人來證明我錯了:這些功能在Xcode GUI中都很好用,並且不能從命令行複制。


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應用程序的簽名標識指定了一個Developer ID作為第三方應用程序導出(即,不通過Mac App Store發布)。


使用Xcode 4.2,您可以使用-scheme標誌來執行此操作:

xcodebuild -scheme <SchemeName> archive

在此命令之後,存檔將顯示在Xcode Organizer中。


嘗試xctool,它是Apple的xcodebuild的替代品,可以更輕鬆地構建和測試iOS和Mac產品。 這對於持續集成尤其有用。 它有一些額外的功能:

  1. 運行與Xcode.app相同的測試。
  2. 構建和測試結果的結構化輸出。
  3. 人性化的ANSI顏色輸出。

No.3非常有用。 我不知道,如果任何人都可以閱讀xcodebuild的控制台輸出,我不能,通常它給了我一行5000多個字符。 比畢業論文更難閱讀。

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


對於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文件。 只需將它發送到蘋果App Store即可。

順便說一下,由Xcode 7創建的ipa文件比Xcode 6要大得多​​。


您實際上可以像XCode一樣退出構建,以便測試並發布相同的二進製文件。 例如在我的腳本中(與上麵類似),我構建了我的發布版本,簽名為AdHoc版本,然後將其歸檔為IPA進行測試,然後使用我的發行證書進行辭職並創建一個zip文件,這是我發送給蘋果。 相關的行是:

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

我們開發了一款帶有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文件上傳到我們的網絡服務器。

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

要進行設置,您必須將分發證書和配置文件導入指定用戶的鑰匙串。


我已經簡要描述了要遵循的步驟以及使用以下terrminal生成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} ”中生成

我發現如何從命令行自動化構建和歸檔過程,我只寫了一篇博客文章,解釋如何實現這一點。

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

你會在文章中找到所有的細節。 如果您有任何疑問,請不要猶豫。


改進文森特的答案,我寫了一個腳本來做到這一點: xcodearchive
它允許你通過命令行來存檔(生成一個ipa)你的項目。 把它看作xcodebuild命令的姊妹,但是用於歸檔。

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


腳本的一個選項是啟用時間戳存檔中的dSYM符號存檔。 沒有理由不再保留這些符號,也無法像徵以後可能收到的崩潰日誌。


更進一步,使用Xcode 7通過命令行上傳到iTunesConnect! (假設您以一個已經使用正確的發行版配置文件和簽名標識簽署的.ipa開頭。)

輸入altool ,Application Loader的CLI界面( docs ,頁面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直接上傳到Apple。 密碼是可選的,如果你離開命令,它會提示你。

如果在驗證步驟中應用程序出現任何問題,控制台將打印出來。

如果您不想保存位置,您可能必須將路徑導出到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 Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application ,你可以按照這個SO回答的建議,運行一個符號鏈接到正確的位置:

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

轉到您的項目根目錄所在的文件夾,然後:

xcodebuild -project projectname -activetarget -activeconfiguration archive




build