我想创建一个动态框架并分发它.它需要在模拟器,iPhone设备上运行时工作,并能够提交到App Store.
我知道lipo
感谢本指南.它展示了我们如何将模拟器架构与iphone架构结合到一个动态框架中,该框架可以在不分发源代码的情况下进行分发.它允许我使用模拟器和iPhone设备的框架.但是,当我尝试将其发送到App Store时由于模拟器构建而失败.
Carthage提供了一个有趣的解决方案 它创建了一个适用于模拟器和iPhone的框架.但是当它是时候将它发送到App Store时,我们需要运行一个脚本来撕掉模拟器切片.
但是,DFP广告管理系统(DFP)的创建者已经找到了一种方法来创建适用于模拟器和设备的框架; 通过App Store提交; 并且不需要任何脚本来撕掉模拟器切片(AFAIK).我真正需要做的就是将GoogleMobileAds.framework
文件拖入Linked Frameworks and Libraries
.我不需要Embedded Binaries
像大多数动态框架那样添加它,这有点令人惊讶)
我创建了一个使用DFP的示例项目来演示这一点.
// clone repository git clone --recursive https://github.com/wh1pch81n/DoubleClickGoogleExample.git // Move to correct branch git submodule foreach 'git checkout master' git submodule foreach 'git pull origin master'
现在您可以选择Simulation_mate方案并运行应用程序.该应用将在底部显示一个广告横幅,以显示广告实际正在运行.
依赖图看起来像这样.
Simulation_mate.app -> Mate.framework -> DFP.framework -> GoogleMobileAds.framework
同样,我可以在模拟器,iPhone上运行Simulation_mate,并可以将其提交到App Store.
我的问题是,他们是如何创建这样的GoogleMobileAds.framework的?创建这样的框架需要遵循哪些步骤?
正如所怀疑的那样,GoogleMobileAds.framework是一个静态框架,而不是一个动态框架.
> file GoogleMobileAds GoogleMobileAds: Mach-O universal binary with 5 architectures: [arm_v7: current ar archive] [arm_v7s] [i386] [x86_64] [arm64] GoogleMobileAds (for architecture armv7): current ar archive GoogleMobileAds (for architecture armv7s): current ar archive GoogleMobileAds (for architecture i386): current ar archive random library GoogleMobileAds (for architecture x86_64): current ar archive random library GoogleMobileAds (for architecture arm64): current ar archive
然而,file
在动态框架上运行会得到不同的结果:
> file AppKit AppKit: Mach-O universal binary with 2 architectures: [i386: Mach-O dynamically linked shared library i386] [x86_64] AppKit (for architecture i386): Mach-O dynamically linked shared library i386 AppKit (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
不幸的是,您描述的问题是App Store分发系统的已知限制.从理论上讲,分配动态框架的正确方法应该是在所有体系结构中分发全脂二进制文件,并让构建系统在构建时抛弃不需要的体系结构,或者让App Store分发系统在切片时执行此操作.特定设备的应用程序(" 切片 ").如果我不得不猜测,由于这些系统不支持从App Store切片,App Store发行版因为iOS 8及以下版本的支持而失败了.
谷歌创建静态库的原因是为了支持iOS 7.这个时代的一个愚蠢的原因,它为开发人员创造了许多问题,因为谷歌也坚持使用CocoaPods.静态框架,虽然表面看起来像一个银弹("没有用于lipo
拱门的脚本;没有嵌入"),实际上并不那么好.例如,如果您想要包含非编译资源,静态框架将无法实现这一目标(动态框架是捆绑包,而静态框架则不是).