两个以上的工程同时开发时,如果需要引用相同的网络层、第三方库、工具类等代码,可以考虑将其放到一个workspace
;将共同代码抽取出来,放在该工程的一个framework
中。考虑到编译步骤的复杂性,通常一个workspace
建立一个 framework
就可以了。
这样,在不同工程中只要引用该framework
,即可调用它里面的方法。不用同一份代码拷贝两个以上的地方,避免不同工程中的实现代码不一致,提高了开发效率和可维护性。
本文以极光推送(JPush
)SDK
为例,一步步将极光推送的.a
库以framework
的形式打包进自己项目的workspace
。项目发布在我的GitHub主页。
整个步骤走完即可避免项目实施过程中的坑。下面一起来看看吧。
一、创建工程
首先创建一个workspace
、包含一个Cocoa Touch Framework
和一个Swift
工程。这个比较简单。目录结构如下:
二、修改UtilLib工程配置
2.1、修改UtilLib
工程的Build Phases
如下:
2.2、修改UtilLib -> Build Settings
配置如下:
三、修改WorkProj配置,运行工程
3.1、WorkProj
工程中,在Build Phases -> Link Binary With Libraries
中添加新建的库.framework
。引用新建的framework
。
3.2、新建桥接文件WorkProj-Bridging-Header.h
。因为中Swift中混编OC,需要桥接。
#WorkProj-Bridging-Header.h
#ifndef WorkProj_Bridging_Header_h
#define WorkProj_Bridging_Header_h
#import <UtilLib/JPUSHService.h>
#endif /* WorkProj_Bridging_Header_h */
3.3、在工程的Build Settings
设置OC
桥接文件名称(在工程根路径下可直接写文件名,否则要写它的相对路径)
四、准备就续,首先运行UtilLib
工程,再运行WorkProj
工程:
可以正常运行了。
查看编译后的文件,虽然
UtilLib.framework
只有844Kb
,但是在外部工程中可以链接并调用UtilLib.framework
的方法。
五、错误收集:
这期间有不少的坑,有些是能非常简单的解决的,有些在网上并没有直接的解决办法。现在列出来记录一下:
5.1、如果路径不对,会报如下的错误。此时在Objective-C Bridging Header中设置它的路径即可。
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)
大意是JPUSHService
没有实现文件。原因是UtilLib.framework
文件中并不包含JPUSHService
类的实现。
解决办法是在framework -> Build Settings -> Other Linker Flags
加入-all_load
、-ObjC
。即文中2.2步骤。