IPA (iPhone) पर फिर से हस्ताक्षर करें


129

वर्तमान में मैं हडसन के साथ अपने सभी एप्लिकेशन का निर्माण करता हूं, बिना किसी समस्या के xcrun द्वारा xcodebuild का उपयोग करते हुए

मुझे विभिन्न लोगों से आईपीए फाइलों की एक जोड़ी मिली है, जिन्हें मैं कॉर्पोरेट खाते (ऐप स्टोर के लिए, या कभी-कभी तदर्थ वितरित) के बजाय एक एंटरप्राइज़ खाते के साथ फिर से साइन इन करना चाहूंगा।

मेरी समस्या यह है कि जब मैं ऐप को इस्तीफा देने की कोशिश करता हूं, तो यह मेरे डिवाइस पर स्थापित नहीं होगा (और यह तब से होना चाहिए जब यह एंटरप्राइज बिल्ड है)। त्रुटि संदेश डिवाइस पर है (आईट्यून्स में नहीं) और यह मुझे बस इतना बताता है कि यह ऐप इंस्टॉल नहीं कर सकता है। अधिक जानकारी नहीं दी गई है।

मुझे कुछ जानकारी मिली है, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- अपलोड करें / )

और यह संभव हो सकता है। मुझे जो समस्या आ रही है वह यह है कि यह मोबाइल प्रोविज़निंग प्रोफाइल को एम्बेड नहीं करता है जैसा कि मैं अपने सामान्य बिल्ड (xcrun का उपयोग करके) करता हूं, क्या यह कोडसाइन टूल के साथ नियंत्रित करना संभव है, या क्या xcrun के साथ फिर से साइन इन करना संभव है ?

वर्तमान में मेरे इस्तीफे की स्क्रिप्ट के साथ

  • unzip app.ipa
  • appname = $ (ls पेलोड)
  • xcrun -sdk iphoneos PackageApplication -s "$ प्रोविजनिंग_प्रोफाइल" "$ प्रोजेक्ट_डिर / पेलोड / $ ऐपनाम" -ओ "$ प्रोजेक्ट_डिर / एप-रिजाइन्ड.पा" - "$ प्रोविजनिंग_प्रोफाइल" --embed "$ mobileprovision"

मैंने परिणामी ipa फ़ाइल में देखा है और यह मूल ऐप के समान है। क्या फ़ाइलों को वास्तव में यहाँ बदलना चाहिए? मैंने शुरू में सोचा था कि _CodeSignature / CodeResources बदल जाएगा, लेकिन सामग्री बहुत हद तक समान दिखती है।

पॉइंटर्स की काफी तारीफ हो रही है।

जवाबों:


211

अंत में यह काम कर गया!

प्रोविजनिंग प्रोफाइल में जोड़े गए ऐप डिवाइस के साथ ऐप स्टोर के लिए सर्टिफिकेट के साथ IPA के साथ हस्ताक्षर किए गए। एक नए 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"

पुन: संकेत

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

पुन: पैकेज

zip -qr "Application.resigned.ipa" Payload

संपादित करें: एंटाइटेलमेंट भाग को हटा दिया गया (देखें टिप्पणी, धन्यवाद)


6
एक बात जो हमें परेशान करती है वह थी एंटाइटेलमेंट फ़ाइल, यदि आपके पास एक है, तो ऐप्पल द्वारा प्रदान की गई ऐप आईडी से मेल खाना चाहिए। चूंकि हम बंडल आईडी बदल रहे थे, इसलिए एंटाइटेलमेंट मेल नहीं खाते थे। ऐप चलेगा, लेकिन कीचेन प्रत्येक रन के बाद साफ हो जाएगा।
tjg184

5
Oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 के अनुसार ऐप आईडी को बाइनरी में बनाया गया है, इसलिए आप केवल एक ही ऐप आईडी का उपयोग करके इस्तीफा दे सकते हैं। मुझे पता है कि मैं एक अलग ऐप आईडी के साथ इस्तीफा देने में सक्षम नहीं था।
माइकल बाल्टाकस

7
@ValerioSantinelli आपको पिछले कोड साइनिंग से एंटाइटेलमेंट ले जाने की आवश्यकता होगी। FWIW पुश नोटिफिकेशन एंटाइटेलमेंट के बिना काम नहीं करेगा। अनज़िप करने के बाद: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appफिर इस्तीफा देने के दौरान--entitlements entitlements.plist
पीटर

11
Yosemite पर कोडसिग्न फेल - चेतावनी: - Mac OS X> = 10.10 में स्रोत-नियमों को हटा दिया गया है! पेलोड / Aaa.app / ResourceRules.plist: संसाधनों को नहीं पढ़ सकते हैं
Jibeex

4
चेतावनी: - Mac OS X> = 10.10 में स्रोत-नियमों को हटा दिया गया है! पेलोड / Application.app / ResourceRules.plist: संसाधन नहीं पढ़ सकते हैं। यह त्रुटि हो रही है?
मेघा सेप

44

इस प्रश्न का उत्तर थोड़ा पुराना है और संभावित रूप से महत्वपूर्ण चरणों को याद नहीं कर रहा है, इसलिए यह बाहरी डेवलपर से ऐप इंस्टॉल करने के लिए एक अद्यतन मार्गदर्शिका है।

----- iOS ऐप कैसे इस्तीफा दें -----

मान लीजिए कि आपको किसी अन्य डेवलपर से एक ऐप (जैसे MyApp.ipa) प्राप्त होता है, और आप इसे अपने डिवाइस पर स्थापित करना और चलाना चाहते हैं ( ideviceinstaller का उपयोग करके ) उदाहरण के लिए, ) करना चाहते हैं।

नए साइनिंग एसेट तैयार करें

पहला कदम एक प्रोविज़निंग प्रोफाइल प्राप्त करना है जिसमें वे सभी डिवाइस शामिल हैं जिन्हें आप इंस्टॉल और रन करना चाहते हैं। सुनिश्चित करें कि प्रोफ़ाइल में एक प्रमाणपत्र है जो आपने अपने किचेन एक्सेस में स्थापित किया है (जैसे iPhone डेवलपर: कुछ बॉडी (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

मौजूदा प्रोविजनिंग प्रोफाइल (यानी एम्बेडेड। मोबाइलप्रोविजन) को अपने साथ बदलें।

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

अब अपने प्रोविज़निंग प्रोफाइल में शामिल प्रमाण पत्र और पहले के द्वारा बनाए गए एंटाइटेलमेंट पर हस्ताक्षर करें।

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

महत्वपूर्ण: आपको ऐप में शामिल सभी रूपरेखाओं को भी इस्तीफा देना चाहिए । आप इन में मिल जाएगा Payload/MyApp.app/Frameworks। यदि ऐप स्विफ्ट में लिखा गया है या यदि इसमें कोई अतिरिक्त ढांचा शामिल है, तो उन्हें इस्तीफा देना होगा या ऐप इंस्टॉल हो जाएगा, लेकिन नहीं चलेगा।

$ /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-resign.ipa) रखते हैं, तो आप अब निर्देशिका निकाल सकते हैं । अब आप अपने प्रोविज़निंग प्रोफाइल में शामिल किसी भी डिवाइस पर MyApp-resign.ipa इंस्टॉल कर सकते हैं।


क्या यह वही दृष्टिकोण वितरण प्रोफाइल पर लागू होगा? IE: मैं एंटाइटेलमेंट निकाल सकता हूं और अपने distro.mobileprovision से फिर से साइन इन कर सकता हूं?
चेस फ्लोरल

@grez क्या यह आईपीए के वितरण के लिए भी काम करेगा?
LearneriOS

मेरा मतलब है कि 'एंटरप्राइज' ऐप के आईपीएएस के साथ-साथ @grez
LearneriOS

@LearneriOS यह मेरे लिए एंटरप्राइज IPA डिस्ट्रीब्यूशन के काम नहीं आया। मैं सिएरा, Xcode 8, iOS 10 का उपयोग कर रहा हूं। ऐप iTunes के माध्यम से इंस्टॉल होता है लेकिन फिर इंस्टॉलेशन के तुरंत बाद डिलीट हो जाता है।
ब्रायन ब्राइस

@PhoenixFF मुझे आईट्यून्स के साथ स्थापित करने के बारे में निश्चित नहीं है, लेकिन क्या आप इस तरह से कमांड लाइन से स्थापित करने का प्रयास कर सकते हैं: $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

मैंने इस उत्तर का सफलतापूर्वक पालन किया, लेकिन चूंकि एंटाइटेलमेंट बदल गया है, मैंने बस --entitlements "Payload/Application.app/Entitlements.plist"दूसरे से अंतिम विवरण के हिस्से को हटा दिया , और यह एक आकर्षण की तरह काम करता है।


मैं पिछली टिप्पणी से द्वितीय हूँ। आधुनिक टूलकिट के साथ यह कार्य करने के लिए एंटाइटेलमेंट निकालें।
ब्रूनो ब्रोंस्की

2
एंटाइटेलमेंट के बिना मेरे ऐप ने वास्तव में अजीब काम करना शुरू कर दिया, यह लॉग में दे रहा है SecItemCopyMatching: missing entitlement:। मेरे पास अलग-अलग एंटाइटेलमेंट.प्लेस्ट फाइल नहीं है, इसलिए एंटाइटेलमेंट को संरक्षित करने के लिए मैंने @ लॉर्ड्स की टिप्पणी का उपयोग किया : पहले एंटाइटेलमेंट फ़ाइल बनाएँ: 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:।
बुलट

5

मैक ओएस हाई सिएरा और एक्सकोड 10 के साथ जांच की गई

आप बस आवेदन iResign का उपयोग करके इसे लागू कर सकते हैं

1 का रास्ता दे) .ipa

2) नई प्रावधान प्रोफ़ाइल

3) एंटाइटेलमेंट फ़ाइल (वैकल्पिक, केवल तभी जोड़ें जब आपके पास पात्रता हो)

4) बंडल आईडी

5) वितरण प्रमाण पत्र

आप आउटपुट .ipa फ़ाइल को पुनः साइन के बाद सहेजे हुए देख सकते हैं

सरल और शक्तिशाली उपकरण


4

इनमें से कोई भी इस्तीफा देने वाला दृष्टिकोण मेरे लिए काम नहीं कर रहा था, इसलिए मुझे कुछ और काम करना पड़ा।

मेरे मामले में, मेरे पास एक समय सीमा समाप्त प्रमाणपत्र के साथ एक आईपीए था। मैं एप्लिकेशन को फिर से बना सकता था, लेकिन क्योंकि हम यह सुनिश्चित करना चाहते थे कि हम बिल्कुल उसी संस्करण (सिर्फ एक नए प्रमाणपत्र के साथ) वितरित कर रहे थे, हम इसे पुनर्निर्माण नहीं करना चाहते थे।

अन्य उत्तरों में वर्णित इस्तीफे के तरीकों के बजाय, मैंने एक आईपीए बनाने के लिए Xcode की विधि की ओर रुख किया, जो एक बिल्ड से एक .xcarchive से शुरू होता है।

  1. मैंने एक मौजूदा .xcarchive की नकल की और सामग्री को बदलना शुरू कर दिया। (मैंने .dSYM फ़ाइल पर ध्यान नहीं दिया)

  2. मैंने पुराने IPA फ़ाइल से पुराने एप्लिकेशन को निकाला (अनज़िपिंग के माध्यम से; ऐप केवल पेलोड फ़ोल्डर में है)

  3. मैंने इस ऐप को नए .xcarchive में स्थानांतरित किया, Products/Applicationsजो कि वहां मौजूद ऐप की जगह ले रहा था।

  4. मैं संपादित Info.plist, संपादन

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. मैं आमतौर पर Xcode के आर्काइव फ़ोल्डर में .xcarchive चला गया /Users/xxxx/Library/Developer/Xcode/Archives

  6. Xcode में, मैंने ऑर्गनाइज़र विंडो खोली, इस नए संग्रह को चुना और नियमित रूप से (इस मामले में एंटरप्राइज़) निर्यात किया।

परिणाम एक अच्छा आईपीए था जो काम करता है।


1
यह एक जीनियस समाधान है जो अभी भी Xcode 9.2 के रूप में काम करता है। मेरे मामले में मैंने अभी मौजूदा .xcarchive के तहत पुरानी .app फ़ाइल की नकल की है। मैंने Info.plist नहीं बदला और इसलिए एप्लिकेशन संस्करण पुराने संस्करण के रूप में बना रहा, लेकिन नए एंटरप्राइज़ प्रमाणपत्र के साथ हस्ताक्षरित किया गया था।
dodgy_coder

3

मुझे लगता है कि फास्टलेन का उपयोग करना सबसे आसान है:

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"

मैंने कई तरीके आजमाए लेकिन कोई किस्मत नहीं। इस समाधान ने मेरे लिए धन्यवाद का काम किया।
ओमिड किआ

1

Fastlane sigh के इस्तीफा विकल्प के साथ आप यह बहुत आसानी से कर सकते हैं।

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

आप कमांड से ठीक पहले, sigh का उपयोग करके भी प्रोफ़ाइल डाउनलोड कर सकते हैं।


0

धन्यवाद, एरिक, इस पोस्ट करने के लिए। इसने मेरे लिए काम किया। मैं एक अतिरिक्त कदम के बारे में एक नोट जोड़ना चाहूंगा जो मुझे चाहिए। भीतर "पेलोड / Application.app /" वहाँ "नाम की एक निर्देशिका था CACertChains " है कि "नाम की एक फ़ाइल निहित cacert.pem "। मुझे इन चरणों को पूरा करने के लिए निर्देशिका और .pem को निकालना पड़ा। एक बार फिर धन्यवाद! -


-1

यदि आपके पास एक्सटेंशन और / या वॉच ऐप वाला ऐप है और आपके पास प्रत्येक एक्सटेंशन / वॉच ऐप के लिए कई प्रोविज़निंग प्रोफाइल हैं तो आपको इस स्क्रिप्ट का उपयोग आईपीए फाइल पर फिर से साइन करने के लिए करना चाहिए।

गितुब में पुन: हस्ताक्षरित स्क्रिप्ट

इस लिपि का उपयोग कैसे करें इसका एक उदाहरण इस प्रकार है:

./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

आप अन्य एक्सटेंशन प्रोविजनिंग प्रोफाइल को भी इसमें शामिल कर सकते हैं, फिर भी इसे दूसरे विकल्प के साथ जोड़ें।

मेरे लिए - सभी प्रावधान प्रोफाइल पर एक ही प्रमाण पत्र / हस्ताक्षर पहचान द्वारा हस्ताक्षर किए गए थे।


आपका लिंक टूट गया है ... लेखक के जीथूब को देखकर यह विकल्प मिला। github.com/fastlane/fastlane/blob/…
जुगुटियर

यह एक पुराना उत्तर है और शायद इसे हटा दिया जाना चाहिए क्योंकि यह अब काम नहीं करता है लेकिन इसे 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इसके बजाय उपयोग करें ।
हरे रंग की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.