2011-10-08 61 views
79

最近提交後,我已經得到了以下錯誤:您如何爲Mac App Store使用框架捆綁包?

Invalid Signature - the nested app bundle (FooBar.app/Contents/Frameworks/GData.framework) is not signed, the signature is invalid, or it is not signed with an Apple submission certificate. Refer to the Code Signing and Application Sandboxing Guide for more information.

Invalid Signature - the nested app bundle (FooBar.app/Contents/Frameworks/Growl.framework) is not signed, the signature is invalid, or it is not signed with an Apple submission certificate. Refer to the Code Signing and Application Sandboxing Guide for more information.

Invalid Signature - the nested app bundle libcurl (FooBar.app/Contents/Frameworks/libcurl.framework) is not signed, the signature is invalid, or it is not signed with an Apple submission certificate. Refer to the Code Signing and Application Sandboxing Guide for more information.

所以我每Technote 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說:

Signing Frameworks

Seeing as frameworks are bundles it would seem logical to conclude that you can sign a framework directly. However, this is not the case. To avoid problems when signing frameworks make sure that you sign a specific version as opposed to the whole framework:

# This is the wrong way:

codesign -s my-signing-identity ../FooBarBaz.framework

# This is the right way:

codesign -s my-signing-identity ../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 

爲了好玩,我嘗試直接簽署框架捆綁,但仍然被拒絕。但這正是文件所說的不該做的。

任何猜測爲什麼這將被視爲無效?我使用的是我用來對我的應用程序進行代碼簽名的相同證書 - 這是過去的工作。

我唯一的猜測會與現有的plists(我是否需要擁有框架的Info.plists中的標識符?)或權利 - 任何建議?

+0

我也發現了,當我提出我的應用程序這點。謝天謝地蘋果沒有拒絕它,但指出我們將不得不稍後簽署框架。我認爲最好在咆哮谷歌代碼問題頁面上發佈,很快人們會遇到同樣的問題。 – koo

+2

在使用Growl框架提交應用程序時也遇到此問題。我猜你必須將growl.framework包標識符更改爲您擁有的標識符,然後對其進行編碼。 – Andrew

+0

這很奇怪:我已經發布了一個應用程序,其中包含兩個框架(CorePlot和MacRuby),都是未簽名的。我只在應用程序包上運行代碼簽名命令一次,並且該應用程序已被接受而沒有對框架發表任何評論。現在,如果您查看應用程序包(http://bit.ly/charterapp),那麼這兩個框架似乎都會被簽名。你是否試圖簡單地簽署整個應用程序? – p4010

回答

10

您的評論顯示您簽署了捆綁包版本目錄中的對象。 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 
39

基於baptr的回答,我已經開發了codesigns我所有的框架和其他二進制資源/輔助可執行文件(目前支持的類型此shell腳本:dylib,捆綁,和登錄項):

#!/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. 在「複製嵌入式框架」構建階段之後立即添加「運行腳本」構建階段。
    • 你可以稱之爲「Codesign Embedded Frameworks」。
  3. 粘貼./codesign-frameworks.sh(或任何你稱之爲上面的腳本)到腳本編輯器文本字段中。如果將腳本存儲在子目錄中,請使用./Scripts/codesign-frameworks.sh
  4. 建立你的應用程序。所有捆綁的框架都將進行代碼簽名。

如果還得到一個「身份:曖昧(火柴:......。」的錯誤,請在下面的評論這不應該再發生了

更新2012年11月14日:添加與框架的支持其名稱中的特殊字符(不包括單引號)改爲「codesign-frameworks.sh」。

更新2013-01-30:在所有路徑中添加對特殊字符的支持(這應該包括單引號)到「codesign-frameworks.sh」。

更新2013-10-29:添加實驗dylib支持。

更新2013-11-28:添加權利支持。改進實驗dylib支持。

更新2014-06-13:修復包含(嵌套)框架的框架的代碼簽名問題。這是通過將-depth選項添加到find來完成的,這導致find進行深度優先遍歷。這已成爲必要,因爲the issue described here。簡而言之:如果包含的捆綁包已經簽名,則只能對其進行簽名。

更新2014-06-28:添加實驗包支持。

更新2014-08-22:改進代碼並防止無法恢復IFS。

更新2014-09-26:添加對登錄項目的支持。

更新2014-10-26:引用目錄檢查。這修復了「行31/42:太多參數」錯誤以及由此產生的「代碼對象根本沒有簽名」的錯誤,包括特殊字符的路徑。

更新2014-11-07:在Xcode中使用自動標識解析時,解決模糊身份錯誤(如「Mac Developer:ambiguous ...」)。您不必明確設定身份,只需使用「Mac Developer」即可!

更新2015-08-07:提高語義。

改進歡迎!

+0

感謝您的提示,儘管如此,如果您的目標在其名稱中有空格,則不起作用。我試圖修復,但無法讓它工作,所以改變了目標。 – Craig

+0

現在應該在FRAMEWORK_DIR的名稱中包含空格/特殊字符時立即工作。 – JanX2

+0

這解決了我的問題,謝謝! –

0

我在這裏沒有看到的一件事是,您需要將Info.plist放在版本化框架目錄中的Resources內。否則,當您嘗試簽署版本化的目錄時,您會收到「捆綁格式無法識別,無效或不合適」的錯誤。

我提供了一個更加延長的答案在這裏:How to Codesign Growl.framework for Sandboxed Mac App

2

這是我的固定它;

  • 輸入到你的目標
  • 的構建設置FING行「其他代碼簽名標誌」
  • 輸入--deep價值釋放參數
  • 關閉了XCode
  • 回車(默認路徑是:/ Users/YOUR_USER_NAME/Library/Developer/Xcode/DerivedData)
  • 打開Xcode並生成

構建文件之後,並提交重新應用...

相關問題