Allen Woody

如果你像程序员一样工作,你就是程序员。如果你像架构师一样工作,你就是架构师。

嗨,我是朱洪伍 (@hnxyzhw),一名 iOS 开发者。现居北京,就职于中化能源科技有限公司。正在get新技能,探求创意之源。


我在简书上创建的有关于iOS开发的技术专辑,欢迎各位前来了解!

#文章内容

iOS静态库文件(framework和a)合并兼容真机以及模拟器

       开发过程中有时候需要讲一些功能代码封装到静态库文件中,以确保代码的安全性。 主要分为:静态库、动态库两种

       静态库和动态库的存在形式:

       静态库: .a 和 .framework
       动态库: .dylib 和 .framework

       静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

       需要注意的是:项目中如果使用了自制的动态库,不能被上传到 AppStore 所以基本上就用不到制作动态库文件了,下面来说一说静态库文件,下面以本地framework为例。

       静态库文件在编译时,你选择不同的设备时编译出来的framework所支持的环境也会不同,也就是你在制作完framework后,选择的是在模拟器下编译的话,那么你引入到其他工程中,就只能在模拟器下调用执行。如果你选择的是在真机环境下编译的话,那么你引入到其他工程中,只能在真机上调试运行。

       选择不同的编译环境,你编译出的framework所支持的环境也不一样,每次在不同的环境下编译后,你可以选中你的framework(注意编译command+B通过后,相应的framework的名字颜色会又红色变为黑色),鼠标右键,Show in Finder,可以对比一下,你会发现在模拟机版本编译后的文件路径在:Debug-iphonesimuator文件夹下。而选择真机版本编译后的文件路径在:Debug-iphonesimuator文件夹下。

       so,问题来了,如果想要在真机跟模拟器下都能使用我们自己制作的framework的,要怎么解决这个问题呢?总不能没次更换不同环境下的framework吧(其实不怕麻烦的程序员可以这么整,但作为一个资深强迫症患者程序员来说,太痛苦了,宝宝做不到啊)。

       解决上面这个问题的话,就需要我们手动合并我们framework里面的一些文件。

举例:

       比如我编译的framework为:ZHWActivity.framework。选择不同环境下的framework,并Show in Finder,会发现在两个ZHWActivity.framework文件夹下面都有一个名为ZHWActivity(你编译的framework的名字)的文件,这个文件在Mac下显示的是一个白板文件。

       下面我们就需要将这个两个文件合并成一个ZHWActivity文件:

       在桌面新建一个文件夹merge,在merge文件夹下在新建两个文件夹merge1,merge2

       将不同环境下的framework中的ZHWActivity(就是那个白板文件),分别放到这个两个文件夹里。

       然后打开终端,cd到merge目录下,执行一下命令:

lipo -create merge1/ZHWActivity merge2/ZHWActivity -output ZHWActivity

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

       在终端执行完后,会发现在merge目录下,多出来一个ZHWActivity文件(也是一个白板文件),这个就是已经合并后的文件。

       将合并后的文件拷贝一份,然后在你导入ZHWActivity.framework工程里,Show in Finder一下。讲工程里原来的ZHWActivity(旧的白板文件),替换成我们合并后的ZHWActivity(新的白板文件,可以看一文件的大小已经是之前旧文件的两倍)。在重新编译一下,你会神奇的发现,在真机跟模拟器下无缝切换,再也不会报错了有木有。

       tip1:同理在制作.a静态库文件时,也是区分真机跟模拟器的。也是可以按照上面的方法来合并**.a文件,方便我们开发过程中使用。

       tip2:如果我们的制作的静态库文件中有包含的有.mm文件(c++跟oc混编的代码文件),那么我么在其他地方导入时,就需要讲相应的.m文件也改为.mm文件才能正常使用。(如在ViewController.m中引入头文件那么就需要改成ViewController.mm)。

关于静态库文件的制作可以参考下面这篇文章:

xocde7标准Framework静态库制作方法,工程转Framework

iOS开发之静态库.a的制作教程

简书地址

上一篇文章

iOS-中JS与OC(UIWebView)的交互

项目开发中,会推一些活动供用户参加,活动页面一般都是用h5或者web页面,这活动页面有时候需要跟移动端有交互操作,比如点了一个链接或者button,跳转到app内的某个页面。那么这个时候就需要移动端交互来完成了。UIWebView是可以捕获当前页面要去加载的url地址,比如当你点击了页面的一个超链接,或者一个图片类型的标签连接,又或者是点击页面的中的button(在点击方法里去加载指定的url)。那么当前的UIWebView就会去加载这个url地址,此时我们可以通过UIWebView的代理...…

继续阅读
下一篇文章

Xcode开发使用小技巧

1.快速打开快速打开(Open Quickly)命令在Xcode的File菜单中,当然,用快捷键Command+Shift+O会更方便一些。这个命令可以开启一个小窗格用来快速搜索浏览文件、类、算法以及函数等。2.显示项目导航器在一个有很多文件和文件夹的大型项目中, 显示项目导航命令(Reveal in Project Navigator) 可以为你节省很多时间,这个命令可以在界面左侧的项目导航栏中显示当前文件,默认快捷是Command + Shift + J.3.辅助编辑器你可能对辅助编辑...…

继续阅读