今天介绍一下怎么制作Framework,之前写过一个录音的控件BYAudioHudView,拿它举例,把它封装一下。
先看一下最早的Demo工程,红框部分为控件的源码,下面把这部分封装为Framework。

创建Framework
打开Xcode,新建Framework,如下图所示:

点击Next,输入工程名BYAudioHud,因为之前的源码是OC实现的,这里语言选择Objective-C。

把源码拖进新建好的Framework工程,调整一下Deployment Info,例如调整为要求iOS9.0及以上(一般情况以最新iOS版本往前推3个版本,具体以主工程为主):

把要暴露的头文件拖到Public中

注意:因为BYAudioHud.framework依赖libmp3lame.a,所以最好将lame.h也放在public中暴露出去,这样如果主工程也依赖libmp3lame.a,则直接将主工程中的依赖删除即可。
因为BYAudioHud为一个录音控件,用到了一些图片资源,图片的加载方式如下:
UIImageView *microPhoneImageView = [[UIImageView alloc] initWithFrame:CGRectMake(55.0, 8.0, 50.0, 99.0)];
microPhoneImageView.image = [UIImage imageNamed:@"RecordingBkg"];
因为之前控件是以源码形式存在于Demo工程里,这种写法没有问题,但是在Framework中,这种加载方式就有问题了,需要做如下修改:
NSString *path = [NSString stringWithFormat:@"Frameworks/BYAudioHud.framework/%@", @"RecordingBkg"];
microPhoneImageView.image = [UIImage imageNamed:path];
检查一下源码中类似的资源加载代码,统一参考以上方式做修改。(BYAudioHud.framework为最终Target的名字)
注意:还有另一种方式,新建bundle,将资源文件统一放在bundle中,Framework和使用该Framework的主工程都要添加该bundle,如果你的Framework中包含很多资源文件,例如mp3、plist等,推荐采用bundle形式。但是加载图片时要注意@2x和@3x的问题,如果你的源图片为pic@2x.png,获取bundle中该图片路径时资源名也需要使用pic@2x。
至此,Framework的封装基本结束了,新建一个Demo工程,测试一下效果:

注意:BYAudioHud.framework为Dynamic类型的,需要设为Embed & Sign,不然会报Library not loaded错误:
dyld: Library not loaded: @rpath/BYAudioHud.framework/BYAudioHud
Referenced from: /Users/admin/Library/Developer/CoreSimulator/Devices/EED108EE-FFEA-48CD-AAE8-E5EEF075A9F1/data/Containers/Bundle/Application/D1F79734-5A8C-4DA8-A439-A8F3120403BC/BYAudioHudDemo.app/BYAudioHudDemo
Reason: image not found
Command+R运行Demo,效果如下:

网友评论