使用Xcode 6,我们可以创建自己的动态Cocoa Frameworks.

enter image description here

因为:

  • 模拟器仍在使用32-bit个库

  • 从2015年6月1日开始,提交给app Store的应用程序更新必须包括64位支持,并使用iOS 8 SDK(developer.apple.com)构建

我们必须制作FAT库来在设备和模拟器上运行项目.即在框架中既支持32位又支持64位.

但我没有找到任何手册,如何将export个通用FAT框架用于将来与其他项目的集成(并与某人共享此库).

以下是我复制的步骤:

  1. Build Settings中设置ONLY_ACTIVE_ARCH=NO

    enter image description here

  2. 将支持armv7 armv7s arm64 i386 x86_64添加到Architectures(肯定)

enter image description here

  1. 构建框架并在Finder中将其打开:

enter image description here enter image description here

  1. 将此框架添加到另一个项目中

实际结果:

但是最终在设备和模拟器上同时运行这个框架的项目还是有问题的.

  • 如果我从Debug-iphoneos文件夹中提取框架-它可以在设备上运行 并在模拟器上出现错误:ld: symbol(s) not found for architecture i386

      xcrun lipo -info CoreActionSheetPicker
    

    fat文件中的体系 struct :CoreActionSheetPicker是:armv7 armv7s arm64

  • 如果我从Debug-iphonesimulator文件夹中提取框架-它可以在模拟器上运行.我在设备上有错误:ld: symbol(s) not found for architecture arm64

      xcrun lipo -info CoreActionSheetPicker
    

    fat文件中的体系 struct :CoreActionSheetPicker是:i386 x86_64

那么,如何创建一个在设备和模拟器上工作的动态框架呢?

这个答案与Xcode 6 iOS Creating a Cocoa Touch Framework - Architectures issues有关,但不是重复的.


更新:

我为这个案子找到了一个"肮脏的黑客".看我的answer below美元. 如果有人知道更方便的方式-请让我知道!

推荐答案

这个答案的实际情况是:2015年7月.最有可能的是,情况会发生变化.

TLDR;

目前Xcode没有自动导出通用FAT框架的工具,开发者只能手动使用lipo工具.同样,根据深渊翻滚之前的this radar%,AppStore的开发者是框架的消费者,也必须使用lipo来从框架中剥离模拟器切片.

更长的答案如下


我在这个主题(答案底部的链接)中也做了类似的研究.

我还没有找到任何关于发布的官方文件,所以我的研究是基于对苹果开发者论坛、迦太基和Realm项目的探索,以及我自己使用xcodebuildlipocodesign个工具进行的实验.

以下是苹果开发者论坛thread Exporting app with embedded framework的一段长引语(我有一点标记):

What is the proper way to export a framework from a framework project?

目前唯一的方法就是您所做的:

  • 为模拟器和iOS设备构建目标.
  • 导航到该项目的Xcode的DerivedData文件夹,将两个二进制文件合并到一个框架中.但是,在Xcode中构建框架目标时,请确保将目标设置"仅构建活动体系 struct "调整为"否".这将允许Xcode为多种二进制类型(arm64、armv7等)构建目标.这就是为什么它可以从Xcode工作,但不能作为一个独立的二进制文件.

  • 此外,您还需要确保将方案设置为发布构建,并针对发布构建框架目标. 如果仍然出现库未加载错误,请判断框架中的代码片段.

  • 使用lipo -info MyFramworkBinary并判断结果.

lipo -info MyFrameworkBinary

结果是i386 x86_64 armv7 arm64

  • 现代通用框架将包括4个部分,但可能包括更多:i386 x86_64 armv7 arm64

这描述的过程与@Skywinder在他的回答中描述的过程非常相似.

这就是Carthage uses lipoRealm uses lipo是怎么回事.


IMPORTANT DETAIL

有雷达:Xcode 6.1.1 & 6.2: iOS frameworks containing simulator slices can't be submitted to the App Store,并在Realm#1163Carthage#188上围绕它进行了长时间的讨论,最终以特殊的解决方法结束:

before submission to AppStore iOS framework binaries must be stripped off back from simulator slices

迦太基有特殊代码:CopyFrameworks和相应的文件:

此脚本在通用二进制触发的App Store submission bug左右工作.

领域有特殊的脚本:strip-frameworks.sh和相应的文档:

在归档通用二进制文件时,这一步需要达到App Store submission bug左右.

还有一篇好文章:Stripping Unwanted Architectures From Dynamic Libraries In Xcode篇.

我自己使用的是Realm's strip-frameworks.sh,它在没有任何修改的情况下完美地为我工作,当然任何人都可以自由地从头开始编写一个.


我推荐阅读我的主题链接,因为它包含这个问题的另一个方面:代码签名-Creating iOS/OSX Frameworks: is it necessary to codesign them before distributing to other developers?

Ios相关问答推荐

iPhone:iOS 17.4中没有气压数据

如何使用超薄material ,但没有浅色/填充?

在flutter中使用flatter_screenutil这样的软件包的目的是什么?

mapView swift 导致警告有网格错误

SwiftUI - 如何从主题感知命名 colored颜色 中获取正确的 RGB 值?

SwiftUI 图像与下拉视图切换一起 skip

卡在 Apple 的 SwiftUI 教程第 5 章(更新应用数据)

如何在swiftui中更改可搜索的搜索图标 colored颜色

SwiftUI 切换语句

按钮在 SwiftUI 中没有采用给定的高度和宽度

在 Swift 中合并子数组

Xcode - 错误 ITMS-90635 - Bundle 包中的 Mach-O 无效 - 提交到 App Store

动画 UILabel 字体大小更改

向标签栏控制器添加新标签

Swift中类的初始化类方法?

核心数据 - 无法在路径加载优化模型

aps-environment 始终在发展

关闭通过模态 segue 显示的视图

判断从 JSON 字符串返回的 Objective-C 中的空值

IOS - 从 UITextView 中删除所有填充