Xcode“ สร้างและเก็บถาวร” จากบรรทัดคำสั่ง


392

Xcode 3.2 นำเสนอฟีเจอร์ใหม่ที่ยอดเยี่ยมภายใต้เมนูสร้าง "สร้างและเก็บถาวร" ซึ่งสร้างไฟล์. ipa ที่เหมาะสมสำหรับการกระจาย Ad Hoc คุณยังสามารถเปิดตัวจัดระเบียบไปที่ "แอปพลิเคชันที่เก็บถาวร" และ "ส่งแอปพลิเคชันไปยัง iTunesConnect"

มีวิธีใช้ "สร้างและเก็บถาวร" จากบรรทัดคำสั่ง (เป็นส่วนหนึ่งของสคริปต์สร้าง) หรือไม่ ฉันคิดเอาเองxcodebuildมันจะเกี่ยวข้อง แต่อย่างใดmanหน้าดูเหมือนจะไม่พูดอะไรเกี่ยวกับเรื่องนี้

UPDATE Michael Grinich ขอความกระจ่าง; นี่คือสิ่งที่คุณไม่สามารถทำได้กับบิลด์บรรทัดคำสั่งคุณสมบัติที่คุณสามารถทำได้กับ Organizer ของ Xcode หลังจากที่คุณ "สร้างและเก็บถาวร"

  1. คุณสามารถคลิก "แชร์แอปพลิเคชัน ... " เพื่อแชร์ IPA ของคุณกับผู้ทดสอบเบต้า เนื่องจาก Guillaume ชี้ด้านล่างเนื่องจากเวทมนตร์ Xcode บางไฟล์ IPA นี้ไม่จำเป็นต้องมีไฟล์. mobileprovision แบบกระจายแยกต่างหากที่ผู้ทดสอบเบต้าจำเป็นต้องติดตั้ง นั่นวิเศษมาก สคริปต์บรรทัดคำสั่งไม่สามารถทำได้ ตัวอย่างเช่นสคริปต์ของ Arrix (ส่งเมื่อวันที่ 1 พฤษภาคม) ไม่เป็นไปตามข้อกำหนดดังกล่าว
  2. ที่สำคัญกว่านั้นหลังจากคุณทดสอบรุ่นบิลด์แล้วคุณสามารถคลิก "ส่งแอปพลิเคชันไปยัง iTunes Connect" เพื่อส่ง EXACT แบบเดียวกันกับ Apple ซึ่งเป็นไบนารีที่คุณทดสอบโดยไม่ต้องสร้างขึ้นใหม่ นั่นเป็นไปไม่ได้จากบรรทัดคำสั่งเพราะการลงนามแอพเป็นส่วนหนึ่งของกระบวนการสร้าง คุณสามารถลงชื่อบิตสำหรับการทดสอบ Ad Hoc เบต้าหรือคุณสามารถเซ็นชื่อเพื่อส่งไปยัง App Store แต่ไม่ใช่ทั้งสองอย่าง ไม่มี IPA ที่สร้างขึ้นในบรรทัดคำสั่งสามารถทดสอบเบต้าบนโทรศัพท์แล้วส่งโดยตรงไปยัง Apple

ฉันชอบที่จะมีใครบางคนเข้ามาและพิสูจน์ว่าฉันผิด: คุณสมบัติทั้งสองนี้ทำงานได้ดีใน Xcode GUI และไม่สามารถทำซ้ำได้จากบรรทัดคำสั่ง


1
แย่จัง ดูเหมือนว่าจะเป็นไปไม่ได้ หากคุณไม่ทราบคำตอบโปรดโหวตให้อย่างน้อยคำถามเพื่อความกรุณาของฉันจะไม่หายไปในอีเธอร์ ... :-(
Dan Fabulich

3
xcodebuildนี้ไม่ได้เป็นไปไม่ได้มันก็ไม่ได้เป็นส่วนหนึ่งของ การสร้างไฟล์ IPA นั้นเกี่ยวข้องกับการนำแอปไปไว้ในไดเรกทอรีที่ชื่อว่า "Payload" การบีบอัดไดเรกทอรีนั้นและเปลี่ยนชื่อเป็น MyAppName.ipa
Michael Grinich

@Michael "Build and Archive" ยังเปิดใช้งานฟีเจอร์ Organizer ซึ่งไม่สามารถใช้ได้เมื่อคุณสร้างไฟล์ IPA ด้วยมือ
Dan Fabulich

ความคิดเห็นของฉันมีบิตนานจึงโพสต์เป็นคำตอบ
Michael Grinich

3
แม้ว่าคำตอบแรก / คำตอบที่ได้รับการยอมรับจาก vdaubry จะใช้ได้ แต่คำตอบจาก Reid นั้นง่ายกว่าสำหรับ Xcode เวอร์ชันใหม่กว่ามาก
โพร

คำตอบ:


314

ฉันพบวิธีสร้างกระบวนการสร้างและเก็บถาวรจากบรรทัด 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}"

คุณจะพบรายละเอียดทั้งหมดในบทความ หากคุณมีคำถามใด ๆ อย่าลังเลที่จะถาม


19
ไม่ชัดเจนสำหรับฉันในบางครั้ง แต่RELEASE_BUILDDIRต้องเป็นเส้นทางที่สมบูรณ์
David Dunham

5
นอกจากนี้โปรดทราบว่าคุณไม่จำเป็นต้องใช้ - ลงชื่อหรือ - ตัวเลือกที่มีตัวเลือกหากคุณต้องการเก็บการเซ็นชื่อ / โปรไฟล์เดิมไว้เมื่อใช้. app นี่จะเป็นสิ่งที่คุณตั้งค่าไว้ในการตั้งค่าการสร้างรหัสการลงนามสำหรับการกำหนดค่ารุ่นของคุณ
Mike Weller

12
โปรดทราบว่าเส้นทางไฟล์ ipa -o "${ipa_path}"จะต้องเป็นเส้นทางที่แน่นอน มิฉะนั้นคุณอาจจะได้รับerror: Unable to create '.../...ipa'หรือมันจะถูกละเว้นการสร้างอย่างเงียบ ๆ ประณามฉันเสียเวลาสองสามชั่วโมง
h - n

2
มีคนบอกฉันได้ไหมว่าเครื่องมือจัดฟัน {} ทำอะไร ฉันสมมติว่าพวกเขาดูแลพื้นที่ว่าง แต่ฉันอาจผิด
ทำบาป

6
Xcode 8.3 Beta 1 ลบคำสั่ง PackageApplication อย่างสมบูรณ์ อย่าใช้อีกครั้งและใช้ "xcodebuild -scheme <SchemeName> archive" ตามที่แนะนำด้านล่าง
Hans Knöchel

283

ด้วย Xcode 4.2 คุณสามารถใช้แฟล็ก -scheme เพื่อทำสิ่งนี้:

xcodebuild -scheme <SchemeName> archive

หลังจากคำสั่งนี้คลังข้อมูลจะปรากฏใน Xcode Organizer


3
ใช่ดีกว่ามาก! เพื่อให้มันทำงานได้ฉันทำสิ่งต่อไปนี้: cd ไปยังโฟลเดอร์โปรเจ็กต์ของคุณจากนั้นเรียกใช้ "xcodebuild -scheme MyProjectName Archive" (เพราะโดยปกติคุณมีแบบแผนที่มีชื่อเหมือนกับชื่อโครงการของคุณ)
Samuel

18
โปรดทราบว่าการarchiveกระทำนั้นไม่เป็นไปตามการตั้งค่าใด ๆ ที่คุณให้ผ่านการเรียกใช้นี้นอกเหนือจากพื้นที่ทำงานและแบบแผน - สิ่งนี้มีค่าใช้จ่ายฉันชั่วโมง !
danyowdee

5
ทำงานได้ดีในXcode 4.4และฉันแน่ใจว่ามันใช้ได้ดีใน 4.3 เช่นกัน ตรวจสอบให้แน่ใจว่าคุณได้เลือก Xcode รีลีสที่ถูกต้องโดยใช้xcode-select <path to Xcode.app>
Reid Ellis

2
นอกจากนี้คุณต้องระบุรูปแบบด้วย " -scheme <SchemeName>"
Reid Ellis

6
นี่เป็นสิ่งที่ดีสำหรับการสร้างไฟล์เก็บถาวรอย่างไรก็ตาม PackageApplication ใน xcrun สร้างไฟล์. ipa ได้จริง คุณต้องใช้ไฟล์นี้สำหรับการแจกจ่ายไปยังผู้ทดสอบเบต้าผ่านทางสิ่งต่างๆเช่น TestFlight
jmstone617

145

อัปเดตคำตอบของฉันด้วย 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


ผู้ที่ใช้สิ่งนี้เพื่อสร้างโครงการในเครื่องมือ CI / CD เช่น teamcity / jenkins โปรดตรวจสอบว่าคุณใช้ xcode ที่ถูกติดตั้งในตัวแทนการสร้างสำหรับทั้งที่เก็บถาวรและส่งออก

คุณสามารถใช้หนึ่งในสองตัวเลือกด้านล่างนี้

  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 ฉันมีโครงการ 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 และทำงานได้ดีสำหรับฉัน


2
มันทำงานได้อย่างสมบูรณ์แบบบน Xcode6.1.1 ฉันเลือกที่จะสร้างแอปของฉันจากเทอร์มินัลเนื่องจาก Xcode6 ให้ข้อผิดพลาด "บัญชีของคุณมีใบรับรองที่ถูกต้อง" เมื่อฉันพยายามสร้าง AdHoc จากผู้จัด
FormigaNinja

หากคุณมีแอพ WatchKit จะมีโฟลเดอร์ใหม่ใน ipa ที่ชื่อว่า WatchKitSupport รวมถึงโฟลเดอร์ Symbols (อาจเป็นตัวเลือก) คุณรู้หรือไม่ว่ามีวิธีรับ exportArcive ในการส่งออกสิ่งเหล่านี้ด้วยหรือไม่
RPM

1
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive เกิดข้อผิดพลาดในการขว้างปา:requires a provisioning profile with the Associated Domains feature. Select a provisioning profile for the "Release" build configuration in the project editor.
vbRocks

1
@MohammadRezaKoohkan ที่อยู่ในคำตอบที่เก่าที่ฉันเก็บมันไว้สำหรับการแสดงการอ้างอิงที่คุณสามารถเห็นตัวเลือกการส่งออกที่ถูกต้องที่จุดเริ่มต้นของคำตอบของฉัน
ราชา

1
@Raj yeap ขอบคุณ
Mohammad Reza Koohkan

29

ฉันใช้สคริปต์สร้างของตัวเองเพื่อสร้างแพ็คเกจ 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

สคริปต์จะเพิ่มหมายเลขรุ่นด้วย คุณสามารถลบส่วนนั้นได้หากไม่ต้องการ หวังว่ามันจะช่วย


3
นี่เป็นทางออกที่ดีแม้ว่ารหัสของคุณจะอ่านยากโดยไม่มีความคิดเห็น คุณช่วยเขียนอีกเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้น?
Michael Grinich

xcode ได้รับชื่อ "APPNAME.ipa" อยู่ที่ไหน จากบรรจุภัณฑ์ -> ชื่อผลิตภัณฑ์?
Carlos Ricardo

3
สคริปต์นี้ยังไม่เพียงพอในตอนนี้ด้วยแอพ WatchKit ไม่มีใครทราบคุณสมบัติใหม่ของไฟล์ ipa ด้วยแอพ watchkit หรือไม่
RPM

เห็นปัญหาเดียวกันกับ @RPM พร้อมชุดนาฬิกา ความละเอียดใด ๆ
danieljimenez

@RPM ตรวจสอบสิ่งนี้สำหรับ WatchKit ฉันไม่ได้ลองด้วยตัวเอง แต่ดูเหมือนว่าmatrixprojects.net/p/watchkit-command-line-builds
mattman88

26

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 ระบุ ID นักพัฒนาซอฟต์แวร์สำหรับการส่งออกเป็นแอปพลิเคชันบุคคลที่สาม (เช่นไม่เผยแพร่ผ่าน Mac App Store)


1
ไม่ทำงานเมื่อใช้พื้นที่ทำงาน xcode และไม่สามารถทำงานร่วมกับ cocopod ได้
amleszk

1
คุณได้ลองเพิ่ม-workspaceตัวเลือกใน xcodebuild (และพา ธ ไปยังพื้นที่ทำงาน) หรือไม่? man xcodebuildสถานะ: "ในการสร้างพื้นที่ทำงาน Xcode คุณต้องผ่านทั้งตัวเลือก - พื้นที่ทำงานและ -scheme เพื่อกำหนดรุ่น"
Nik

สิ่งนี้ใช้งานได้ดีสำหรับฉันด้วยการเพิ่มตัวเลือก - พื้นที่ทำงาน - ฉันแค่ต้องการพา ธ ของไฟล์เก็บถาวรที่สร้างโดยคำสั่งแรกดังนั้นฉันจึงสามารถป้อนลงในวินาทีได้ คุณสามารถระบุตำแหน่งที่สร้างไฟล์เก็บถาวรด้วยตัวเลือก -archivePath แต่ฉันต้องการตำแหน่งเริ่มต้น สิ่งนี้ช่วยให้ฉันทราบวิธีรับเส้นทางนั้น: stackoverflow.com/a/9024901/813247
robotspacer

24

เราพัฒนาแอพ 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

จากนั้นเจนกินส์จะอัปโหลดไฟล์ 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>

ในการตั้งค่านี้คุณจะต้องนำเข้าใบรับรองการแจกจ่ายและโปรไฟล์การจัดสรรลงในพวงกุญแจของผู้ใช้ที่กำหนด


3
คุณยังสามารถเปลี่ยนไฟล์ plist ได้ด้วยคำสั่ง Plistbuddy ของ Apple เช่น: / usr / libexec / PlistBuddy -c "Set: CFBundleVersion 1.2.3.4" /path/to/info.plist แทนการเล่นกับ SED :)
Jelle De Laender

ขอบคุณสำหรับข้อมูล. ฉันมีประสบการณ์กับ sed มากกว่า plistbuddy ดังนั้นฉันจึงเลือก sed :)
FuePi

1
ฉันแนะนำ$WORKSPACEแทนที่จะ$PWDสร้างAPP_PATH
Richard

16

ฉันพบคำตอบอื่น ๆ ที่นี่ยากที่จะไป บทความนี้ทำเพื่อฉัน บางเส้นทางอาจจำเป็นต้องเป็นแบบสัมบูรณ์ตามที่ระบุไว้ในคำตอบอื่น ๆ

คำสั่ง:

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"

15

คุณสามารถเลิกสร้างบิลได้เช่นเดียวกับที่ XCode ทำเพื่อให้คุณสามารถทดสอบและส่งไบนารี่เดียวกันได้ ตัวอย่างเช่นในสคริปต์ของฉัน (คล้ายกับที่อยู่ด้านบน) ฉันสร้างรุ่นวางจำหน่ายของฉันเซ็นชื่อเป็น AdHoc build จากนั้นฉันเก็บถาวรเป็น IPA สำหรับการทดสอบจากนั้นออกจากใบรับรองการกระจายของฉันและสร้างไฟล์ zip ซึ่งเป็นสิ่งที่ฉันส่งไป แอปเปิ้ล. บรรทัดที่เกี่ยวข้องคือ:

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

14

สำหรับ 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 (ในความเป็นจริง) ดังต่อไปนี้ (สร้าง / ไดเรกทอรีจะถูกสร้างขึ้นโดย 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

ตอนนี้คุณจะได้รับไฟล์ ipa ใน build / directory เพียงส่งไปที่ apple App Store

อย่างไรก็ตามไฟล์ ipa ที่สร้างโดย Xcode 7 นั้นใหญ่กว่า Xcode 6 มาก


1
คุณจะระบุโปรไฟล์การจัดสรรด้วยวิธีนี้ได้อย่างไร ฉันลองใช้ exportProvisioningProfile แต่มันบอกว่าไม่สามารถใช้กับ exportOptionsPlist ... และไม่มีวิธีใดที่จะระบุโปรไฟล์ในรายการย่อที่ฉันสามารถหาได้ ... ดูเหมือนว่าจะใช้ชื่อเก่าที่สุดที่มีชื่อเดียวกับชื่อ ที่สร้างมันขึ้นมา (ซึ่งเป็นตรงข้ามของสิ่งที่ฉันต้องการจริงๆ)
จอห์นเอลลิส

การตั้งค่าโครงการซึ่งรวมอยู่ในไฟล์ชื่อ "project.pbxproj" มีการตั้งค่าการลงชื่อดังนั้น-schemeและ-configurationตัวเลือกที่ระบุวิธีเซ็นชื่อไฟล์ ipa
DawnSong

เมื่อคุณพูดว่า "เพิ่งส่งไปยัง Apple" กระบวนการนั้นเป็นอย่างไรเนื่องจากอยู่นอกขั้นตอนการเก็บถาวรปกติ
mix3d

มีสองวิธีในการ "ส่งไปที่ Apple" ลงชื่อเข้าใช้itunesconnect.apple.comหรือใช้ Xcode-> Open Developer Tool-> Application Loader @ mix3d
DawnSong

1
ฉันสิ้นสุดการค้นหาโซลูชันอัตโนมัติเต็มรูปแบบซึ่งฉันได้สร้างคำตอบใหม่!
mix3d

14

ฉันได้ให้คำอธิบายสั้น ๆ ของขั้นตอนในการปฏิบัติตามและพารามิเตอร์ที่จะผ่านในขณะที่สร้าง 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. หลังจาก Build สำเร็จแล้วให้รันคำสั่งต่อไปนี้เพื่อสร้าง. 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} "

ฉันเห็นข้อผิดพลาดนี้ "ไม่มีแอปพลิเคชันที่ระบุอยู่หรือไม่ใช่ไดเรกทอรีบันเดิล"
Ansari Awais

2
xcrun PackageApplication เลิกใช้แล้ว
Tunvir Rahman Tusher

8

Xcode 8:


รูปแบบ IPA:

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

ส่งออกไฟล์เก็บถาวร MyMobileApp.xcarchive เป็นไฟล์ IPA ไปยังเส้นทาง MyMobileApp.ipa โดยใช้โปรไฟล์การจัดสรร MyMobileApp โปรไฟล์การกระจาย

รูปแบบแอพ:

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: ทีมของฉันถูกใช้โดยนัยเพื่อลงนามในแพ็คเกจ

หน้าคน Xcodebuild


7

ไปที่โฟลเดอร์ที่รูทโปรเจคของคุณและ:

xcodebuild -project projectname -activetarget -activeconfiguration archive

7
ดูเหมือนจะใช้งานไม่ได้ การสร้าง 'เก็บถาวร' ไม่สามารถใช้ได้ใน XCode 3.2.2 (ขั้นสุดท้าย)
Martin Cote

4

ก้าวต่อไปอีกขั้นอัปโหลดไปยัง iTunes เชื่อมต่อผ่าน commandline ด้วยXcode 7 ! (สมมติว่าคุณกำลังเริ่มต้นด้วยสิ่ง.ipaที่ได้รับการลงนามด้วยโปรไฟล์การเปิดตัวที่ถูกต้องและตัวตนการลงนาม)

เข้าaltoolสู่ส่วนต่อประสาน CLI สำหรับ Application Loader ( 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คุณสามารถทำตามคำแนะนำในคำตอบ SO นี้เพื่อเรียกใช้ symlink ไปยังตำแหน่งที่ถูกต้อง:

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

3

การปรับปรุงคำตอบของวินเซนต์ฉันเขียนสคริปต์เพื่อทำสิ่งนั้น: xcodearchive
อนุญาตให้คุณเก็บถาวร (สร้าง IPA) โครงการของคุณผ่านบรรทัดคำสั่ง คิดว่ามันเหมือนน้องสาวของxcodebuildคำสั่ง แต่สำหรับการเก็บถาวร

รหัสนี้มีอยู่ใน github: http://github.com/gcerquant/xcodearchive


ตัวเลือกหนึ่งของสคริปต์คือการเปิดใช้งานการเก็บถาวรของสัญลักษณ์ dSYM ในการเก็บถาวรที่ประทับเวลา ไม่มีข้อแก้ตัวที่จะไม่เก็บสัญลักษณ์อีกต่อไปและไม่สามารถเป็นสัญลักษณ์ของบันทึกการชนที่คุณอาจได้รับ


@ KunalBalani ไม่ฉันไม่คาดหวังให้จัดการพื้นที่ทำงานได้อย่างถูกต้อง ลองดูที่รหัสก็คงไม่ต้องใช้งานมากนักในการปรับตัว ดึงคำขอต้อนรับ!
Guillaume

3

วิธีการสร้างโครงการ 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 คืออะไร

จำเป็นต้องใช้ ExportOptions.plist ใน Xcode มันช่วยให้คุณระบุตัวเลือกบางอย่างเมื่อคุณสร้างไฟล์ ipa คุณสามารถเลือกตัวเลือกใน UI ที่เป็นมิตรเมื่อคุณใช้ Xcode เพื่อเก็บแอปของคุณ

สำคัญ : วิธีสำหรับการเปิดตัวและการพัฒนาแตกต่างกันใน ExportOptions.plist

AppStore:

exportOptions_release ~ method = app-store

พัฒนาการ

exportOptions_dev ~ method = การพัฒนา


2

ลอง xctool มันเป็นการทดแทนสำหรับ xcodebuild ของ Apple ที่ทำให้ง่ายต่อการสร้างและทดสอบผลิตภัณฑ์ iOS และ Mac เป็นประโยชน์อย่างยิ่งสำหรับการรวมอย่างต่อเนื่อง มันมีคุณสมบัติพิเศษบางอย่าง:

  1. รันการทดสอบเดียวกันกับ Xcode.app
  2. โครงสร้างผลลัพธ์ของการสร้างและผลการทดสอบ
  3. เอาต์พุตสี ANSI ที่เป็นมิตรกับมนุษย์

ข้อที่ 3 มีประโยชน์อย่างมาก ฉันไม่ได้ถ้าทุกคนสามารถอ่านเอาต์พุตคอนโซลของ xcodebuild ได้ฉันไม่สามารถทำได้โดยปกติจะให้บรรทัดเดียวที่มีอักขระ 5,000 ตัวขึ้นไป อ่านยากยิ่งกว่ากระดาษวิทยานิพนธ์

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



2

หลังจากอัปเดตเป็น Xcode 8 ฉันพบว่า enterprise 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และทุกอย่างกลับเป็นปกติ


1

คุณหมายถึงตัวเลือกการตรวจสอบ / แชร์ / ส่งหรือไม่ ฉันคิดว่ามันเฉพาะเจาะจงกับ Xcode และไม่เหมาะกับเครื่องมือสร้างบรรทัดคำสั่ง

ด้วยความเฉลียวฉลาดฉันเดิมพันว่าคุณสามารถสร้างสคริปต์เพื่อทำเพื่อคุณ ดูเหมือนว่าพวกเขาเพิ่งถูกเก็บไว้ใน~/Library/MobileDevice/Archived Applications/UUDI และผู้วางแผน ฉันไม่สามารถจินตนาการได้ว่ามันเป็นเรื่องยากที่จะทำวิศวกรรมตรวจสอบความถูกต้องเช่นกัน

กระบวนการที่ฉันสนใจโดยอัตโนมัติกำลังส่งงานสร้างไปยังผู้ทดสอบเบต้า (เนื่องจากการส่ง App Store เกิดขึ้นนาน ๆ ครั้งฉันไม่รังเกียจที่จะทำมันด้วยตนเองโดยเฉพาะอย่างยิ่งเมื่อฉันต้องเพิ่มข้อความคำอธิบายใหม่ ๆ ) โดยการสร้าง Build + Archive โดยใช้ CLI ของ Xcode ฉันสามารถสร้างการสร้างอัตโนมัติจากทุกรหัส สร้างไฟล์ IPA ด้วยโปรไฟล์การจัดสรรที่ฝังตัวและส่งอีเมลไปยังผู้ทดสอบ


ฉันชี้แจงคำถามของฉัน เมื่อคุณพูดว่า "ฉันทำได้" ข้างต้นคุณหมายถึงคุณสามารถทำสิ่งนี้ได้จริงหรือ
Dan Fabulich

2
ใช่. ฉันใช้Hudson Continuous Integrationกับสคริปต์ที่กำหนดเองซึ่งทำงานxcodebuildและสร้าง IPA
Michael Grinich

ขออภัยฉันมางานปาร์ตี้ แต่ TestFlight มี API อัปโหลดที่ง่ายสุด ๆ ที่คุณควรตรวจสอบ
self.name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.