如何在不使用脚本去除模拟器切片的情况下创建动态框架

时间:2017-01-15 03:46:54

标签: ios objective-c swift xcode frameworks

我想创建一个动态框架并分发它。它需要在模拟器,iPhone设备上运行时工作,并且能够提交到App Store。

感谢lipo感谢此guide。它展示了我们如何将模拟器架构与iphone架构结合到一个动态框架中,该框架可以在不分发源代码的情况下进行分发。它允许我使用模拟器和iPhone设备的框架。但是,当我尝试将其发送到App Store because of the simulator build时失败。

迦太基提供了一个有趣的解决方案。它创建了一个适用于模拟器和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?创建这样的框架需要遵循哪些步骤?

1 个答案:

答案 0 :(得分:6)

正如所怀疑的那样,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分发系统在切片时执行此操作。适用于特定设备的应用(“slicing”)。如果我不得不猜测,由于iOS 8及更低版本的支持,App Store发行版会因此类框架失败,因为这些系统不支持从App Store切片。

谷歌创建静态库的原因是为了支持iOS 7.这个时代的一个愚蠢的原因,它为开发人员创造了许多问题,因为谷歌也坚持使用CocoaPods。静态框架,虽然表面看起来像一个银弹(“没有lipo拱门的脚本;没有嵌入”),实际上并不那么好。例如,如果您想要包含非编译资源,静态框架将无法实现(动态框架是捆绑包,而静态框架则不是)。