iOS / OSX 프레임 워크 만들기 : 다른 개발자에게 배포하기 전에 코드 서명이 필요합니까?


90

iOS 및 OSX 프레임 워크를 만드는 방법을 배우고 있습니다. 예를 들어 iOS를 예로 들어 보겠습니다. 지금까지 다음 단계가 저에게 효과적입니다.

  1. -sdk iphonesimulator 및 빌드 작업을 사용하는 xcodebuild 프레임 워크
  2. -sdk iphoneos 및 빌드 작업을 사용하는 xcodebuild 프레임 워크
  3. lipo 도구를 사용 lipo -info하여 예상되는 결과를 생성 하도록 범용 바이너리를 만듭니다 .

fat 파일의 아키텍처 : Foo.framework / Foo : i386 x86_64 armv7 arm64

질문은 다음과 같습니다.

  1. 내 프레임 워크를 사용하는 개발자가 "코드 사인 온 복사"에 의해 재 서명 될 수 있다는 것을 읽었습니다.하지만 전제 조건이 무엇인지 이해하지 못합니다. 예 를 들어 이전에 내 서명 ID로 해당 범용 바이너리를 코드 서명하기 위해 코드 서명 단계를 추가해야합니까? 다른 개발자에게 배포 하시겠습니까?

  2. 이전이 긍정적 인 경우- "iPhone 배포 : ..."ID 또는 "iPhone 개발자 : ..."를 사용해야하는 경우 충분합니다 (일부 iOS 프로젝트의 일부인 내 프레임 워크가 모든 종류의 유효성 검사, 특히 App Store 유효성 검사를 통과하도록 ) ?.

내 대답의 배경은 "CodeSign 오류 : SDK 'iOS 8.3'의 제품 유형 '프레임 워크'에 대해 코드 서명이 필요합니다."입니다. 여러 타사 프레임 워크 및 Carthage # 235 에서 본 적이 있거나 "코드 개체가 서명되지 않았습니다. at all "(한 가지 예 : Realm # 1998 에서보고 한 문제 .

따라서 프레임 워크 사용자가 사용할 때 코드 서명 문제가 발생하지 않도록하고 싶습니다.

추신이 질문은 단일 개발자가 아니라 프레임 워크 공급 업체 인 조직에 적용될 때 더욱 흥미로워집니다.


이 의견 은 'CODE_SIGN_IDENTITY = iPhone Developer'사용을 제안하지만 'iPhone Distribution'대신 'Developer'를 사용하는 이유는 명확하지 않습니다.
Stanislav Pankevich

관련 주제 : 임베디드 프레임 워크를 사용 하지만 명확한 답변이없는 앱 내보내기 .
Stanislav Pankevich

또한 Apple Developer Forums : forums.developer.apple.com/thread/6400 에서이 질문을 속였습니다 .
Stanislav Pankevich 2015 년

프레임 워크를 배포 할 때 질문이 있습니다. 디버그 빌드 또는 릴리스 빌드를 배포합니까? 릴리스 빌드로 배포하는 경우 어떻게해야합니까?
niczm25

@ niczm25, 이것이 내가하는 방법의 한 가지 방법입니다 : stanislaw.github.io/2015/11/23/… .
Stanislav Pankevich

답변:


137

나는 현상금을 열었습니다. "신뢰할 수있는 그리고 / 또는 공식적인 출처에서 얻은 답을 찾고 있습니다." 하지만 그 이후로는받지 못했습니다.

@jackslash가 제공 한 답변은 정확하지만 이야기의 일부만 전달하므로이 질문을하는 순간에보고 싶었던 방식으로 직접 작성하고 싶습니다.

이 답변의 실제는 2015 년 7 월입니다. 상황이 바뀔 가능성이 가장 높습니다.

먼저 프레임 워크의 올바른 코드 서명에 필요한 작업 을 프레임 워크의 개발자가 수행 해야하는 단계프레임 워크의 소비자가 수행 해야하는 단계 로 구분해야한다고 주장합시다 .

TLDR;

OSX 프레임 워크의 경우 : 소비자가 어쨌든 다시 공동 설계하므로 개발자는 코드 서명없이 OSX 프레임 워크를 배포 할 수 있습니다.

iOS 프레임 워크의 경우 : 개발자는 코드 서명없이 iOS 프레임 워크를 배포 할 수 있습니다. 소비자는 어쨌든이를 다시 공동 설계 할 것이기 때문에 개발자는 Xcode가 iOS 장치 용으로 빌드 할 때 프레임 워크를 코드 서명해야합니다.

레이더 때문에 : "시뮬레이터 슬라이스를 포함하는 iOS 프레임 워크는 App Store에 제출할 수 없습니다 . "iOS 프레임 워크 소비자는 iOS 프레임 워크 lipo -remove에서 시뮬레이터 슬라이스를 제거 하는 데 사용 하는 "copy_frameworks"또는 "strip_frameworks"와 같은 특수 스크립트를 실행해야합니다. -codesigns는 프레임 워크를 제거했습니다.이 시점에서 코드 서명 ID가 무엇이든 lipo -remove조작의 부작용으로 제거 되었기 때문입니다 .

더 긴 대답이 이어집니다.


이 답변은 "신뢰할 수있는 및 / 또는 공식적인 출처에서 도출"한 것이 아니라 여러 경험적 관찰을 기반으로합니다.

경험적 관찰 # 1 : 소비자는 개발자로부터받은 프레임 워크를 재 설계 할 것이기 때문에 관심이 없습니다.

Github에서 잘 알려진 오픈 소스 프로젝트의 바이너리 프레임 워크 배포는 코드 서명 되지 않습니다 . 명령 codesign -d -vvvv은 내가 탐색하는 데 사용한 모든 바이너리 iOS 및 OSX 프레임 워크에서 "코드 객체가 전혀 서명되지 않았습니다"를 제공합니다. 몇 가지 예 : ReactiveCocoaMantle , Realm , PromiseKit .

이러한 관찰을 통해 이러한 프레임 워크의 작성자는 소비자를 대신하여 소비자가 코드 서명하도록 의도했음을 알 수 있습니다. 즉, 소비자는 Xcode에서 제공하는 "임베드 프레임 워크"빌드 단계에서 "Code Sign on Copy"플래그를 사용하거나 일부 사용자 지정 셸을 사용해야합니다. 수동으로 동일한 작업을 수행하는 스크립트 : 소비자를 대신하여 프레임 워크를 코드 서명합니다.

그 반대의 예는 하나도 찾지 못했습니다. 코드 서명 ID와 함께 배포되는 오픈 소스 프레임 워크이므로 나머지 답변에서는이 널리 채택 된 접근 방식을 올바른 것으로 가정합니다. 프레임 워크 개발자가 다음을 수행 할 필요가 없습니다. 소비자가 어쨌든 그것을 다시 공동 디자인하기 때문에 코드 서명 ID를 사용하여 다른 개발자에게 프레임 워크를 배포합니다 .

iOS에만 적용되며 전적으로 개발자의 관심사 인 경험적 관찰 # 2

소비자는 개발자로부터받은 프레임 워크가 코드 서명되었는지 여부를 신경 쓰지 않지만, 그렇지 않으면 Xcode가 빌드하지 않기 때문에 개발자 가 빌드 프로세스의 일부로 iOS 프레임 워크를 코드 서명해야합니다CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1' . Justin Spahr-Summers 를 인용하려면 :

OS X 프레임 워크는 빌드 할 때 코드 서명 할 필요가 없습니다. 안타깝게도 Xcode는 빌드 할 때 iOS 프레임 워크를 코드 서명해야합니다.

이것은 내 질문 # 2에 대한 대답입니다. "iPhone Developer"ID는 Xcode를 연결하여 장치 용 iOS 프레임 워크를 구축하는 데 충분합니다. Carthage # 339에 대한이 의견 은 같은 말을합니다.

경험적 관찰 # 3 : 리포 도구

사러 도구의 특정 행동 : 프레임 워크 바이너리에 적용, 항상 반복적으로 그것에서 어떤 통합 설계 ID를 제거 : lipo -create/-remove codesigned framework ... -> not codesigned framework.

이것은 관찰 # 1의 모든 예제가 전혀 코드 서명되지 않은 이유에 대한 답이 될 수 있습니다. lipo가 적용된 후 코드 서명 ID가 날아가지만 관찰 # 1에 따르면 소비자가 신경 쓰지 않기 때문에 괜찮습니다.

이 관찰은 특히 AppStore에 대한 다음 관찰 # 4와 관련이 있습니다.

경험적 관찰 # 4 : 시뮬레이터 슬라이스가 포함 된 iOS 프레임 워크는 App Store에 제출할 수 없습니다.

이것은 Realm # 1163Carthage # 188 에서 광범위하게 논의되며 레이더가 열립니다 : rdar : // 19209161 .

이는 전적으로 소비자의 관심사입니다. 소비자가 애플리케이션에 포함하는 iOS 범용 프레임 워크의 경우 애플리케이션이 빌드 될 때 앱이 AppStore 유효성 검사를 통과 할 수 있도록 해당 프레임 워크의 바이너리에서 시뮬레이터 슬라이스를 제거하는 특수 스크립트 (사용자 지정 실행 스크립트 단계)를 실행해야합니다.

Realm에서 찾은 바이너리 프레임 워크의 좋은 예 : strip-frameworks.sh .

그것은 사용 lipo이외의 다른 아키텍처의 모든 조각을 제거하기 위해 ${VALID_ARCHS}소비자의 신원과 다시 codesigns에게 다음과 -의 관찰 # 3 차기 곳이다 : 프레임 워크 때문에에 사러 조작의 재 codesigned해야한다.

Carthage에는 Consumer에 포함 된 모든 프레임 워크에 동일한 작업을 수행하는 CopyFrameworks.swift 스크립트가 있습니다. 시뮬레이터 슬라이스를 제거하고 Consumer를 대신하여 프레임 워크를 다시 공동 설계합니다.

또한 좋은 기사 : Stripping Unwanted Architectures From Dynamic Libraries In Xcode .


이제 개발자와 소비자의 관점에서 iOS와 OSX를 모두 생산하는 데 필요한 단계에 대한 개요입니다. 먼저 더 쉬운 것 :

OSX

개발자:

  1. OSX 프레임 워크 구축
  2. 소비자에게 제공

개발자는 코드 서명 활동이 필요하지 않습니다.

소비자:

  1. 개발자로부터 OSX 프레임 워크를받습니다.
  2. 프레임 워크를 Frameworks / 디렉토리에 복사하고 "Code Sign on Copy"프로세스의 일부로 소비자를 대신하여 자동으로 코드 서명합니다.

iOS

개발자:

  1. 기기 용 iOS 프레임 워크를 빌드합니다. Xcode는 공동 디자인이 필요하며, "iPhone Developer"아이덴티티면 충분합니다.
  2. 시뮬레이터 용 iOS 프레임 워크를 빌드합니다.
  3. 이전 두 가지에서 범용 iOS 프레임 워크를 생성하는 lipo를 사용합니다. 이 시점에서 1 단계의 코드 서명 ID가 손실됩니다. 범용 프레임 워크 바이너리는 "전혀 서명되지 않았습니다".하지만 "소비자가 신경 쓰지 않기 때문에"괜찮습니다.
  4. 소비자에게 제공

소비자:

  1. 개발자로부터 iOS 프레임 워크를받습니다.
  2. 프레임 워크를 Frameworks / 디렉토리에 복사합니다 (이 단계는 3 단계의 스크립트에 따라 중복 될 수 있습니다.)
  3. 빌드 프로세스의 일부로 특수 스크립트를 사용합니다.이 스크립트는 iOS 프레임 워크에서 시뮬레이터 슬라이스를 제거한 다음 소비자를 대신하여 다시 공동 설계합니다.

9
이것은 귀중한 글입니다. 멋진 일
jackslash

@Stanislaw는 통찰력과 귀중한 데이터에 감사드립니다. 개발자를 위해 자체적으로 설계된 프레임 워크를 작성하면서 앱 스토어에 업로드하기 위해 특별한 스크립트를 만들 필요없이 프레임 워크를 그대로 사용하고 사용할 수 있기를 바랍니다. GoogleMobileAd가 그렇게 작동한다고 생각합니다. 하지만 특정 스크립트를 실행해야한다고 말씀 하셨나요? GoogleMobileAds가이를 요구하지 않는 방법을 알고 계십니까? 감사
마이클

@MichaelA, 참으로 흥미 롭습니다. 내가 볼게.
Stanislav Pankevich

사용중인 GoogleMobileAds에 대한 링크를 제공해 주시겠습니까?
Stanislav Pankevich 2015

1
시간을 절약 해주셔서 감사합니다. Xcode 7.3, Mac OS X 10.11.4.
eugen

21

Carthage repo에서 링크 된 스레드를 읽어 보면 비교적 간단 해 보입니다. 바이너리 프레임 워크를 배포하는 경우 코드 서명이 필요하고 카르타고 또는 코코아 포드를 통해 소스를 배포하는 경우 해당 도구가 다른 방법을 통해이 문제를 처리하지 않습니다.

바이너리 프레임 워크를 배포 할 때 코드 서명을해야하는 이유는 Xcode가 코드 서명 없이는 프레임 워크 바이너리를 생성하지 않기 때문입니다. 바이너리 프레임 워크에 코드 서명을하지 않으려면 다음 오류가 발생합니다.

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

지적했듯이 프레임 워크는 "코드 사인 온 카피"설정으로 다시 디자인 될 것이기 때문에 프레임 워크에 서명하는 ID (iPhone 개발자 또는 iPhone 배포)는 중요하지 않습니다. 즉, 프레임 워크가 애플리케이션에 복사 될 때 프레임 워크 소비자의 개발자 프로필에서 가져온 적절한 인증서로 프레임 워크가 다시 공동 설계됩니다. 즉, 프레임 워크 소비자의 최종 코드 서명 만 볼 수 있으므로 App Store에 문제가 없습니다.

하루가 끝나면 .framework 바이너리에 코드 서명을하는 것이 좋습니다. 이색적인 빌드 프로세스를 유지할 필요가없고 Xcode는 서명 된 프레임 워크 만 출력하므로 너무 멀리 이동해서는 안됩니다. 기본값. 최종 소비자가 다시 서명 할 것이기 때문에 어쨌든 실제로는 중요하지 않습니다.


귀하의 답변에서 두 번째 단락에서는 프레임 워크를 코드 서명 할 필요가 없다고 말하고 있습니다. 이는 소비자가 다시 공동 설계 할 것이기 때문에 프레임 워크를 코드 서명 할 필요가 없으며 이제 95 %가 사실이라고 확신하지만 이해하지 못합니다. 왜 첫 번째 단락에서 "바이너리 프레임 워크를 배포하는 경우 코드 서명이 필요합니다"라고 말하는 이유-차이점은 무엇입니까-바이너리 프레임 워크를 배포하는 경우 (즉, 카르타고 나 코코아 포드를 통한 소스가 아님) 이유 코드 서명이 필요합니까?
Stanislav Pankevich 2015 년

내가 사용하는 배포 (압축 된 .framework 파일, carthage 또는 cocoapods)에 관계없이 내 프레임 워크를 코드 서명해서는 안된다고 생각합니다. 예 : Realm , ReactiveCocoa , OCMockito 와 같은 바이너리 프레임 워크 배포판은 모두 코드 서명되지 않았습니다 .
Stanislav Pankevich 2015 년

그래서 나는 "바이너리 프레임 워크를 배포하는 경우 코드 서명이 필요합니다"와 약간 혼란 스럽습니다. 이는 나머지 답변과 모순됩니다. 명확히하십시오. 또한이 바운티를 "신뢰할 수있는 및 / 또는 공식 출처에서 얻은 답변을 찾고 있습니다."로 열었습니다.
Stanislav Pankevich 2015 년

1
예, Realm과 OCMockito도 살펴 보았습니다. Realm은 "iPhone Developer"신원을 가지고 있으며 OCMockito는 정적 라이브러리입니다. 나는 문제를 이해한다고 생각합니다-코드 서명 된 iphoneos와 공동 설계되지 않은 iphonesimulator를 결합 할 때 iphoneos에서 코드 서명을 제거하는 것은 lipo입니다.
Stanislav Pankevich 2015 년

1
프레임 워크를 배포 할 때 질문이 있습니다. 디버그 빌드 또는 릴리스 빌드를 배포합니까? 릴리스 빌드로 배포하는 경우 어떻게해야합니까?
niczm25
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.