จะลงไฟล์ ipa ใหม่ได้อย่างไร?


107

ฉันจะเซ็นชื่อไฟล์. ipa ด้วยโปรไฟล์การจัดเตรียมได้อย่างไรหลังจากที่ฉันสร้าง IPA ดังต่อไปนี้โดยใช้โปรไฟล์การจัดเตรียมอื่น ฉันต้องการลงนาม IPA ด้วยโปรไฟล์การจัดสรรเฉพาะกิจสำหรับการทดสอบเบต้าจากนั้นลงนาม IPA ที่แน่นอนอีกครั้งพร้อมกับโปรไฟล์การจัดเตรียมการส่งแอปสำหรับ App Store

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

1
อาจซ้ำกันของการลงชื่อ IPA (iPhone)
ซ้ำ

คำตอบ:


207

มันง่ายมากที่จะทำจากบรรทัดคำสั่ง ฉันมีส่วนสำคัญของสคริปต์สำหรับการทำสิ่งนี้ ตอนนี้ได้รวมอยู่ในสคริปต์ ipa_sign ในhttps://github.com/RichardBronosky/ota-toolsที่ฉันใช้ทุกวัน หากคุณมีคำถามเกี่ยวกับการใช้เครื่องมือเหล่านี้อย่าลังเลที่จะถาม

หัวใจของมันคือ:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

แอปที่ลงนามใหม่ของคุณชื่อว่าลาออก. ipa


31
โหวต 7 ครั้งไม่ใช่คำถามเดียว ฉันเดาว่าการทุบตีของฉันชัดเจนแค่นั้น
Bruno Bronosky

4
เป็นคนใจดีจริงๆ
Rui Peres

3
@RahmathullahMPulikkal ฉันเห็นว่าฉันได้กำหนดเส้นทางในส่วนสำคัญอย่างผิดพลาด คุณควรใช้github.com/RichardBronosky/ota-tools/blob/master/ipa_signแทน gist เป็นรหัสที่ดูแล
Bruno Bronosky

5
คุณอาจได้รับคำเตือน / ข้อผิดพลาดเกี่ยวกับพารามิเตอร์ --resource-rules ซึ่งเลิกใช้แล้วใน OS X Yosemite (10.10) เพียงแค่ลบพารามิเตอร์นี้เพื่อแก้ปัญหานี้
ıɾuǝʞ

4
หนึ่งทราบน้อย: ดูเหมือนว่าCodeResourcesตอนนี้อยู่ภายในของ_CodeSignatureโฟลเดอร์ดังนั้นคุณก็ต้องลบโฟลเดอร์นั้น
dadude999

36

ตรวจสอบiResignเพื่อหาเครื่องมือง่ายๆในการทำสิ่งนี้!

[แก้ไข] หลังจากยุ่งเกี่ยวกับเรื่องนี้ฉันพบวิธีแก้ปัญหาสำหรับการลาออกจากพวงกุญแจ สามารถตรวจสอบได้ที่https://gist.github.com/Weptun/5406993


มีเครื่องมือใดที่สามารถเปลี่ยนชื่อที่แสดงพร้อมกับ Bundle id ขณะลาออกได้หรือไม่? สิ่งนี้จะช่วยให้มีชื่อที่แสดงที่แตกต่างกันสำหรับสภาพแวดล้อมที่แตกต่างกัน เช่น App-Dev, App-QA, App-Stage เป็นต้น
Nishanth Nair

1
ใช่ floatsign.sh ทำอย่างนั้น
Blitz

ผลงาน เรียบง่ายและสวยงาม
Arjun Kalidas

13

คำถามเก่า ๆ แต่สำหรับ XCode ล่าสุดcodesignนั้นง่ายมาก:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement

2
@Pavel คำถามนี้ได้รับคำตอบกลับมาเมื่อ iOS 6.x เป็นเวอร์ชันล่าสุด ตั้งแต่นั้นเป็นต้นมาเราได้มีการเปิดตัวครั้งใหญ่สองครั้งซึ่งเห็นได้ชัดว่ามีการเปลี่ยนแปลงหลายอย่าง คุณอาจต้องการ จำกัด การค้นหาของคุณเฉพาะคำตอบที่กำหนดเป้าหมายเทคโนโลยีปัจจุบัน
BryanH

มันได้ผลสำหรับฉัน คุณต้องแทนที่ "my_certificate" ด้วยชื่อของคีย์ในพวงกุญแจของคุณ
Franziskus Karsunke

2
codesignคำสั่งยังใช้ในการตอบสนอง @BrunoBronosky ฉันไม่สามารถใช้งานได้โดยตรงกับไฟล์ "* .ipa" และตัวเลือก "-vv" จะแสดงผลcode object is not signed at allในไฟล์ที่ฉันรู้ว่ามีการลงชื่อเสมอ ...
Mariano Paniga

12

คำตอบที่โพสต์ทั้งหมดนี้ไม่ได้ผลสำหรับฉัน พวกเขาข้ามการลงนามกรอบฝังตัวเป็นหลัก (หรือรวมถึงการให้สิทธิ์)

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (สมมติว่ามีไฟล์ ipa หนึ่งไฟล์อยู่ในไดเร็กทอรีปัจจุบัน):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/

ความคิดเห็นที่เป็นประโยชน์จากโพสต์ด้านบน (รวย): stackoverflow.com/questions/5160863/…
Serzas

9

การถอนหายใจของ Fastlane เป็นทางออกที่ดีพอสมควรสำหรับการลาออกจาก IPA

จาก README ของพวกเขา:

ลาออก

หากคุณสร้างipaไฟล์ของคุณแต่ต้องการใช้รหัสอื่นที่ลงชื่อเข้าใช้ไฟล์ ipa คุณสามารถใช้sigh resign:

fastlane sigh resign

sigh จะพบไฟล์ ipa และโปรไฟล์การจัดเตรียมสำหรับคุณหากไฟล์เหล่านั้นอยู่ในโฟลเดอร์ปัจจุบัน

คุณสามารถส่งข้อมูลเพิ่มเติมโดยใช้บรรทัดคำสั่ง:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

มันจะจัดการโปรไฟล์การจัดเตรียมสำหรับแอปพลิเคชันที่ซ้อนกัน (เช่นหากคุณมีแอป watchkit)


8

ฉันได้อัปเดตรหัสของ Bryan สำหรับ Sierra iMac ของฉันแล้ว:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload

ฉันคอมไพล์ข้อผิดพลาดต่อไปนี้ entitlements.plist: ไม่รู้จักประเภทหยด (ยอมรับสุ่มสี่สุ่มห้า) entitlements.plist: ความยาวไม่ถูกต้องในหยดสิทธิ์
Amr Angry

คุณสามารถแบ่งปันเนื้อหาของไฟล์ที่ให้สิทธิ์ได้หรือไม่?
Pierre Priot

ทำงานอย่างมีเสน่ห์!
Luis E. Prado

5
  1. แตกไฟล์. ipa โดยเปลี่ยนนามสกุลเป็น. zip
  2. ไปที่ Payload คุณจะพบไฟล์. app
  3. คลิกขวาที่ไฟล์. app แล้วคลิกแสดงเนื้อหาแพ็คเกจ
  4. ลบ_CodeSignedโฟลเดอร์
  5. แทนที่embedded.mobileprovisionไฟล์ด้วยโปรไฟล์การจัดเตรียมใหม่
  6. ไปที่ KeyChain Access และตรวจสอบให้แน่ใจว่ามีใบรับรองที่เชื่อมโยงกับโปรไฟล์ชั่วคราวอยู่
  7. ดำเนินการคำสั่งที่กล่าวถึงด้านล่าง: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. ตอนนี้ซิปโฟลเดอร์ Payload อีกครั้งและเปลี่ยนนามสกุล. zip ด้วย. ipa

หวังว่านี่จะเป็นประโยชน์

สำหรับการอ้างอิงตามลิงค์ที่กล่าวถึงด้านล่าง: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/


1

ลองใช้แอปนี้ http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/

มันควรจะช่วยให้คุณลาออกไฟล์ IPA ฉันลองด้วยตัวเอง แต่ไม่สามารถส่งผ่านข้อผิดพลาดกับ Entitlements.plist อาจเป็นปัญหากับโครงการของฉัน คุณควรลองดู

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