您如何为Mac App Store编码框架包?

问题描述 投票:80回答:4

最近提交之后,出现以下错误:

无效签名-嵌套的应用程序捆绑包(FooBar.app/Contents/Frameworks/GData.framework)未签名,签名无效或未使用Apple提交证书签名。有关更多信息,请参考《代码签名和应用程序沙箱指南》。

无效签名-嵌套的应用程序捆绑包(FooBar.app/Contents/Frameworks/Growl.framework)未签名,签名无效或未使用Apple提交证书签名。有关更多信息,请参考《代码签名和应用程序沙箱指南》。

无效签名-嵌套的应用程序捆绑包libcurl(FooBar.app/Contents/Frameworks/libcurl.framework)未签名,签名无效或未使用Apple提交证书签名。有关更多信息,请参考《代码签名和应用程序沙箱指南》。

所以我在每个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说:

签名框架

看来框架是捆绑包,因此可以得出结论,您可以直接签署框架似乎是合乎逻辑的。然而,这种情况并非如此。为避免在签署框架时出现问题,请确保您签署的是特定版本而不是整个框架:

#这是错误的方式:

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

#这是正确的方法:

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

为了好玩,我确实尝试直接签署框架包,但仍然被拒绝。但这正是文档所说的不做的事情。

有人猜测为什么这将被视为无效?我正在使用与我的应用进行代码签名相同的证书-过去一直有效的证书。

我唯一的猜测可能是与现有的插件(我是否需要在框架的Info.plists中拥有标识符?)或权利-有任何建议吗?

xcode itunesconnect codesign mac-app-store
4个回答
41
投票

根据baptr的回答,我开发了这个shell脚本,该脚本对我的所有框架和其他二进制资源/辅助可执行文件(当前支持的类型:dylib,bundle和登录项)进行代码签名:

#!/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

10
投票

您的注释显示您在捆绑软件的版本目录中签署了对象。技术说明显示要对目录本身进行签名。

以下内容更适合Technote:


4
投票

这是我固定的方式;

  • 输入目标的构建设置

0
投票

我这里没有提到的一件事是,您需要将Info.plist放在版本化框架目录中的/ Resources中。否则,当您尝试对版本化的目录签名时,将收到“无法识别,无效或不合适的捆绑格式”错误。

我在这里提供了更扩展的答案:How to Codesign Growl.framework for Sandboxed Mac App

© www.soinside.com 2019 - 2024. All rights reserved.