关于Xcode11的XCFrameworks框架

8,854

关于Xcode11的XCFrameworks框架

个人的博客新域名 www.josercc.com

对于今年2019年的WWDC大会新出的一个XCFrameworks,对于这个框架的介绍的资料少之又少。只有一个简单介绍创建生成的Session视频还附带的PDF说明。

文档

Xcode发行说明

An XCFramework makes it possible to bundle a binary framework or library for multiple platforms —including iOS devices, iOS simulators, and Mac Catalyst — into a single distributable .xcframework bundle that your developers can use within their own applications. An .xcframework bundle can be added to an Xcode target’s Link Libraries phase and Xcode uses the right platform’s version of the included framework or library at build time. Creation of frameworks is supported from the command line using xcodebuild -create-xcframework. Frameworks or libraries bundled in an XCFramework should be built with the Build Libraries for Distribution build setting set to YES. (49948269)

XCFramework使将多个平台(包括iOS设备,iOS模拟器和Mac Catalyst)的二进制框架或库捆绑到一个可分发的.xcframework捆绑包中,开发人员可以在自己的应用程序中使用它。 可以将.xcframework捆绑包添加到Xcode目标的“链接库”阶段,并且Xcode在构建时使用所包含框架或库的正确平台版本。 使用xcodebuild -create-xcframework从命令行支持框架的创建。 XCFramework中捆绑的框架或库应使用“分发的构建库”构建设置设置为“ YES”来构建。 (49948269)

Session视频地址

developer.apple.com/videos/play…

文档说明

devstreaming-cdn.apple.com/videos/wwdc…

其他第三方的资料

appspector.com/blog/xcfram…

github.com/bielikb/xcf…

juejin.cn/post/684490…

正文

关于对于上面资料和文章的研究阅读,其实新出的XCFrameowrks也不复杂。

作用

下面的总结可能阅读有问题造成误解,请及时的指正。

  • 包含模拟器和真机

    这个对于之前的没有大不同,只不过不需要用lipo命令进行合并了。

  • 包含多个平台

    这个很重要,之前不同的平台需要创建不同的库。现在可以全部放在一起了,这也是苹果为了以后开发基于iPad的Mac应用。

  • 可以包含其他第三方的库

    这个还挺有意思的,可以将依赖的其他第三方库。不管是静态的Framework还是.a都可以塞进去。之前是直接打进二进制了。

  • 可以不用设置复杂的头文件路径

    终于不用在Xcode设置查找库头文件路径了,这个虽然之前拖进去时候Xcode会自动帮我们处理,但是有时候还是遇到找不到头文件的问题。

  • 可以在库里面设置权限

    这个资料没有太多,之前的库是依赖于工程的权限的。比如我最近遇到的一个第三方静态库,需要访问WIFI权限。结果在基于iOS13以上因为权限问题崩溃,没什么解决办法。只能让自己工程开启这个权限,不知道会不会影响审核。

    这个新库是不是意味着库也可以申请权限,不需要工程做复杂的配置了?有人清楚可以留言说一下,我不是太清楚。

  • 二进制的稳定性

    这个我觉得是最大的亮点了,因为之前Swift也可以编译成静态库。但是对于不同的Xcode因为Swift版本的不同,造成编译器的不同,从而生成的Swift静态库无法在不同Xcode版本运行。当时真是头大,针对不通的Xcode版本发布不同版本。

    现在基于Swift5.0ABI的稳定性可以在生成的XCFrameworks解决了,真是让我们欢呼雀跃。

创建XCFramewords

创建XCFrameworks其实十分的简单,和之前我们用XCode创建Framework一样的步骤。只不过需要我们在Build Setting里面设置一下。

image-20191216102939161

Build Libraires For Distribution = YES

编译不同平台的库

xcodebuild archive
-scheme [Name]
-destination "…"
-destination "…"
…
-destination "…"
SKIP_INSTALL=NO
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

通过生成的.xcarchive文件里面获取生成的库文件。路径可以从下面获取

[Path].xcarchive/Products/Library/Frameworks/[Name].framework

合成XCFrameworks

xcodebuild -create-xcframework
-framework [path]
-framework [path]
…
-framework [path]
-output [Name].xcframework

这就完成了,步骤很简单。但是了解作用十分的麻烦,下面的图描述制作的步骤。

image-20191216104043169

使用XCFrameworks

我们已经创建出来XCFramworks怎么使用,或者让客户使用呢。

  • Xcode11进行拖拽(现在就已经支持)

    image-20191216104544017

    找到Frameworks,Libraries,and Embedded Content地方,拖拽进去即可。

  • Cocoapods(1.9.0版本以后才会支持,如果早点支持我就把目前一个静态库换成XCFrameworks)

  • Carthage(据说已经支持,但是好像还没发布新版本。)

脚本制作XCFrameworks

下面是我昨天抽空写的一个制作XCFrameworks的脚本,让制作XCFramework更加的简单。

github.com/josercc/XCF…

安装

  • 如果之前没有安装过Mint请安装

    brew install mint
    
  • 安装XCFrameworkBuild

    mint install josercc/XCFrameworkBuild xcbuild
    

制作

xcbuild /Users/zhangxing/Downloads/MyFramework/MyFramework.xcodeproj /Users/zhangxing/Downloads/Output
  • 第一个参数是xcodeproj文件的路径
  • 第二个参数是生成路径

image-20191216105650811

我们在生成的路径就可以找到对应的库了。

image-20191216105735287

后面继续完善这个脚本程序,可以支持自定义合成XCframework,可以添加新库进去等。

更多的功能请输入

xcbuild --help