최근 제출 후 다음 오류가 발생했습니다.
잘못된 서명-중첩 된 앱 번들 (FooBar.app/Contents/Frameworks/GData.framework)이 서명되지 않았거나 서명이 잘못되었거나 Apple 제출 인증서로 서명되지 않았습니다. 자세한 내용은 코드 서명 및 애플리케이션 샌드 박싱 가이드를 참조하세요.
잘못된 서명-중첩 된 App Bundle (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
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
재미로 프레임 워크 번들에 직접 서명을 시도했지만 여전히 거부되었습니다. 그러나 그것은 정확히 문서가하지 말라고 말한 것입니다.
왜 그것이 유효하지 않은지 추측합니까? 나는 과거에 작동했던 내 앱을 코딩하는 데 사용하는 것과 동일한 인증서를 사용하고 있습니다.
내 유일한 추측은 기존 plist (프레임 워크의 Info.plists에있는 식별자를 소유해야합니까?) 또는 권한 (제안 사항)과 관련이있을 것입니다.
답변
baptr의 답변을 기반으로 모든 프레임 워크 및 기타 바이너리 리소스 / 보조 실행 파일 (현재 지원되는 유형 : 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
- 프로젝트의 파일에 저장하십시오.
Scripts
내 프로젝트 루트의 하위 디렉토리에 사본을 보관 합니다.- 내 이름은
codesign-frameworks.sh
.
- 내 이름은
- “임베디드 프레임 워크 복사”빌드 단계 직후에 “스크립트 실행”빌드 단계를 추가합니다.
- 이를 “Codesign Embedded Frameworks”라고 부를 수 있습니다.
./codesign-frameworks.sh
스크립트 편집기 텍스트 필드에 붙여 넣으 십시오 (또는 위에서 스크립트라고 부르는 이름)../Scripts/codesign-frameworks.sh
스크립트를 하위 디렉토리에 저장하는 경우 사용 합니다.- 앱을 빌드하십시오. 번들로 제공되는 모든 프레임 워크는 코드 서명됩니다.
여전히 ” ID : 모호함 (일치 :…”오류가 발생하면 아래에 주석을 달아주십시오. 더 이상 발생하지 않아야합니다.)
업데이트 된 2012-11-14 : 이름에 특수 문자가 포함 된 프레임 워크 (작은 따옴표는 포함되지 않음)에 대한 지원이 “codesign-frameworks.sh”에 추가되었습니다.
업데이트 된 2013 년 1 월 30 일 : “codesign-frameworks.sh”에 모든 경로 (작은 따옴표 포함)의 특수 문자 지원 추가.
업데이트 된 2013-10-29 : 실험적인 dylib 지원 추가.
업데이트 된 2013 년 11 월 28 일 : 권한 지원 추가. 실험적 dylib 지원 개선.
업데이트 된 2014 년 6 월 13 일 : (중첩 된) 프레임 워크를 포함하는 프레임 워크의 코드 서명 문제 수정. 이것은 추가하여 이루어졌다 -depth
에 옵션 find
의 원인, find
깊이 우선 탐색을 할 수 있습니다. 이것은 여기에 설명 된 문제로 인해 필요하게되었습니다 . 간단히 말해서 포함 번들은 중첩 번들이 이미 서명 된 경우에만 서명 할 수 있습니다.
업데이트 된 2014 년 6 월 28 일 : 실험용 번들 지원 추가.
업데이트 된 2014 년 8 월 22 일 : 코드 개선 및 IFS 복원 실패 방지.
업데이트 된 2014 년 9 월 26 일 : 로그인 항목에 대한 지원 추가.
2014 년 10 월 26 일 업데이트 : 디렉터리 확인 인용. 이렇게하면 “31/42 행 : 너무 많은 인수”오류와 특수 문자를 포함하는 경로에 대한 “코드 개체가 전혀 서명되지 않았습니다”오류가 수정됩니다.
업데이트 된 2014-11-07 : Xcode에서 자동 ID 확인을 사용할 때 모호한 ID 오류 (예 : “Mac Developer : ambiguous…”)를 해결합니다. 더 이상 명시 적으로 ID를 설정할 필요가 없으며 “Mac Developer”만 사용할 수 있습니다!
2015 년 8 월 7 일 업데이트 : 의미 체계 개선.
개선을 환영합니다!
답변
귀하의 의견은 번들의 버전 디렉토리 내에서 객체에 서명했음을 보여줍니다. 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
답변
이것이 내가 고친 방법입니다.
- 대상의 빌드 설정을 입력하십시오.
- “기타 코드 서명 플래그”줄을 찾습니다.
- 릴리스 매개 변수에 –deep 값을 입력하십시오.
- XCode 닫기
- Mac의 파생 데이터 폴더로 들어가 이전 파생 데이터를 삭제합니다 (기본 경로 : / Users / YOUR_USER_NAME / Library / Developer / Xcode / DerivedData).
- Xcode를 열고 빌드
빌드 아카이브 후 앱을 다시 제출하십시오 …
답변
여기서 언급하지 않은 한 가지는 버전이 지정된 프레임 워크 디렉토리의 / Resources 내에 Info.plist가 있어야한다는 것입니다. 그렇지 않으면 버전이 지정된 디렉토리에 서명하려고 할 때 “인식 할 수없는 번들 형식, 유효하지 않은 또는 적합하지 않은”오류가 발생합니다.
여기에 좀 더 확장 된 답변을 제공했습니다 : 샌드 박스 Mac 앱용 Growl.framework 공동 디자인 방법