作者最近的公司项目要做实现rar解压的功能,在网上找了很久貌似关于rar解压的资料很少,不过有很多人推荐一个名叫“Unrar4iOS”的第三方开源框架,于是下载并尝试使用发现该开源框架并在使用过程中发现了一些存在的问题,特在此做下总结让后来人少走些弯路。
1.不支持armv7s;
2.编译好的framework中将Unrar4iOS.h和Unrar4iOS.mm编译在内有些方法并未实现,比如-(BOOL) unrarFileTo:(NSString*) path overWrite:(BOOL) overwrite;该方法的实现居然是空的也就是什么都没做(原作者最终虽然更新了两个文件但是并未重新编译framework);
3.对于第二个问题可能有人会说把Unrar4iOS.h和Unrar4iOS.mm这两个文件重新拉近项目中不就可以了吗?答案是“如果你的项目中other link flags没有设置为-ObjC是可以这么做的,否则的话会报一些标识符重复的错误”。
针对以上各种问题我本来想用最新源码重新编译一个framework以支持armv7s,但是把源码拖进其它工程报出各种编译错误,由于时间问题最终还是放弃了,如果有哪位好心人将最新的远吗编译成功了一个framework的话欢迎给我留言或者直接拿出来开源(广大码农将不胜感激)。
那么现在就来说说我是如何做的吧
其实我也是采用了上面说的第三个问题中提到的方法,我们的主工程other link flags设置了-ObjC这是一个摆在眼前的事实,我不能为了集成这一个framework而去修改主工程的配置(修改的话涉及面太多),那么只能从重复标示符下手了,既然重复了我把你修改掉不就行了嘛(退一步海阔天空),不过像我这么做的话第一个问题是不能解决了只能忍痛舍弃armv7s,语言再多总是显得太苍白,下面我会教大家一步一步的将该framework集成进你的工程确保不报错。
第一步:下载源码。链接:https://github.com/ararog/Unrar4iOS
第二步:将解压后的Unrar4iOS目录下的RARExtractException和Unrar4iOS的.h.m文件、Unrar4iOSExample->Frameworks->Unrar4iOS.framework分别拖进你的工程并勾选copy,如下图所示:
这时如果你的工程开启了ARC的话可能会报一下错误,将autorelease删除掉即可。
再次运行还是会报错
因为raros.hpp和dll.hpp的头文件被包含在framework内,所以我们要采用尖括号“<>”的方式引入这两个头文件,修改后如下:
再次运行,又会发现一些ARC的问题,将release等删掉即可
至此你的工程应该能在模拟器上编译成功了,换下真机编译试试,是的会报之前说的那个armv7s的错误
修改方法:将第一个红框内的YES改为NO,删除第二个红框内的arm64和armv7s,只保留armv7.
还有一件事别忘了添加libz.dylib
现在你可以查看一下你的工程配置,如果下图所示的other link flags没有设置-ObjC标记,那么到现在你已经可以成功的在模拟器和真机上使用Unrar4iOS.framework了,如果你和我一样设置了-ObjC标记的话请继续往下看
如果设置了-ObjC的话你应该会看到以下错误提示标识符重复,原因是我们拖进来的Unrar4iOS.mm的实现文件和framework中的文件重复了
具体解决办法是先将Unrar4iOS和Unrar4iOS.mm这两个文件从工程中删除掉,待修改完成后再重新添加进来,我的做法是将这两个文件重新命名为“KWUnrar4iOS.h和KWUnrar4iOS.mm”并将KWUnrar4iOS.mm中两个“CallbackProc”修改为“CallbackProcc”,完成这一步后就可以把这两个文件重新添加进工程,最后修改后的工程结构如下:
真机编译ok,到此终于完成了所有的步骤,下面放出我自己的demo链接
https://github.com/zzltjnh/Unrar4iOSDemo