Xcode11制作Framework

Xcode11制作Framework

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

source.jpg

创建Framework

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

create.jpg

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

projectname.jpg

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

deployinfo.jpg

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

publicheader.jpg

注意:因为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的问题,如果你的源图片为[email protected],获取bundle中该图片路径时资源名也需要使用pic@2x。

至此,Framework的封装基本结束了,新建一个Demo工程,测试一下效果:

demo.jpg

注意: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,效果如下:

demoscreen.png

Demo地址

扩展阅读:


本文由Openwit 创作,采用知识共享署名4.0国际许可协议进行许可。
本站文章除注明转载外,均为本站原创或翻译,转载请注明出处。
最后更新于: 2020-04-03

# Framework 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×