Xcode7打包Framework

作者: LayneWang | 来源:发表于2015-11-30 19:45 被阅读10485次

一、打包Framework

1、新建iOS->Framework & Library->Cocoa Touch Framework

2、选择next进入下一步

3、在PROJECT->Deployment Target->iOS Deployment Target选择你需要支持的最低系统。

同样的操作在TARGETS中,Deployment Info->Deployment Target

4、由于我的framework需要支持iOS7,所以在第2、3步中进行了相应的设置。Build时会发现有️ld: warning: embedded dylibs/frameworks only run on iOS 8 or later警告,这是因为工程默认编译设置的是Dynamic Framework。这种编译只有在iOS8以后才能使用。

5、针对第4步中所出现的问题,根据需求我的工程不需要使用动态framework,以使用其动态更新的功能。动态库可以分开发布,在运行时查找并存入内存,但苹果只允许他自己用,到iOS8以后才开放给开发者。因此,我需要将Dynamic Framework更换为Static Library静态模式。设置路径为Build Settings->Linking->Mach-O Type->Static Library

6、这里要注意,在编译时,不要将图片文件放在工程里面,否则编译后framework中会出现大量的零散图片文件在里面。这时需要将图片等资源放在.bundle文件中。图片的打包在第二步介绍。

7、这样打包的framework依然有问题,如果你用了Category,别人在用你的framework时会发生崩溃。这时别人在引用时需要在工程中other linker flags中添加-objC如果依然有问题,再添加-all_load。

8、终于编译成功,但发现很多关于符号表的警告,这时需要将Generate Debug Symbols设置为NO即可关闭符号表警告。

9、但是我需要支持bitcode,以上设置后并不能使framework支持bitcode,因此还需要进行额外的设置一个命令让其支持bit code。在TAGETS的Build setting中搜索Other C Flags,添加命令“-fembed-bitcode”。同样的设置在PROJECT中。如果不进行以上操作。别人在集成你的framework时可以编译,亦可以真机测试。唯独在打包时会发出警告并打包失败。警告为framework不支持bitcode!

10、无论SDK还是Framework都需要暴露公共的头文件以供使用者读取和。在TARGETS->Build Phases->Headers里面,有三种类别。Public(公共的),这里存放供其他人查看的header。Private(私有的)这里存放私有的Header,以上两个Headers存放位置都会暴露出来,所有人可以查看。有些Header是不想给别人看到的。这种header放在第三个类Project中。

11、打包。Edit Scheme->Build Configuration->选为Release然后Run即可.

二、打包bundle文件

1、新建OS X->Framework & Library->Bundle新建

2、在Build Settings->(null)-Deployment->iOS Deployment Target->选择自己需要支持的最低系统。

3、build后会生成一个bundle包,但在包中的图片由以前的png格式全部变成tiff格式。为了防止这种格式转变。需要在Build Settings->Architectures->Base SDK->选择iOS的SDK要支持的版本。这时TARGETS中Build Setting->User-Defined中会出现一个新的Key:COMBINE_HIDPI_DEBUG_INFO,把它设置为NO。

4、这样创建的图片资源不能使用[UIImage imageNamed:@“png”]来获取了。需要使用路径方式来读取图片。

这里我使用了一个函数来获取路径。

NSString *getKaYiKaImageBundlePath(NSString *filename);

NSString *getKaYiKaImageBundlePath(NSString *filename) {

NSBundle *libBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"KaYiKa.bundle"]];

if (libBundle && filename) {

NSString *path = [[libBundle resourcePath] stringByAppendingPathComponent:filename];

path = [path stringByAppendingString:@".png"];

return path;

}

return nil;

}

使用时直接用

[UIImage imageWithContentsOfFile:getKaYiKaImageBundlePath(@"tool_return_day")]获取图片。

三、创建引用工程

创建引用工程时将framework和bundle同时导入。

剩下的使用与系统framework相同。

在学习过程中参考了资料:http://blog.lanvige.com/2015/01/04/library-vs-framework-in-ios/?utm_source=tuicool&utm_medium=referral

相关文章

网友评论

  • 不辣先生:楼主,你好,麻烦您解答一下,我在demo工程target-built phase中添加依赖会报错:image not found,请问这是什么原因?我把statu改成optionnal,就不报错了,但是framework里面的东西又调不起来了?
  • o0下一站生活0o:这个能上架吗?不是说framework不能上架
    不辣先生:我在demo工程target-built phase中添加依赖会报错:image not found,请问这是什么原因?我把statu改成optionnal,就不报错了,但是framework里面的东西又调不起来了?
    LayneWang:可以上架,我的已经上架很久了
  • 4e7b0213a613:你好,我想问一下,我的头文件从project移到public之后,在移回到project ,编译之后头文件还暴露在外边怎么回事
    ef60b7f382dc:@阳光下的自己 shift+command+k清理缓存,再编译。
  • 九天环佩:请问楼主,如果工程使用了cocoapods,再打包framework有什么要注意的么,已经卡住几天了,求教
    LayneWang:不影响
    九天环佩:@小菊花M 木有,还在爬楼
    3247aa73a36d:@九天环佩 我也很想知道啊,你找到方法没?
  • _健健:楼主请教个问题,这种方式打出的device版的framework是需要code sigining 的,有没有办法做到不需要code signing
    LayneWang:很久没用简书了,现在偶尔看了一下。我并没有遇到你说的这种情况。
    卓无尘:@_健健 有找到什么方法吗? 我看Facebook的sdk中就是无签名版的Framework。 前段时间看过通过使用.a来制作framework(以前的老方法,制作好后好像没有_CodeSignature文件夹)
  • 立志成为卓越逆向工程师的小仙女:我用这个方法创建引用framework时在 testframework.h 文件的 #endif 这儿报 #endif without #if 我将这句注释掉以后报 framework not found testframework 这个怎么解决啊,我在编译framework的时候第一次选的模拟器,编译后还是红的,选择设备编译一遍后才变黑
  • 二挠:有图 就更好了
  • 洁简:为何要改成静态模式,没看明白.
  • 0c918edbb54d:请问下,这个做出来的framework是不是只能在模拟器或者真机上用,怎么样才能两个都能用???
    LayneWang:@0c918edbb54d 你需要用这个方法生成两个framework,和SDK的原理一样。一个是真机使用的,一个是模拟器使用的。将这两个用命令lipo -create OSSDK.framework SimulatorSDK.framework -output newSDK.framework合并就可以了。
  • 19033596ac90:不明觉厉,棒呆
  • 馍角:我覺得棒棒的
  • Mr_Leung:好,太实用了

本文标题:Xcode7打包Framework

本文链接:https://www.haomeiwen.com/subject/yvsjhttx.html