cse*_*ton 80 xcode itunesconnect codesign mac-app-store
最近提交后,我收到以下错误:
签名无效 - 嵌套的应用程序包(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
Run Code Online (Sandbox Code Playgroud)
Technote 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
Run Code Online (Sandbox Code Playgroud)
为了好玩,我确实尝试直接签署框架包,它仍然被拒绝.但这正是文件所说的不做的事情.
任何猜测为什么会被视为无效?我正在使用相同的证书来代码签署我的应用程序 - 过去曾经使用过的那个.
我唯一的猜测是与现有的plists有关(我需要在框架的Info.plists中拥有标识符吗?)或权利 - 任何建议?
Jan*_*nX2 42
基于baptr的答案,我开发了这个shell脚本,它编码所有我的框架和其他二进制资源/辅助可执行文件(当前支持的类型:dylib,bundle和login items):
#!/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
Run Code Online (Sandbox Code Playgroud)
Scripts在项目根目录的子目录中.
codesign-frameworks.sh../codesign-frameworks.sh(或上面称为您的脚本的任何内容)粘贴到脚本编辑器文本字段中.使用./Scripts/codesign-frameworks.sh,如果你存储脚本的子目录.如果你仍然得到一个" 身份:模棱两可(匹配:......"错误,请在下面评论.这不应该再发生了.
更新时间: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进行深度优先遍历.由于此处描述的问题,这已成为必要.简而言之:只有在嵌套包已经签名的情况下,才能对包含的包进行签名.
更新2014-06-28:添加实验包支持.
更新2014-08-22:改进代码并防止无法恢复IFS.
更新2014-09-26:添加对登录项的支持.
更新2014-10-26:引用目录检查.这修复了"31/42行:太多参数"错误,并且包含特殊字符的路径产生的"代码对象根本没有签名"错误.
更新2014-11-07:在Xcode中使用自动身份解析时解决模糊身份错误(如"Mac Developer:模糊...").您不必再明确设置身份,只需使用"Mac Developer"即可!
更新2015-08-07:改进语义.
欢迎改进!
bap*_*ptr 10
您的注释显示您在包的版本目录中签署了对象.Technote显示签署目录本身.
以下与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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32877 次 |
| 最近记录: |