iOS .a库打包成.framework(将极光推送的.a库打包进framework)

两个以上的工程同时开发时,如果需要引用相同的网络层、第三方库、工具类等代码,可以考虑将其放到一个workspace;将共同代码抽取出来,放在该工程的一个framework中。考虑到编译步骤的复杂性,通常一个workspace建立一个 framework就可以了。
这样,在不同工程中只要引用该framework,即可调用它里面的方法。不用同一份代码拷贝两个以上的地方,避免不同工程中的实现代码不一致,提高了开发效率和可维护性。

本文以极光推送(JPushSDK为例,一步步将极光推送的.a库以framework的形式打包进自己项目的workspace。项目发布在我的GitHub主页。
整个步骤走完即可避免项目实施过程中的坑。下面一起来看看吧。

一、创建工程

首先创建一个workspace、包含一个Cocoa Touch Framework和一个Swift工程。这个比较简单。目录结构如下:

iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第1张图片
工程目录

二、修改UtilLib工程配置

2.1、修改UtilLib工程的Build Phases如下:
iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第2张图片
UtilLib.xcodeproj
2.2、修改UtilLib -> Build Settings配置如下:
iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第3张图片
UtilLib.xcodeproj

三、修改WorkProj配置,运行工程

3.1、WorkProj工程中,在Build Phases -> Link Binary With Libraries中添加新建的库.framework。引用新建的framework
iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第4张图片
WorkProj.xcodeproj
3.2、新建桥接文件WorkProj-Bridging-Header.h。因为中Swift中混编OC,需要桥接。
#WorkProj-Bridging-Header.h
#ifndef WorkProj_Bridging_Header_h
#define WorkProj_Bridging_Header_h

#import 

#endif /* WorkProj_Bridging_Header_h */
3.3、在工程的Build Settings设置OC桥接文件名称(在工程根路径下可直接写文件名,否则要写它的相对路径)
iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第5张图片
WorkProj.xcodeproj

四、准备就续,首先运行UtilLib工程,再运行WorkProj工程:

AppDelegate.swift

可以正常运行了。
查看编译后的文件,虽然 UtilLib.framework只有 844Kb,但是在外部工程中可以链接并调用 UtilLib.framework的方法。

五、错误收集:

这期间有不少的坑,有些是能非常简单的解决的,有些在网上并没有直接的解决办法。现在列出来记录一下:

5.1、如果路径不对,会报如下的错误。此时在Objective-C Bridging Header中设置它的路径即可。
screenshot7.png
5.2、运行WorkProj工程,会报错误:
Undefined symbols for architecture x86_64:  "_OBJC_CLASS_$_JPUSHService", referenced from:      objc-class-ref in AppDelegate.old: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
iOS .a库打包成.framework(将极光推送的.a库打包进framework)_第6张图片
implementation not found

大意是JPUSHService没有实现文件。原因是UtilLib.framework文件中并不包含JPUSHService类的实现。
解决办法是在framework -> Build Settings -> Other Linker Flags加入-all_load-ObjC。即文中2.2步骤

你可能感兴趣的:(iOS .a库打包成.framework(将极光推送的.a库打包进framework))