ลงชื่อ IPA (iPhone) อีกครั้ง


129

ขณะนี้ฉันสร้างแอปพลิเคชันทั้งหมดของฉันด้วยฮัดสันโดยใช้ xcodebuild ตามด้วย xcrun โดยไม่มีปัญหาใด ๆ

ฉันได้รับไฟล์ IPA สองสามไฟล์จากบุคคลที่แตกต่างกันซึ่งฉันต้องการลงชื่ออีกครั้งด้วยบัญชีองค์กรแทนบัญชี บริษัท (สำหรับแอพสโตร์หรือบางครั้งก็แจกจ่ายแบบเฉพาะกิจ)

ปัญหาของฉันคือเมื่อฉันพยายามจะลาออกแอปจะไม่ติดตั้งบนอุปกรณ์ของฉัน (และควรเป็นเพราะมันเป็นรุ่น Enterprise) ข้อความแสดงข้อผิดพลาดอยู่บนอุปกรณ์ (ไม่ใช่ใน iTunes) และบอกฉันเพียงว่าไม่สามารถติดตั้งแอปได้ ไม่มีการให้ข้อมูลเพิ่มเติม

ฉันพบข้อมูลบางอย่าง ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- อัพโหลด / )

และนี่อาจเป็นไปได้ ปัญหาที่ฉันกำลังเผชิญคือดูเหมือนว่าจะไม่ฝังโปรไฟล์การจัดเตรียมอุปกรณ์เคลื่อนที่เหมือนกับที่ฉันทำกับบิลด์ปกติของฉัน (โดยใช้ xcrun) เป็นไปได้หรือไม่ที่จะควบคุมด้วยเครื่องมือออกแบบโค้ดหรือเป็นไปได้ไหมที่จะลงชื่ออีกครั้งด้วย xcrun ?

ด้วยสคริปต์การลาออกของฉันฉันกำลังทำอยู่

  • เปิดเครื่องรูด app.ipa
  • ชื่อแอป = $ (ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s "$ บทบัญญัติ_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-owned.ipa" --sign "$ การจัดเตรียม _profile" --embed "$ mobileprovision"

ฉันได้ดูไฟล์ ipa ที่เป็นผลลัพธ์แล้วและดูเหมือนว่าจะคล้ายกับแอปดั้งเดิมมาก ไฟล์อะไรที่ควรเปลี่ยนที่นี่? ตอนแรกฉันคิดว่า _CodeSignature / CodeResources จะเปลี่ยนไป แต่เนื้อหาก็ดูเหมือนเดิมทุกประการ

คำแนะนำเป็นที่ชื่นชมมาก

คำตอบ:


212

ในที่สุดก็ใช้งานได้!

ทดสอบด้วย IPA ที่ลงนามด้วย cert1 สำหรับการส่งแอปสโตร์โดยไม่ต้องเพิ่มอุปกรณ์ในโปรไฟล์การจัดสรร ผลลัพธ์ใน IPA ใหม่ที่ลงนามด้วยบัญชีองค์กรและโปรไฟล์การจัดเตรียมอุปกรณ์เคลื่อนที่สำหรับการปรับใช้ภายในองค์กร (โปรไฟล์การจัดสรรอุปกรณ์เคลื่อนที่จะฝังอยู่ใน IPA)

สารละลาย:

คลายซิป IPA

unzip Application.ipa

ลบ CodeSignature เก่า

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

แทนที่โปรไฟล์การจัดสรรอุปกรณ์เคลื่อนที่แบบฝัง

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Re: เข้าสู่ระบบ

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Re-แพคเกจ

zip -qr "Application.resigned.ipa" Payload

แก้ไข: ลบส่วนสิทธิ (ดูความคิดเห็นตรอกซอกซอยขอบคุณ)


6
สิ่งหนึ่งที่ทำให้เราเกิดปัญหาคือไฟล์สิทธิ์หากคุณมีต้องตรงกับรหัสแอปที่ Apple ให้ไว้ เนื่องจากเรากำลังเปลี่ยนรหัสบันเดิลสิทธิ์จึงไม่ตรงกัน แอปจะทำงาน แต่พวงกุญแจจะชัดเจนหลังจากการรันแต่ละครั้ง
tjg184

5
อ้างอิงจากoleb.net/blog/2011/06/code-signing-changes-in-xcode-4 ระบุว่ารหัสแอปถูกสร้างไว้ในไบนารีดังนั้นคุณจึงสามารถลาออกได้โดยใช้รหัสแอปเดียวกันเท่านั้น ฉันรู้ว่าฉันไม่สามารถลาออกด้วยรหัสแอปอื่นได้
Michael Baltaks

7
@ValerioSantinelli คุณจะต้องดำเนินการต่อสิทธิ์จากการลงนามรหัสก่อนหน้านี้ การแจ้งเตือนแบบพุช FWIW จะไม่ทำงานหากไม่มีสิทธิ์ หลังจากคลายซิป: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appจากนั้นในระหว่างการลาออก--entitlements entitlements.plist
ปีเตอร์

11
Codeign ล้มเหลวบน Yosemite - คำเตือน: - กฎทรัพยากรเลิกใช้แล้วใน Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: ไม่สามารถอ่านทรัพยากรได้
Jibeex

4
คำเตือน: - กฎทรัพยากรเลิกใช้งานแล้วใน Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: ไม่สามารถอ่านทรัพยากรได้ ได้รับข้อผิดพลาดนี้?
megha

44

คำตอบสำหรับคำถามนี้ล้าสมัยเล็กน้อยและไม่มีขั้นตอนสำคัญที่อาจเกิดขึ้นดังนั้นนี่คือคู่มือฉบับปรับปรุงสำหรับการติดตั้งแอปจากนักพัฒนาภายนอก

----- วิธีการลาออกแอป iOS -----

สมมติว่าคุณได้รับแอป (เช่น MyApp.ipa) จากผู้พัฒนารายอื่นและคุณต้องการให้สามารถติดตั้งและเรียกใช้งานบนอุปกรณ์ของคุณได้ (โดยใช้ideviceinstallerเป็นต้น)

เตรียมสินทรัพย์การลงนามใหม่

ขั้นตอนแรกคือการได้รับโปรไฟล์การจัดเตรียมซึ่งรวมถึงอุปกรณ์ทั้งหมดที่คุณต้องการติดตั้งและใช้งาน ตรวจสอบให้แน่ใจว่าโปรไฟล์มีใบรับรองที่คุณติดตั้งไว้ในการเข้าถึงพวงกุญแจของคุณ(เช่น iPhone Developer: Some Body (XXXXXXXXXX)) ดาวน์โหลดโปรไฟล์ (MyProfile.mobileprovision) เพื่อให้คุณสามารถแทนที่โปรไฟล์ที่ฝังอยู่ในแอพได้

ต่อไปเราจะเตรียมไฟล์สิทธิ์เพื่อรวมไว้ในการลงนาม เปิดเทอร์มินัลของคุณและเรียกใช้สิ่งต่อไปนี้

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

นี้จะสร้างไฟล์ XML อธิบายของคุณรายละเอียดการจัดเตรียม ต่อไปเราต้องการแยกสิทธิ์ลงในไฟล์

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

แทนที่โปรไฟล์การจัดเตรียมและลาออกจากแอป

หากคุณกำลังทำงานกับไฟล์. ipa ขั้นแรกให้คลายซิปแอป (หากคุณมี. appแทนคุณสามารถข้ามขั้นตอนนี้ได้)

$ unzip MyApp.ipa

ไดเรกทอรีการทำงานของคุณตอนนี้จะมีและPayload/ Payload/MyApp.app/จากนั้นลบไฟล์ลายเซ็นรหัสเก่า

$ rm -rf Payload/MyApp.app/_CodeSignature

แทนที่โปรไฟล์การจัดเตรียมที่มีอยู่ (เช่น built.mobileprovision) ด้วยของคุณเอง

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

ตอนนี้ลงชื่อแอปด้วยใบรับรองที่รวมอยู่ในโปรไฟล์การจัดเตรียมของคุณและ entitlements.plist ที่คุณสร้างไว้ก่อนหน้านี้

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

สำคัญ: คุณต้องลาออกจากเฟรมเวิร์กทั้งหมดที่รวมอยู่ในแอพด้วย คุณจะพบสิ่งเหล่านี้ในPayload/MyApp.app/Frameworks. หากแอปเขียนด้วย Swift หรือหากมีเฟรมเวิร์กเพิ่มเติมสิ่งเหล่านี้จะต้องลาออกมิฉะนั้นแอปจะติดตั้ง แต่ไม่ทำงาน

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

ตอนนี้คุณสามารถบีบอัดแอปใหม่ได้แล้ว

$ zip -qr MyApp-resigned.ipa Payload

เสร็จสิ้น

ตอนนี้คุณสามารถลบPayloadไดเร็กทอรีได้เนื่องจากคุณมีแอปดั้งเดิม (MyApp.ipa) และเวอร์ชันที่ลาออก (MyApp-owned.ipa) ตอนนี้คุณสามารถติดตั้ง MyApp-owned.ipa บนอุปกรณ์ใดก็ได้ที่รวมอยู่ในโปรไฟล์การจัดสรรของคุณ


แนวทางเดียวกันนี้จะใช้กับโปรไฟล์การแจกจ่ายหรือไม่ IE: ฉันสามารถแยกสิทธิ์และลงนามใหม่จาก distro.mobileprovision ของฉันได้หรือไม่
Chase Florell

@grez สิ่งนี้จะใช้ได้กับการแจกจ่าย IPA ด้วยหรือไม่?
LearneriOS

ฉันหมายถึงการกระจาย IPAs ของแอป 'องค์กร' เช่นกัน @grez
LearneriOS

@LearneriOS สิ่งนี้ใช้ไม่ได้กับฉันสำหรับ Enterprise IPA Distribution ฉันใช้ Sierra, Xcode 8, iOS 10 แอปติดตั้งผ่าน iTunes แต่จะถูกลบทันทีหลังการติดตั้ง
Bryan Bryce

@PhoenixFF ฉันไม่แน่ใจเกี่ยวกับการติดตั้งกับ iTunes แต่คุณสามารถลองติดตั้งจากบรรทัดคำสั่งเช่นนี้ได้ไหม: $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

ฉันทำตามคำตอบนี้สำเร็จ แต่เนื่องจากการให้สิทธิ์มีการเปลี่ยนแปลงฉันจึงเพียงแค่ลบ--entitlements "Payload/Application.app/Entitlements.plist"ส่วนของคำสั่งที่สองถึงสุดท้ายออกและมันก็ใช้งานได้ดี


ฉันจะเป็นลำดับที่ 2 ของความคิดเห็นก่อนหน้า ลบการให้สิทธิ์เพื่อให้ใช้งานได้กับชุดเครื่องมือที่ทันสมัย
Bruno Bronosky

2
โดยไม่ต้องได้รับสิทธิ app SecItemCopyMatching: missing entitlementของฉันจริงเริ่มทำงานแปลกให้นี้ในบันทึก: ฉันไม่ได้มีไฟล์ Entitlements.plist แยกจากกันเพื่อที่จะรักษาสิทธิผมใช้@ ความคิดเห็นของ LordTแรกสร้างไฟล์สิทธิ: แล้วใช้มันเมื่อลงนาม:echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements --entitlements temp/newEntitlements
Bulat

5

ตรวจสอบด้วย Mac OS High Sierra และ Xcode 10

คุณก็สามารถดำเนินการเดียวกันโดยใช้แอพลิเคชันiResign

ให้เส้นทางของ 1) .ipa

2) โปรไฟล์ข้อกำหนดใหม่

3) ไฟล์สิทธิ์ (ไม่บังคับเพิ่มเฉพาะเมื่อคุณมีสิทธิ์)

4) รหัสกลุ่ม

5) ใบรับรองการจัดจำหน่าย

คุณสามารถดูไฟล์เอาต์พุต. ipa ที่บันทึกไว้หลังจากเซ็นชื่อใหม่

เครื่องมือที่เรียบง่ายและทรงพลัง


4

วิธีการลาออกเหล่านี้ไม่ได้ผลสำหรับฉันดังนั้นฉันจึงต้องทำงานอย่างอื่น

ในกรณีของฉันฉันมี IPA พร้อมใบรับรองที่หมดอายุ ฉันสามารถสร้างแอปขึ้นมาใหม่ได้ แต่เนื่องจากเราต้องการให้แน่ใจว่าเรากำลังแจกจ่ายเวอร์ชันเดียวกันทั้งหมด (เพียงแค่มีใบรับรองใหม่) เราจึงไม่ต้องการสร้างแอปขึ้นมาใหม่

แทนที่จะใช้วิธีการลาออกที่กล่าวถึงในคำตอบอื่น ๆ ฉันหันไปใช้วิธีการสร้าง IPA ของ Xcode ซึ่งเริ่มต้นด้วย. xcarchive จากบิลด์

  1. ฉันทำซ้ำ. xcarchive ที่มีอยู่และเริ่มแทนที่เนื้อหา (ฉันไม่สนใจไฟล์. dSYM)

  2. ฉันแตกแอพเก่าจากไฟล์ IPA เก่า (ผ่านการคลายซิปแอพเป็นสิ่งเดียวในโฟลเดอร์ Payload)

  3. ฉันย้ายแอพนี้ไปไว้ใน. xcarchive ใหม่ภายใต้การProducts/Applicationsแทนที่แอพที่อยู่ที่นั่น

  4. ฉันแก้ไขInfo.plistแก้ไข

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. ผมย้าย .xcarchive ลงในโฟลเดอร์ที่เก็บของ Xcode /Users/xxxx/Library/Developer/Xcode/Archivesมักจะ

  6. ใน Xcode ฉันเปิดหน้าต่าง Organizer เลือกที่เก็บถาวรใหม่นี้และทำการส่งออกปกติ (ในกรณีนี้คือ Enterprise)

ผลที่ได้คือ IPA ที่ใช้งานได้ดี


1
นี่เป็นโซลูชันอัจฉริยะที่ยังคงใช้งานได้เหมือน Xcode 9.2 ในกรณีของฉันฉันเพิ่งคัดลอกไฟล์. app เก่าภายใต้. xcarchive ที่มีอยู่ ฉันไม่ได้เปลี่ยน Info.plist ดังนั้นเวอร์ชันของแอปจึงยังคงเป็นเวอร์ชันเก่า แต่ได้รับการลงนามด้วยใบรับรององค์กรใหม่
dodgy_coder

3

ฉันคิดว่าวิธีที่ง่ายที่สุดคือการใช้ Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

ฉันลองหลายวิธี แต่ไม่มีโชค วิธีนี้ใช้ได้ผลสำหรับฉันขอบคุณ
Omid Kia

1

ด้วยตัวเลือกการลาออกของ Fastlane ถอนหายใจคุณสามารถทำได้อย่างง่ายดาย

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

คุณสามารถดาวน์โหลดโปรไฟล์โดยใช้การถอนหายใจก่อนคำสั่ง


0

ขอบคุณ Erik สำหรับการโพสต์สิ่งนี้ สิ่งนี้ได้ผลสำหรับฉัน ฉันต้องการเพิ่มหมายเหตุเกี่ยวกับขั้นตอนพิเศษที่ฉันต้องการ ภายใน "Payload / Application.app /" มีไดเร็กทอรีชื่อ " CACertChains " ซึ่งมีไฟล์ชื่อ " cacert.pem " ฉันต้องลบไดเร็กทอรีและ. pem เพื่อทำตามขั้นตอนเหล่านี้ ขอบคุณอีกครั้ง! -


-1

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

การลงนามสคริปต์ใหม่ที่ Github

นี่คือตัวอย่างวิธีใช้สคริปต์นี้:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

คุณสามารถรวมโปรไฟล์การจัดสรรส่วนขยายอื่น ๆ ได้ด้วยโดยเพิ่มด้วยตัวเลือก -p อื่น

สำหรับฉัน - โปรไฟล์การจัดเตรียมทั้งหมดลงนามโดยใบรับรอง / ข้อมูลประจำตัวการลงนามเดียวกัน


ลิงก์ของคุณเสีย ... พบทางเลือกนี้โดยดูที่ github ของผู้เขียน github.com/fastlane/fastlane/blob/…
jugutier

นี่เป็นคำตอบเก่าและน่าจะถูกลบเนื่องจากใช้งานไม่ได้อีกต่อไป แต่ไม่มีวิธีใดที่จะลบออกใน StackOverflow
RPM

1
สิ่งนี้ได้ผลสำหรับเราเพียงแค่ต้องอัปเดตลิงก์นี้: github.com/fastlane/fastlane/blob/…
jugutier

โอเคดีที่รู้ว่ามันยังใช้งานได้ ไม่สามารถแก้ไขคำตอบเดิมได้อีกต่อไปดังนั้นผู้คนจะต้องอ่านความคิดเห็น :)
RPM

ใช้fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovisionแทน
green0range
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.