如何在不共享源代码的前提下分发自定义Framework?
嘿,这个问题我之前帮团队处理过——核心原因是你之前的分发方式还是让Carthage能接触到源码,或者编译出的Framework带了调试符号关联到源码。要实现只分发二进制不暴露源码,得从预编译二进制和配置Carthage二进制分发这两方面入手:
第一步:生成干净的Release版本Framework
首先在Xcode里用Release配置编译你的Framework,确保开启这些设置:- 在Build Settings里找到
Strip Debug Symbols During Copy,设为YES - 找到
Deployment Postprocessing,设为YES - 找到
Strip Style,选择Non-Global Symbols(保留公共接口符号,不影响正常使用)或者All Symbols(更彻底的符号剥离)
编译完成后,你需要合并真机和模拟器的架构(如果要支持全平台),用
lipo命令:lipo -create "/path/to/device/FrameworkName.framework/FrameworkName" "/path/to/simulator/FrameworkName.framework/FrameworkName" -output "/path/to/universal/FrameworkName.framework/FrameworkName"最后把这个通用架构的.framework打包成zip文件,不要包含任何源码或dSYM文件(除非你需要给用户提供崩溃日志调试的能力,但dSYM不会暴露源码)。
- 在Build Settings里找到
第二步:配置Carthage支持二进制分发
现在要让用户的Carthage直接拉取你预编译的二进制,而不是源码。有两种常用方式:用JSON清单文件分发
创建一个YourFramework.json文件,内容格式如下(对应你的各个版本下载链接):{ "1.0.0": "https://your-server.com/releases/YourFramework-1.0.0.zip", "1.0.1": "https://your-server.com/releases/YourFramework-1.0.1.zip" }然后用户的
Cartfile里只需要写:binary "https://your-server.com/YourFramework.json" ~> 1.0执行
carthage update --use-binaries就能直接下载预编译的二进制。通过GitHub Release分发
把你的Framework zip包上传到GitHub仓库的Release中,然后用户可以直接引用这个Release的二进制(建议把源码仓库设为私有,避免用户拉取源码):binary "https://github.com/your-username/your-repo/releases/download/1.0.0/YourFramework.zip"
第三步:验证效果
让用户按照上面的方式集成后,在Xcode里调试时尝试查看Framework内部的类实现,应该只会看到汇编代码,而不是你的原始源码。如果还是能看到,检查下是不是Framework里还附带了调试符号,或者用户有没有意外拉取到源码仓库。
额外提醒:如果你的源码仓库是公开的,即使你分发了二进制,用户还是能克隆源码。所以最好把源码仓库设为私有,只对外提供二进制分发的渠道。
内容的提问来源于stack exchange,提问作者Nimisha Khandelwal

