xcode कमांड लाइन से एक्सकोड "बिल्ड एंड आर्काइव"




command-line build (15)

एक्सकोड 4.2 के साथ आप यह करने के लिए -शेम ध्वज का उपयोग कर सकते हैं:

xcodebuild -scheme <SchemeName> archive

इस आदेश के बाद संग्रह एक्सकोड ऑर्गनाइज़र में दिखाई देगा।

एक्सकोड 3.2 बिल्ड मेनू, "बिल्ड एंड आर्काइव" के तहत एक शानदार नई सुविधा प्रदान करता है जो विज्ञापन हॉक वितरण के लिए उपयुक्त एक .ipa फ़ाइल उत्पन्न करता है। आप ऑर्गनाइज़र भी खोल सकते हैं, "संग्रहीत अनुप्रयोग" पर जा सकते हैं, और "iTunesConnect पर एप्लिकेशन सबमिट करें।"

क्या कमांड लाइन (बिल्ड स्क्रिप्ट के हिस्से के रूप में) से "बिल्ड और आर्काइव" का उपयोग करने का कोई तरीका है? मुझे लगता है कि xcodebuild किसी भी तरह शामिल होगा, लेकिन man पेज इस बारे में कुछ भी नहीं कहता है।

अद्यतन माइकल Grinich स्पष्टीकरण का अनुरोध किया; यहां आप वास्तव में कमांड लाइन बिल्ड के साथ क्या नहीं कर सकते हैं, विशेषताओं के साथ आप "बिल्ड और आर्काइव" के बाद केवल एक्सकोड के ऑर्गनाइज़र के साथ ही कर सकते हैं।

  1. बीटा टेस्टर्स के साथ अपना आईपीए साझा करने के लिए आप "एप्लिकेशन साझा करें ..." पर क्लिक कर सकते हैं। चूंकि गिलाउम नीचे बताता है, कुछ एक्सकोड जादू के कारण, इस आईपीए फ़ाइल को अलग से वितरित .मोबाइलप्रोविजन फ़ाइल की आवश्यकता नहीं होती है जो बीटा टेस्टर्स को स्थापित करने की आवश्यकता होती है; वह जादुई है। कोई कमांड लाइन स्क्रिप्ट नहीं कर सकती है। उदाहरण के लिए, एरिक्स की स्क्रिप्ट (1 मई को प्रस्तुत) उस आवश्यकता को पूरा नहीं करती है।
  2. सबसे महत्वपूर्ण बात यह है कि, बीटा ने एक बिल्ड का परीक्षण करने के बाद, आप "आईट्यून्स कनेक्ट पर एप्लिकेशन जमा करें" पर क्लिक कर सकते हैं, जो कि इसे पुनर्निर्माण के बिना, आपके द्वारा परीक्षण किए जाने वाले बहुत ही बाइनरी ऐप्पल के लिए बिल्कुल समान बनाता है। कमांड लाइन से यह असंभव है, क्योंकि ऐप पर हस्ताक्षर करना निर्माण प्रक्रिया का हिस्सा है; आप विज्ञापन हॉक बीटा परीक्षण के लिए बिट्स पर हस्ताक्षर कर सकते हैं या आप उन्हें ऐप स्टोर में जमा करने के लिए साइन इन कर सकते हैं, लेकिन दोनों नहीं। कमांड लाइन पर बनाया गया कोई भी आईपीए फोन पर बीटा परीक्षण नहीं किया जा सकता है और फिर सीधे ऐप्पल को सबमिट किया जा सकता है।

मैं किसी के साथ आने और मुझे गलत साबित करने के लिए प्यार करता हूं: ये दोनों सुविधाएं एक्सकोड जीयूआई में बहुत अच्छी काम करती हैं और कमांड लाइन से दोहराया नहीं जा सकता है।


xctool आज़माएं, यह ऐप्पल के xcodebuild के प्रतिस्थापन है जो आईओएस और मैक उत्पादों का निर्माण और परीक्षण करना आसान बनाता है। यह निरंतर एकीकरण के लिए विशेष रूप से सहायक है। इसमें कुछ अतिरिक्त विशेषताएं हैं:

  1. Xcode.app के समान परीक्षण चलाता है।
  2. निर्माण और परीक्षण परिणामों के संरचित उत्पादन।
  3. मानव-अनुकूल, एएनएसआई-रंगीन आउटपुट।

संख्या 3 बेहद उपयोगी है। मैं नहीं करता कि कोई भी xcodebuild के कंसोल आउटपुट को पढ़ सकता है, मैं नहीं कर सकता, आमतौर पर यह मुझे 5000+ अक्षरों के साथ एक पंक्ति देता है। एक थीसिस पेपर से पढ़ने के लिए भी मुश्किल है।

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


हमने एक्सकोड 4.2.1 के साथ एक आईपैड ऐप विकसित किया और ओटीए वितरण के लिए हमारे निरंतर एकीकरण (जेनकींस) में निर्माण को एकीकृत करना चाहता था। यहां समाधान है जिसके साथ मैं आया था:

# 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

फिर जेनकींस हमारे वेबसर्वर को आईपीए, प्लेस्ट और एचटीएमएल फाइल अपलोड करता है।

यह प्लास्ट टेम्पलेट है:

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

इसे सेट अप करने के लिए, आपको नामित उपयोगकर्ता की कीचेन में वितरण प्रमाणपत्र और प्रावधान प्रोफ़ाइल आयात करना होगा।


एक्सकोड 8:

आईपीए प्रारूप:

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

प्रावधान प्रोफ़ाइल MyMobileApp वितरण प्रोफ़ाइल का उपयोग कर MyMobileApp.ipa पथ पर आईपीए फ़ाइल के रूप में MyMobileApp.xcarchive संग्रह को निर्यात करता है।

एपीपी प्रारूप:

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

एप्लाइ-कैशन एप्लिकेशन कैशन साइनिंग पहचान का उपयोग कर MyMacApp.pkg पथ पर एक PKG फ़ाइल के रूप में संग्रह MyMacApp.xcarchive को निर्यात करता है डेवलपर आईडी अनुप्रयोग: मेरी टीम। संस्थापक हस्ताक्षर पहचान डेवलपर आईडी इंस्टॉलर: मेरी टीम का निर्यात निर्यात पैकेज पर हस्ताक्षर करने के लिए किया जाता है।

एक्सकोडबिल्ड मैन पेज


यदि आप अगले टूल का उपयोग करते हैं: 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}"

source


मैंने अनुसरण करने के लिए चरणों का एक संक्षिप्त विवरण दिया है, और नीचे दिए गए क्षेत्र का उपयोग करके आईपीए उत्पन्न करते समय पास करने के लिए पैरामीटर दिए गए हैं:

  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. आईपीए चयनित आउटपुट निर्देशिका " $ {OUTDIR} " पर जेनरेट की जाएगी

संग्रह और आईपीए उदाहरण बनाने के लिए यहां कमांड लाइन स्क्रिप्ट है। मेरे पास एक आईफोन xcode प्रोजेक्ट है, जो डेस्कटॉप / 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"

यह एक्सकोड 5 के साथ परीक्षण किया गया है और मेरे लिए ठीक काम कर रहा है।


उस फ़ोल्डर पर जाएं जहां आपकी परियोजना रूट है और:

xcodebuild -project projectname -activetarget -activeconfiguration archive

मैंने पाया कि कॉमांड लाइन से निर्माण और संग्रह प्रक्रिया को स्वचालित करने के लिए, मैंने अभी एक ब्लॉग आलेख लिखा है कि आप इसे कैसे प्राप्त कर सकते हैं।

आपको जिस आदेश का उपयोग करना है वह 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}"

आपको लेख में सभी विवरण मिलेंगे। यदि आपके कोई प्रश्न पूछने में संकोच नहीं करते हैं।


मैं विज्ञापन वितरण के लिए आईपीए पैकेज उत्पन्न करने के लिए अपनी खुद की बिल्ड स्क्रिप्ट का उपयोग कर रहा हूं।

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

लिपि संस्करण संख्या भी बढ़ाती है। यदि आवश्यक नहीं है तो आप उस हिस्से को हटा सकते हैं। आशा करता हूँ की ये काम करेगा।


विन्सेंट के जवाब पर सुधार करते हुए, मैंने ऐसा करने के लिए एक स्क्रिप्ट लिखी: xcodearchive
यह आपको कमांड लाइन के माध्यम से अपनी परियोजना को संग्रहित करने (एक आईपीए उत्पन्न) करने की अनुमति देता है। इसके बारे में xcodebuild कमांड की बहन की तरह सोचें, लेकिन संग्रह के लिए।

कोड github पर उपलब्ध है: http://github.com/gcerquant/xcodearchive


स्क्रिप्ट का एक विकल्प एक टाइमस्टैम्प संग्रह में डीएसवाईएम प्रतीकों के संग्रह को सक्षम करना है। प्रतीकों को और नहीं रखने का कोई बहाना नहीं है, और आप बाद में प्राप्त होने वाले क्रैश लॉग का प्रतीक नहीं कर पाएंगे।


एक्सकोड 8 को अपडेट करने के बाद, मैंने पाया कि उद्यम आईपीए उत्पन्न करता है

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

कुछ हस्ताक्षर मुद्दे के कारण कमांड लॉन्च नहीं किया जा सकता है। लॉग इंगित करता है कि "चेतावनी: पैकेज अनुप्रयोग को बहिष्कृत किया गया है, इसके बजाय xcodebuild -exportArchive उपयोग करें।

तो मैं xcodebuild -exportArchive स्विच xcodebuild -exportArchive और सब कुछ सामान्य हो गया।


एक कदम आगे जाकर, एक्सकोड 7 के साथ कमांडलाइन के माध्यम से iTunesConnect पर अपलोड करना! (मान लीजिए कि आप एक .ipa शुरू कर रहे हैं जिस पर सही रिलीज प्रोफ़ाइल और पहचान पर हस्ताक्षर किए गए हैं।)

एप्लिकेशन लोडर ( docs , पृष्ठ 38) के लिए सीएलआई इंटरफ़ेस altool दर्ज करें। Xcode.app की संरचना के भीतर गहरी गहरी, यह एक आसान काम है जो हमें सीधे इट्यून्स कनेक्ट पर अपलोड करने देता है।

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

.ipa सीधे अपने नए minted .ipa को अपलोड करने के लिए बस $ 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 कहने में त्रुटि 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

आप वास्तव में एक निर्माण को इस्तीफा दे सकते हैं, जैसे एक्सकोड करता है, ताकि आप उसी बाइनरी का परीक्षण और जहाज कर सकें। उदाहरण के लिए मेरी स्क्रिप्ट में (उपर्युक्त के समान) मैं अपने रिलीज संस्करण को एडहोक बिल्ड के रूप में हस्ताक्षरित करता हूं, फिर मैं परीक्षण के लिए आईपीए के रूप में संग्रहीत करता हूं, फिर अपने वितरण प्रमाण से इस्तीफा देता हूं और एक ज़िप फ़ाइल बनाता हूं, जो मैं भेजता हूं सेब। प्रासंगिक रेखा है:

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

मुझे कुछ अन्य उत्तरों को यहां जाने के लिए कड़ी मेहनत मिली। यह आलेख मेरे लिए किया गया था। जैसा कि अन्य उत्तरों में उल्लिखित है, कुछ पथों को पूर्ण होने की आवश्यकता हो सकती है।

आदेश:

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"




build