Xcode "Build and Archive" من سطر الأوامر




command-line (12)

Xcode 8:

تنسيق IPA:

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

يصدر الأرشيف MyMobileApp.xcarchive كملف IPA إلى المسار MyMobileApp.ipa باستخدام ملف التوفير الشخصي MyMobileApp Distribution Profile.

تنسيق التطبيق:

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

يتم تصدير الأرشيف MyMacApp.xcarchive كملف PKG إلى المسار MyMacApp.pkg باستخدام تطبيق معرف هوية تطبيق cation application cation application: My Team. هوية المثبت المثبّت هوية المعرف: يتم استخدام "فريقي" ضمنيًا للتوقيع على الحزمة التي تم تصديرها.

صفحة الرجل Xcodebuild

يوفر Xcode 3.2 ميزة جديدة رائعة تحت القائمة Build ، "Build and Archive" التي تنشئ ملف .ipa مناسب للتوزيع المخصص. يمكنك أيضًا فتح "المنظم" والانتقال إلى "التطبيقات المؤرشفة" و "إرسال التطبيق إلى iTunesConnect".

هل هناك طريقة لاستخدام "Build and Archive" من سطر الأوامر (كجزء من برنامج نصي)؟ أفترض أن xcodebuild بطريقة ما ، لكن يبدو أن صفحة man لا تقول أي شيء عن هذا.

تحديث مايكل Grinich طلب توضيح؛ هنا بالضبط ما لا يمكنك القيام به مع بناء سطر الأوامر ، والميزات التي يمكنك القيام بها فقط مع المنظم Xcode بعد "بناء والأرشيف".

  1. يمكنك النقر فوق "مشاركة التطبيق ..." لمشاركة IPA مع اختبار بيتا. كما يشير Guillaume أدناه ، نظرًا لوجود بعض سحر Xcode ، لا يتطلب ملف IPA هذا ملف .mobileprovision موزعًا بشكل منفصل يحتاجه مختبري الإصدارات التجريبية. هذا سحري. لا يوجد برنامج نصي لسطر الأوامر يمكنه القيام بذلك. على سبيل المثال ، لا يلبي برنامج Arrix's script (المقدم في 1 مايو) هذا الشرط.
  2. والأهم من ذلك ، بعد اختبار الإصدار التجريبي ، يمكنك النقر فوق "إرسال التطبيق إلى iTunes Connect" لإرسال هذا الإصدار نفسه إلى Apple ، وهو البرنامج الثنائي الذي اختبرته ، بدون إعادة بنائه. هذا مستحيل من سطر الأوامر ، لأن توقيع التطبيق جزء من عملية الإنشاء ؛ يمكنك توقيع البتات للاختبار التجريبي المخصص أو يمكنك توقيعها لتقديمها إلى App Store ، ولكن ليس كليهما. لا يمكن اختبار IPA المبني على سطر الأوامر على الهواتف ، ومن ثم يتم إرساله مباشرةً إلى Apple.

أحب أن يأتي شخص ما ويثبت لي خطأ: كل من هذه الميزات تعمل بشكل رائع في واجهة المستخدم الرسومية Xcode ولا يمكن نسخها من سطر الأوامر.


إذا كنت تستخدم الأداة التالية: 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


الذهاب خطوة أخرى إلى الأمام ، والتحميل إلى iTunesConnect عبر سطر الأوامر مع Xcode 7 ! (بافتراض أنك تبدأ بـ .ipa الذي تم توقيعه مع ملف تعريف الإصدار الصحيح وتوقيعه.)

أدخل altool ، واجهة 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

باستخدام Xcode 4.2 ، يمكنك استخدام علامة -cheme للقيام بذلك:

xcodebuild -scheme <SchemeName> archive

بعد هذا الأمر سيظهر الأرشيف في Xcode Organizer.


بعد التحديث إلى 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 كل شيء طبيعي.


تقصد خيارات التحقق / المشاركة / الإرسال؟ أعتقد أن هذه خاصة بـ Xcode ، وليست مناسبة لأداة بناء سطر الأوامر.

مع بعض الذكاء ، أراهن أنه يمكنك عمل برنامج نصي للقيام بذلك نيابة عنك. يبدو أنها مخزنة في ~/Library/MobileDevice/Archived Applications/ with UUDI and plist. لا أستطيع أن أتخيل أنه سيكون من الصعب عكس مهندس المدقق سواء.

العملية التي أرغب بها في أتمتة عملية إرسال إصدارات إلى مختبري الإصدارات التجريبية. (نظرًا لأن إرسال App Store يحدث بشكل غير منتظم ، فلا مانع من تنفيذه يدويًا ، خاصةً لأنني غالباً ما أحتاج إلى إضافة نص وصف جديد.) من خلال القيام بإنشاء صفحة + أرشيف زائف باستخدام CLI الخاص بـ Xcode ، يمكنني تشغيل عمليات إنشاء تلقائية من كل التعليمة البرمجية ، إنشاء ملفات IPA مع ملفات تخصيص مدمجة ، وإرسالها بالبريد الإلكتروني إلى المختبرين.


طورنا تطبيق iPad مع XCode 4.2.1 وأردنا دمج البنية في تكاملنا المستمر (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>

لإعداد هذا الأمر ، يجب عليك استيراد شهادة التوزيع وملف التخصيص في سلسلة المفاتيح الخاصة بالمستخدم المعين.


عند تحسين إجابة فنسنت ، كتبت نصًا لعمل ذلك: xcodearchive
فإنه يسمح لك أرشفة (توليد IPA) المشروع الخاص بك عن طريق سطر الأوامر. فكر في الأمر مثل أخت أمر xcodebuild ، ولكن للأرشفة.

الرمز متاح على جيثب: http://github.com/gcerquant/xcodearchive


خيار واحد من البرنامج النصي هو تمكين أرشفة رموز dSYM في أرشيف timestamped. لا عذر لعدم الاحتفاظ بالرموز بعد الآن ، ولن تكون قادراً على ترميز سجل التعطل الذي قد تتلقاه فيما بعد.


لقد قدمت وصفًا موجزًا ​​للخطوات التي يجب اتباعها ، والمعلمات التي يتم تمريرها أثناء إنشاء IPa باستخدام terrminal أدناه:

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

لقد وجدت كيفية أتمتة عملية البناء والأرشفة من خط comand ، كتبت للتو مقالًا في المدونة يوضح كيف يمكنك تحقيق ذلك.

الأمر الذي يجب عليك استخدامه هو 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}"

سوف تجد كل التفاصيل في المادة . إذا كان لديك أي أسئلة، لا تتردد في طلب.


وجدت بعض الأجوبة الأخرى هنا صعبة. هذه المقالة فعلت لي. قد تحتاج بعض المسارات لتكون مطلقة ، كما هو مذكور في الإجابات الأخرى.

الامر:

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"

يمكن لأداة 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 معرّف مطوّر البرامج للتصدير كتطبيق تابع لجهة خارجية (أي لم يتم توزيعه عبر متجر تطبيقات Mac).





build