Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

http://www.cocoachina.com/bbs/read.php?tid-282490.html

Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

在cocoachina呆挺长时间了。没什么大贡献。就整理了这个,希望对大家有帮助。绝对原创。呵呵。

1、创建一个工程,或者在原有的工程上进行。不在列举。
2、在原有工程上添加一个静态库

2.1、选择OS X 的Bundle。因为Xcode6.1中iOS里没有Bundle。

2.2、修改Bundle的属性,一是让他能用在iOS上。二是改变Bundle成为Framework
选中要修改的Bundle

2.3、Target:并选择 Build Settings ->  Architectures -> Base SDK  改为Latest iOS(ios 8.1)

2.4、Target:在 Deployment 下,
将 “Mac OS X Deployment Target”改成”Compiler Default”,
将 “Targeted Device Family”改成”iPhone/iPad”,根据自己的需要改。如果你只想在iPhone上用,那选iPhone就行
将  “iOS Deployment Target”,改成 “iOS 7.0”:也就是说这个静态库支持7.0以上版本。

2.5、Target:在 Linking 下,
将 “Dead Code Stripping” 改为 “NO”,
将 “Link with Standard Libraries” 改为 “NO”,
将 “Mac-O Type” 改为 “Relocatable Object File”:

2.6、Target:Packaging 中,
将 “Wrapper Extention” 改为“framework”:

2.6、Target:返回Info 标签。
将 “Bundle OS Type Code” 改为 “FMWK”(Framework )

2.7、Target:返回Build Phases 标签。加入Copy Headers,后边会用到。

  

3、返回目录,可以看到设置好的 Framewor文件。红色代表还没有这个静态库,需要你生成一下。后边会讲到。

3.1、如何管理静态库:

点开菜单,可以看到所有可管理的工程、静态库。
3.2:LineChart(App图标样式)是App 工程文件,选中这个运行(command+R 或command+B)意思是让工程导出或者测试运行可发布的应用程序(就是上线文件)。对应功能就不一一介绍了。
3.3:PZGLineChart(Bundle图标样式)是静态库。选中这个运行(只能运行command+B,不能运行command+R)意思是导出静态库,也就是自己的封装代码,用于共享给其他人。如果选中iOS Device运行(command+R),将会导出真机版本的静态库,如果选中iOS Simulator以下其他任何版本运行(command+R),将会导出模拟器的静态库版本。至于为什么这样,是因为真机的iOS和Mac系统中的虚拟iOS目录结构是不一样的,如果导错了,编译器会报错,“找不到指定文件。”

3.4:选中:Edit Scheme…:在这里管理所有工程文件、静态库、测试、发布等等的程序关系。
在这里,我们把刚才加入Framewor的导入,以便程序直接建立关系。

 
成为这样:

3.5:选中:Manage Scheme…:、这里的添加删除、会改变 
 。主要是方便开发者测试使用。
如果希望测试菜单中测试其他工程、静态库等等东西,在这里添加就行,比如下边的这个。Show对勾都勾选上后,菜单就会出来这两个选项。去掉对勾会隐藏。

4、给静态库添加文件、xib、image....
直接介绍其属性:
1:不知道。没用过。等高手补充
2:程序文件放的地方:(*.m 、*.mm等),需要压缩保护的代码,只要放在这里的文件,都将被静态库压缩。使用静态库的一方是无法看到源代码的。
3:库文件放的地方,比如把其他的静态库、动态库压缩到这里。
4:资源文件放的地方,图片、音视频、xib、Images.xcassets、甚至是Main.storyboard(故事板);只要放到这里,都将被压缩,使用方是无法编译或者看到源代的。
5:对外接口。主要就是这里,展开后,会看到第一行(Public),不用介绍了吧,看英文应该就能猜到,何况这个单词是程序中常用的单词,公用吗!,只要是放到这里的文件,都将会暴露给使用方,建议把所有的*.h文件放到这里。

现在就把你想要管理的文件一个一个往里拖拽吧。就不在一个一个介绍。

6、首先测试,程序部分是否运行正常。我新增加了一个MyViewController(带.xib),在MyViewController.m里简单写了个打印。

  

还有我拖拽完就是这个样子:

7:生成静态库:大家看到了,都是红色,意思是Xcode找不到文件,别慌,我们都给他跑一边。

 
7.1、选中以下,分别command+B。

  

黑了吧, 

选中PZGLineChart.framewor文件,鼠标右键,Show in Finder。
看到了吧,成功了,就这么简单。现在生成的是真机版本,如果需要模拟机使用的静态库,选中模拟后,再分别command+B一下。

模拟机版本:
模拟机版本的就选择:Debug-iphonesimuator文件夹下。如果没有Debug-iphonesimuator文件夹,那你选择 
 后再command+B。

8、关于静态库引用文件
如果希望你的工程能在未来能导出成静态库,那么在你编写的时候要遵循静态库引用原则,使用这种方式。
注意:这种引用方式必须在你的Products下静态库成黑色时候,才能编译通过。

9、新建一个工程,把你做的静态库Add进来。对接好,然后直接Command+R。是不是成功了。其实就这么简单。
关于找不到文件的报错:直接看下边。我有介绍,

跑成功的工程,一切正常。

10、关于第三方库找不到文件的提示错误。简单补充下吧,别走弯路。
首先你要确定这个错误产生的原因:大致分两种,
一:你做的项目缺失文件,百度下,加入就解决了;
二:你引入的第三方框架发生找不到文件错误:这样的结果分两种:
二、一:开发第三方框架的程序人员没有做好自己的框架。尤其是在生成框架的时候,没有设置好自身属性。导致使用者用的时候出现找不到文件错误,最后迫使使用者不得不去改自己的工程配置。
二、二:你在引入第三方框架的时候,少引用了文件。

好了,你分析完后就好办了,我们做的这个静态库没有设置自己的兼容属性,所以就照成了这种错误。在iPad Retina的模拟器上跑就正常,换成其他的模拟设备就报错。所以改下其属性就能解决。
Target: -> Build Settings ->  Architectures -> Build Active Architecture Only 全改成NO;
《插不了图片了。楼下8楼找吧》

分析原因:

  
 
在我们生成静态库的时候,我们选择的是iPad Retina。也就是说这个静态库在引用的时候,必须也是iPad Retina。否则Xcode编译器会找不到文件所在。
大家可以实验下,在iPad Retina下导出静态库,在其他工程使用的时候,如果用iPad Retina跑就没有错误。如果选择其他设备就会提示找不到文件。

兼容全部设备解决方法:改下静态库的兼容属性。Target: -> Build Settings ->  Architectures -> Build Active Architecture Only 全改成NO;
Build Active Architecture Only
这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,所以会报错编译不到文件,出错("_OBJC_CLASS_$_xxxxxx", referenced from:)       
而设置为no时,会编译所有的版本,这样就解决编译出错的问题了。      
这个是设备对应的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s
编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。

真机版和模拟器版的库合并解决方法:在framework文件夹下,你会看到一个白板文件,这个文件名和的的framework静态库名相同,只是没有后缀名。 这个文件在被引入到其他工程时候是看不见的。只有在Show In Finder下能看到。
打开终端,输入命令:中文换成你的真实目录。

lipo -create “……真机/目录/那个白板文件“ "……/模拟器/目录/那个白板文件" -output “…..另保存的/目录/文件”

合并好的新文件,覆盖掉原来的framework中的文件即可。这个framework就会支持所有设备和真机、模拟器全部版本。
其实这个方法就是用*.a文件的合并方法。在framework一样有效。framework中的白板文件就好像*.a文件一样。

9、关于xib的引用。同样根上边创建framework的方法一样,只是设置不同。我加了一个名字为:Resource.bundle静态资源文件。
这个样子:

Target:并选择 Build Settings ->  Architectures -> Base SDK  改为Latest iOS(ios 8.1)
Target:在 Deployment 下,
Target:将 “Mac OS X Deployment Target”改为”Compiler Default”,
Target:将 “Targeted Device Family”改”iPhone/iPad”,
Target:将 “iOS Deployment Target”,改为 “iOS 7.0”:

9.1、在MyViewController.m文件中编写下。别忘了在*.h里写上接口。

9.2、然后就是给新加的资源文件拖拽下。

再选中工程文件,拖拽后的样子(就是转静态库的工程)。
为了方便查看,我把MyViewController.xib背景涂成了蓝色,加了个红按钮。直接:command+R。一切运行正常。

9.3、然后把这两个文件都复制出来。 

放到其他工程里,运行。是不是很简单。

10、加个图片。怎么加不解释来。先加一个不用管理器管理的图片。
工程command+R。。一切正常。

10.1、其他工程引用静态库,再跑。正常。嘿嘿,是不是多了个图片文件。

10.2、提高难度,我们在Images.xcassets图片管理器里加图片。我加了个矩阵图片,并设置了矩阵属性。

在xib里加个按钮。全设备匹配按钮。我没有写一行代码,只是在xib里拉个按钮。然后设置了下背景。系统自动识别图片。关于这个大家可以度娘下。

不管三七二十一,直接把Images.xcassets拉到资源库。

工程跑,OK。没问题。

引入静态库。OK。没问题。有没有发现。多了一个不明的文件:Assets.car。这个就是Images.xcassets管理,里边所有的图片都被封装了,也就是说被Images.xcassets管理的图片竟然也被加密保护了起来。疯狂吧。狂叫吧。呵呵,“码农”一族们。快转变思维吧,不然很快被Apple淘汰了。

时间: 2024-10-19 00:18:40

Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。的相关文章

vc6.0里使用lib(静态库)的方法

vc6.0 中使用lib文件 使用库的方法如下: 1. 包含库的头文件(把库的头文件包含到项目中) 在应用程序工程中使用 #include "file path" file path可以为绝对路径,也可以为相对于工程所在目录的相对路径 如果头文件比较多,可以在project>settings>c/c++>preprocessor的Additional include directories中填入你的头文件所在目录 2. 导入lib库.导入的方法很多 方法1) 直接用p

Entity Framework优缺点及使用方法总结

Entity Framework优缺点及使用方法总结 Entity Framework是微软提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利. nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的.但是EF在提供了便利性的同时也有许多缺点,以下就是我认为不应该应用EF的场景: 非SQL Server数据库且无该数据库的DataProvider 高性能要求.在进行一些复杂查询的情况下,EF的性能表现不太好,而开发人员又无法控制SQL语句的生成 高安全性要求.

ArcGIS教程:ArcGIS符号库制作

1. 需要的软件环境 1)ArcMap 9.X 2)Font Creator 5.X 2. 二维符号库制作方法 ArcGIS中制作二维符号库的方法可归结为以下四种: 1)基于ArcMap中已有符号制作符号库 2)基于图片制作符号库 3)基于TrueType字体制作符号库 4)多种方式组合制作符号 不论采用上述何种方法进行符号制作准备,最终都需要在ArcMap中Style. Manager进行符号制作.您可以打开ArcMap,从菜单Tools-〉Style. Manager 进入,如下图所示. 2

EPLAN部件库共享方法

EPLAN部件库共享方法 关键词: EPLAN部件库共享 EPLAN 摘要:在使用EPLAN时经常会碰到自己电脑里的部件库和公司里其他同事的部件库存在差异,如果不是很平凡的同步所有使用的部件库,这种现象是不可避免的.这种情况对于一个团队用户来说是很麻烦的已经事,给维护部件库也带来不便.不知EPLAN本身有没有这个功能,不会EPLAN只有网络版才能共享部件库吧? 在使用EPLAN时经常会碰到自己电脑里的部件库和公司里其他同事的部件库存在差异,如果不是很平凡的同步所有使用的部件库,这种现象是不可避免

iOS 最新framework和.a静态库制作及使用全解

最近想把自己的一些实用工具类搞成一个静态库,网上搜了下关于framework和.a的一些相关资料,然而写的或不全面,或不详细,我归纳总结及亲自实践写下这篇文章. 一.framework和.a两种静态库的介绍及区别 .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件. .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用. .a + .h + sourceFile = .framework. .a只是静态库.framework既可以是静态库也

静态库制作.a .framework

一.静态库 .a 制作 1.新建一个Cocoa Touch Static Library 2.往里面添加文件,或者自己新建 3.添加一个Headers Phase 4.将 .h 暴露出来,并移到public 5.选择真机和模拟器各 Command+B 一下,show in finder,有两个.a  一个是模拟器用的 ,一个是真机用的 ,可以合并,使用下面命令 lipo -create Debug-iphoneos/xxx.a Debug-iphonesimulator/xxx.a -outpu

技巧:Linux 动态库与静态库制作及使用详解

技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法:3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题.本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介

iOS 工程套子工程,主工程和framework工程或.a静态库工程联调

一.主工程套Library(即.a)工程联调 1.新建一个主工程和一个Library工程,如何创建Library工程参照我另外一篇博客iOS 最新framework和.a静态库制作及使用全解但这个Library工程不需要编译成静态库 2.将静态库工程拖到主工程,我这里拖到下图箭头所指的UseA文件夹下(如果你要拖到其他目录,就要改Library Search Paths,下面我会介绍Search Paths路径相关知识) 3.将Library工程下Products目录下的.a文件拖入主工程的Li

静态库制作-混编(工程是oc为基础)

最近工作需要,需要制作一些静态库.由于缺乏经验,特意找了一些资料,加上自己的测试.特意在此记录一些心得和踩过的坑.所谓“好记性不如烂笔头”,希望自己以后忘记的时候能回头来看看,同时也希望对后来者能提供一定的帮助. 这里,我只写对我来说是难点的地方. 首先,framework是静态库.是用oc编写的.如果静态库制作好了,没问题的话,无论是放到oc项目还是swift项目,都不应该有问题.其中,swift与oc互调也不会有问题.难点在于,在编写framework的时候,如果framework本身是混编