我打开悬赏金:“寻找可靠和/或官方来源的答案。” 但此后再也没有收到过。
虽然@jackslash提供的答案是正确的,但它只讲述了故事的一部分,因此我想以自己想问这个问题的方式来编写自己的故事。
答案的现实是:2015年7月。情况很可能会改变。
首先让我们断言的是需要框架的正确的代码签名行动应该分为步骤该框架的开发者已采取和步骤该框架的消费者必须采取。
TLDR;
对于OSX框架:开发者可以自由分发OSX框架,而无需对其进行代码签名,因为Consumer仍将对其进行重新设计。
对于iOS框架:开发者可以自由分发iOS框架而无需对其进行代码签名,因为Consumer仍然会重新设计它,但是Xcode迫使Developer在为iOS设备构建时对其框架进行代码签名。
由于雷达的原因:“无法将包含模拟器切片的iOS框架提交给App Store” iOS框架的使用者被迫运行特殊脚本,例如“ copy_frameworks”或“ strip_frameworks”,该脚本会lipo -remove
从iOS框架中剥离模拟器切片并重新-codesigns剥离了框架,因为此时它的代码签名身份(无论是否曾经)都被删除,这是lipo -remove
操纵的副作用。
答案更长。
这个答案不是“从可靠的和/或官方的来源中汲取”,而是基于许多经验性的观察。
经验观察#1:消费者不在乎,因为他们将重新设计从开发人员那里收到的框架
Github上著名的开源项目的二进制框架发行版未进行代码签名。命令codesign -d -vvvv
给出:在我以前研究过的所有二进制iOS和OSX框架上,“代码对象根本没有签名”。一些示例: ReactiveCocoa和 Mantle,Realm,PromiseKit。
从这个观察结果可以明显看出,这些框架的作者希望它们由Consumer进行代码签名,即消费者必须在Xcode提供的“ Embed frameworks”构建阶段中使用“ Code Sign on Copy”标志或使用某些自定义shell手动执行相同操作的脚本:代表使用者对框架进行符号签名。
我没有发现相反的任何例子:开源框架将在其中带有代码签名身份进行分发,因此在其余的答案中,我假设这种被广泛采用的方法是正确的:无需框架开发人员将其框架分发给具有代码签名身份的其他开发人员,因为消费者仍然会重新设计它。
经验性观察#2仅适用于iOS,完全是开发人员的关注点
尽管Consumer不在乎是否从Developer接收到的框架是否经过代码签名,但在为iOS设备构建iOS框架时,Developer仍需要对其iOS框架进行代码签名,因为否则Xcode不会构建:CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'
。引用贾斯汀·斯帕夏(Justin Spahr-Summers):
OS X框架不需要在构建时进行代码签名...不幸的是,Xcode确实要求iOS框架在构建时进行代码签名。
这很好地回答了我的问题2:“ iPhone开发者”身份足以哄骗Xcode,以便它将为设备构建iOS框架。关于迦太基#339的评论也是如此。
经验观察#3:脂工具
lipo工具的特定行为:应用于框架二进制文件时,它总是以递归方式从中删除任何代码符号标识:lipo -create/-remove codesigned framework ... -> not codesigned framework
。
这可能是一个答案,为什么观察点1中的所有示例都根本没有进行代码签名:在应用脂质之后,它们的代码签名身份被吹走了,但是由于根据观察点1,消费者并不在意它是好的。
该观察与下一个关于AppStore的观察#4特别相关。
经验观察之四:无法将包含模拟器切片的iOS框架提交到App Store
在Realm#1163和Carthage#188中广泛讨论了此问题,并且打开了雷达:rdar:// 19209161。
这完全是消费者的关注点:对于消费者包括在其应用程序中的iOS通用框架,在构建应用程序时,他们必须运行特殊脚本(自定义运行脚本阶段),该脚本会从该框架的二进制文件中删除模拟器切片,以便应用程序可以通过AppStore验证。
我在Realm中找到的二进制框架的好例子:strip-frameworks.sh。
它用于lipo
删除除架构之外的所有架构片段,${VALID_ARCHS}
然后使用Consumer的身份进行重新设计-这就是观察#3的地方:由于对lipo的操纵,将对框架进行重新编码。
迦太基拥有CopyFrameworks.swift脚本,该脚本对Consumer所包含的所有框架都具有相同的作用:它剥离了模拟器片段,并代表Consumer进行重新设计框架。
也有一篇不错的文章:在Xcode中从动态库中删除不需要的体系结构。
现在,从开发人员和消费者的角度概述生产iOS和OSX所需的步骤。首先比较简单:
OSX
开发商:
- 建立OSX框架
- 给消费者
开发人员不需要进行代码签名活动。
消费者:
- 从开发人员那里接收OSX框架
- 将框架复制到Frameworks /目录,并在其使用方的代表下自动对其进行代码签名,作为“复制代码签名”过程的一部分。
的iOS
开发商:
- 为设备构建iOS框架。Xcode需要协同设计,“ iPhone Developer”的身份就足够了。
- 为模拟器构建iOS框架。
- 使用从前两个产生通用iOS框架的lipo。在这一点上,失去了第一步的代码签名身份:通用框架二进制文件“根本没有签名”,但这很好,因为“消费者不在乎”。
- 给消费者
消费者:
- 从开发人员那里接收iOS框架
- 将框架复制到Frameworks /目录(此步骤可能是多余的,具体取决于步骤3中的脚本。)
- 在构建过程中使用特殊脚本:此脚本从iOS框架中剥离模拟器片段,然后代表其使用者重新进行协同设计。