आप मैक ऐप स्टोर के लिए फ्रेमवर्क बंडलों को कैसे कोडित करते हैं?


81

एक हालिया सबमिशन के बाद मुझे निम्नलिखित त्रुटि मिली है:

अमान्य हस्ताक्षर - नेस्टेड ऐप बंडल (FooBar.app/Contents/Frameworks/GData.framework) हस्ताक्षरित नहीं है, हस्ताक्षर अमान्य है, या यह Apple प्रस्तुत प्रमाण पत्र के साथ हस्ताक्षरित नहीं है। अधिक जानकारी के लिए कोड साइनिंग और एप्लिकेशन सैंडबॉक्सिंग गाइड देखें।

अमान्य हस्ताक्षर - नेस्टेड ऐप बंडल (FooBar.app/Contents/Frameworks/Growl.framework) हस्ताक्षरित नहीं है, हस्ताक्षर अमान्य है, या यह Apple प्रस्तुत प्रमाण पत्र के साथ हस्ताक्षरित नहीं है। अधिक जानकारी के लिए कोड साइनिंग और एप्लिकेशन सैंडबॉक्सिंग गाइड देखें।

अमान्य हस्ताक्षर - नेस्टेड ऐप बंडल लिबर्कल (FooBar.app/Contents/Frameworks/libcurl.framework) पर हस्ताक्षर नहीं किया गया है, हस्ताक्षर अमान्य है, या यह Apple जमा प्रमाण पत्र के साथ हस्ताक्षरित नहीं है। अधिक जानकारी के लिए कोड साइनिंग और एप्लिकेशन सैंडबॉक्सिंग गाइड देखें।

इसलिए मैंने प्रति टेक्नोलाजी 2206 में सभी ढांचे के बंडलों पर हस्ताक्षर किए :

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libcurl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libssh2.1.dylib
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A/Growl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A/GData

2206 तकनीक कहते हैं:

साइनिंग फ्रेमवर्क

फ्रेमवर्क बंडलों के रूप में देखकर यह निष्कर्ष निकालना तर्कसंगत होगा कि आप सीधे एक रूपरेखा पर हस्ताक्षर कर सकते हैं। बहरहाल, मामला यह नहीं। फ्रेमवर्क पर हस्ताक्षर करते समय समस्याओं से बचने के लिए सुनिश्चित करें कि आप पूरे ढांचे के विपरीत एक विशिष्ट संस्करण पर हस्ताक्षर करते हैं:

# यह गलत तरीका है:

codeign -s my-हस्ताक्षर-पहचान ../FooBarBaz.framework

# यह सही तरीका है:

codeign -s my-हस्ताक्षर-पहचान ../FooBarBaz.framework/Versions/A

और जब मैं परिणामों को सत्यापित करने की कोशिश करता हूं, तो यह मुझे अच्छा लगता है:

% codesign -vvv FooBar.app/Contents/Frameworks/libcurl.framework
FooBar.app/Contents/Frameworks/libcurl.framework: valid on disk
FooBar.app/Contents/Frameworks/libcurl.framework: satisfies its Designated Requirement
% codesign -vvv FooBar.app/Contents/Frameworks/Growl.framework
FooBar.app/Contents/Frameworks/Growl.framework: valid on disk
FooBar.app/Contents/Frameworks/Growl.framework: satisfies its Designated Requirement

मज़े के लिए, मैंने सीधे फ्रेमवर्क बंडल पर हस्ताक्षर करने की कोशिश की और इसे अभी भी खारिज कर दिया गया। लेकिन यह वही है जो प्रलेखन ने कहा कि नहीं करना है।

कोई भी अनुमान लगाता है कि इसे अमान्य क्यों माना जाएगा? मैं उसी प्रमाणपत्र का उपयोग कर रहा हूं जिसका उपयोग मैं अपने ऐप पर हस्ताक्षर करने के लिए करता हूं - वह जो अतीत में काम कर चुका है।

मेरा एकमात्र अनुमान मौजूदा प्लास्टर्स के साथ कुछ करना होगा (क्या मुझे रूपरेखा के Info.plists? या एंटाइटेलमेंट में पहचानकर्ताओं के स्वामित्व की आवश्यकता है - कोई सुझाव?


जब मैंने अपना ऐप सबमिट किया था, तो मैंने इसे पहले ही खोज लिया था। शुक्र है कि Apple ने इसे अस्वीकार नहीं किया, लेकिन ध्यान दिया कि हमें बाद में रूपरेखा पर हस्ताक्षर करने होंगे। मुझे लगता है कि Growl google code मुद्दों पृष्ठ पर पोस्ट करना बेहतर है और बहुत जल्द लोग उसी समस्या से टकरा रहे हैं।
कू

2
ग्रोएल फ्रेमवर्क के साथ एक ऐप सबमिट करते समय भी इस समस्या में भाग गया। मैं अनुमान लगा रहा हूं कि आपको अपने स्वयं के लिए एक से बढ़ कर बढ़ते हुए। पहचान का बंडल पहचानकर्ता बनाना होगा और फिर इसे कोड करना होगा।
एंड्रयू

यह अजीब है: मैंने एक ऐप प्रकाशित किया है, जिसमें दो फ्रेमवर्क (CorePlot और MacRuby) शामिल हैं, दोनों बिना किसी संकेत के। मैं केवल एक बार ऐप बंडल पर कोड साइन कमांड चलाता हूं, और ऐप को फ्रेमवर्क पर किसी भी टिप्पणी के बिना स्वीकार किया गया है। अब यदि आप ऐप बंडल ( बिट.ली /चार्टरैप ) में देखते हैं, तो दोनों रूपरेखा पर हस्ताक्षर किए जाते हैं। क्या आपने पूरे ऐप पर बस हस्ताक्षर करने की कोशिश की?
p4010

@ p4010, मैंने किया - वे पहले अहस्ताक्षरित थे। उदाहरण के लिए ग्रोवल सिर्फ सीधे बंडल था जो वे वितरित करते हैं। अब, मेरे पास यह ऐप थोड़ी देर के लिए स्टोर में है, इसलिए मुझे लगता है कि इसे नए सैंडबॉक्सिंग सामान के साथ करना होगा। आपने अपना ऐप कब सबमिट किया?
cxtxton

@ और, क्या आपके लिए बंडल पहचानकर्ता का काम बदल दिया है?
15

जवाबों:


46

बपतिस् के उत्तर के आधार पर, मैंने इस शेल स्क्रिप्ट को विकसित किया है जो मेरे सभी फ्रेमवर्क और अन्य बाइनरी संसाधनों / सहायक निष्पादनों (वर्तमान में समर्थित प्रकार: डायलिब, बंडल और लॉगिन आइटम) को कोड करता है:

#!/bin/sh

# WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY! 

# Verify that $CODE_SIGN_IDENTITY is set
if [ -z "${CODE_SIGN_IDENTITY}" ] ; then
    echo "CODE_SIGN_IDENTITY needs to be set for framework code-signing!"

    if [ "${CONFIGURATION}" = "Release" ] ; then
        exit 1
    else
        # Code-signing is optional for non-release builds.
        exit 0
    fi
fi

if [ -z "${CODE_SIGN_ENTITLEMENTS}" ] ; then
    echo "CODE_SIGN_ENTITLEMENTS needs to be set for framework code-signing!"

    if [ "${CONFIGURATION}" = "Release" ] ; then
        exit 1
    else
        # Code-signing is optional for non-release builds.
        exit 0
    fi
fi

ITEMS=""

FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -d "$FRAMEWORKS_DIR" ] ; then
    FRAMEWORKS=$(find "${FRAMEWORKS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle" | sed -e "s/\(.*framework\)/\1\/Versions\/A\//")
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        exit 1
    fi

    ITEMS="${FRAMEWORKS}"
fi

LOGINITEMS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/"
if [ -d "$LOGINITEMS_DIR" ] ; then
    LOGINITEMS=$(find "${LOGINITEMS_DIR}" -depth -type d -name "*.app")
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        exit 1
    fi

    ITEMS="${ITEMS}"$'\n'"${LOGINITEMS}"
fi

# Prefer the expanded name, if available.
CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
    # Fall back to old behavior.
    CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
fi

echo "Identity:"
echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}"

echo "Entitlements:"
echo "${CODE_SIGN_ENTITLEMENTS}"

echo "Found:"
echo "${ITEMS}"

# Change the Internal Field Separator (IFS) so that spaces in paths will not cause problems below.
SAVED_IFS=$IFS
IFS=$(echo -en "\n\b")

# Loop through all items.
for ITEM in $ITEMS;
do
    echo "Signing '${ITEM}'"
    codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" --entitlements "${CODE_SIGN_ENTITLEMENTS}" "${ITEM}"
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        echo "Failed to sign '${ITEM}'."
        IFS=$SAVED_IFS
        exit 1
    fi
done

# Restore $IFS.
IFS=$SAVED_IFS
  1. इसे अपने प्रोजेक्ट में फ़ाइल में सहेजें। मैं अपनी कॉपी Scriptsको अपने प्रोजेक्ट के रूट में एक उपनिर्देशिका में रखता हूं ।
    • मेरा कहा जाता है codesign-frameworks.sh
  2. अपने "कॉपी एंबेडेड फ्रेमवर्क" बिल्ड चरण के ठीक बाद एक "रन स्क्रिप्ट" बिल्ड चरण जोड़ें।
    • आप इसे "कोडसाइन एंबेडेड फ्रेमवर्क" कह सकते हैं।
  3. ./codesign-frameworks.shस्क्रिप्ट एडिटर टेक्स्ट फील्ड में पेस्ट करें (या जिसे आपने अपनी स्क्रिप्ट कहा है)। ./Scripts/codesign-frameworks.shयदि आप स्क्रिप्ट को एक उपनिर्देशिका में संग्रहीत करते हैं तो उपयोग करें ।
  4. अपना ऐप बनाएं। सभी बंडल ढांचे को कोड किया जाएगा।

क्या आपको अभी भी एक " पहचान : अस्पष्ट (मैच: ...") त्रुटि मिलनी चाहिए, कृपया नीचे टिप्पणी करें। अब ऐसा नहीं होना चाहिए।

2012-11-14 अपडेट किया गया: उनके नाम में विशेष वर्णों के साथ चौखटे के लिए समर्थन जोड़ना (इसमें एकल उद्धरण शामिल नहीं हैं) "कोडसाइन-frameworks.sh"।

2013-01-30 अपडेट किया गया: सभी पथों में विशेष वर्णों के लिए समर्थन जोड़ना (इसमें एकल उद्धरण शामिल होना चाहिए) "कोडसाइन-frameworks.sh"।

2013-10-29 अपडेट किया गया: प्रयोगात्मक dylib समर्थन जोड़ना।

अपडेट किया गया 2013-11-28: एंटाइटेलमेंट समर्थन जोड़ना। प्रयोगात्मक dylib समर्थन में सुधार।

अपडेट किया गया 2014-06-13: फ्रेमवर्क युक्त (नेस्टेड) ​​फ्रेमवर्क के साथ कोडिंग मुद्दों को ठीक करना। यह -depthकरने के लिए विकल्प जोड़कर किया गया था find, जो findएक गहराई-पहले ट्रैवर्सल करने का कारण बनता है। यहाँ वर्णित मुद्दे के कारण यह आवश्यक हो गया है । संक्षेप में: एक युक्त बंडल केवल तभी हस्ताक्षरित किया जा सकता है जब उसके नेस्टेड बंडल पहले से ही हस्ताक्षरित हों।

अपडेट किया गया 2014-06-28: प्रयोगात्मक बंडल समर्थन जोड़ना।

अपडेट किया गया 2014-08-22: कोड में सुधार और IFS को पुनर्स्थापित करने में विफलता को रोकना।

अपडेट किया गया 2014-09-26: लॉगिन आइटम के लिए समर्थन जोड़ना।

अपडेट किया गया 2014-10-26: निर्देशिका निर्देशिका की जाँच। यह "लाइन 31/42: बहुत सारे तर्क" त्रुटियों को ठीक करता है और परिणामस्वरूप "कोड ऑब्जेक्ट विशेष वर्णों सहित पथों के लिए त्रुटि" पर हस्ताक्षर नहीं किया जाता है।

2014-11-07 अपडेट किया गया: Xcode में स्वचालित पहचान रिज़ॉल्यूशन का उपयोग करते समय अस्पष्ट पहचान त्रुटि (जैसे "मैक डेवलपर: अस्पष्ट ...") को हल करना। आपको स्पष्ट रूप से पहचान सेट करने की आवश्यकता नहीं है और बस "मैक डेवलपर" का उपयोग कर सकते हैं!

अपडेटेड 2015-08-07: शब्दार्थ में सुधार।

सुधारों का स्वागत है!


इसके लिए धन्यवाद, सिर्फ एक नोट हालांकि, यह काम नहीं करता है अगर आपके लक्ष्य में यह नाम है। मैंने ठीक करने की कोशिश की लेकिन काम करने के लिए नहीं मिल सका इसलिए लक्ष्य बदल दिया।
क्रेग

FRAMEWORK_DIR के नाम में रिक्त स्थान / विशेष वर्ण होने पर अब काम करना चाहिए।
JanX2

हालाँकि, मुझे कोड-कमांड के अंत में "--timestamp" जोड़कर टाइमस्टैम्प विकल्प को अक्षम करने की आवश्यकता थी।
एल्मर कैट

दिलचस्प है। क्या आप @Elmer कैट, संयोग से, OS X के अप्रबंधित संस्करण पर ऐसा कर रहे हैं? मैन पेज "सिस्टम-विशिष्ट डिफ़ॉल्ट व्यवहार" होने के इस विकल्प का वर्णन करता है।
JanX2

1
एल्मर कैट - मुझे नहीं पता कि आप किस Xcode का संस्करण चला रहे हैं, लेकिन मैं 5.0.1 पर हूं और यह निश्चित रूप से अपने फ्रेमवर्क पर हस्ताक्षर नहीं कर रहा है। मैं अपने बालों को फाड़ रहा था जब तक मुझे यह स्क्रिप्ट नहीं मिली।
ब्रायन

11

आपकी टिप्पणी से पता चलता है कि आपने बंडल के संस्करण निर्देशिका के भीतर वस्तुओं पर हस्ताक्षर किए हैं। Technote, डायरेक्टरी को स्वयं साइन करने के लिए दिखाता है।

निम्नलिखित तकनीक बेहतर से मेल खाती है:

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A

4

यह मैंने इसे कैसे तय किया;

  • अपने लक्ष्य की बिल्ड सेटिंग्स दर्ज करें
  • लाइन खोजें "अन्य कोड हस्ताक्षर झंडे"
  • रिलीज पैरामीटर के लिए --deep मान दर्ज करें
  • XCode को बंद करें
  • अपने मैक पर व्युत्पन्न डेटा फ़ोल्डर में प्रवेश करें और पुराने व्युत्पन्न डेटा को हटा दें (डिफ़ॉल्ट पथ है: / उपयोगकर्ता / your_USER_NAME / लाइब्रेरी / डेवलपर / Xcode / DerivedData)
  • Xcode खोलें और बनाएँ

बिल्ड संग्रह के बाद और फिर से एप्लिकेशन सबमिट करें ...


3
एक सपने की दुनिया में "--दीप" उम्मीद के मुताबिक काम करेगी लेकिन हम एक सपने की दुनिया में नहीं रह रहे हैं ...
माइक

0

एक बात जो मुझे यहाँ दिखाई नहीं दे रही है, वह यह है कि आपको अपनी Info.plist को अंदर / संसाधन को संस्करणबद्ध निर्देशिका निर्देशिका के अंदर रखने की आवश्यकता है। जब आप संस्करण निर्देशिका को साइन करने का प्रयास करते हैं, तो आपको "बंडल प्रारूप अपरिचित, अमान्य या अनुपयुक्त" त्रुटि मिलेगी।

मैंने यहां अधिक विस्तृत उत्तर दिया: सैंडबॉक्स बॉक्स ऐप के लिए कोडसिग्नल ग्रोएल.फ्रेमवर्क कैसे करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.