好久没有写博客了,这也算是我步入新工作后的第一篇技术博文吧。在进入新公司前,早就有了技术层进入下一个迭代的准备,但很多事情是意想不到的,就像我以C#程序员的身份面试入职的,而今却是一个全职的iOS开发。从C#到Objective-C的切换,还是有不少成本的,加上今年又推出了Swift,以后要学习的路是漫长的,其实,学习的路本身就是漫长的,不应该满足于一个阶段和特定领域。对我而言,语言的切换,已经太常见了,学习一门语言是很容易的事情,但,完全的掌握它,却不是易事,就像去摸清一个陌生人的脾气一样。有点扯远了,还是进入今天的正题吧!
pjsip,如果你不知道它是什么,那么说明你无需使用它,那也就没必要继续看我的这篇文章了。由于项目中需要使用到VOIP,而对比下来,使用SIP实现的代价是相对小的,在Android里,谷歌内置了对SIP的支持,IOS中就没这么好运了,于是乎找到了pjsip,这是一个纯C的库,实现的相当漂亮。在网络上找了很久,也没有找到适合我这种的入门级教程,在我的摸索和努力下,终于搞出点名堂来了。那么,恭喜你,你不用走我走过的弯路了。
下面正式开始,一步步来:
第一步:下载
首先,去官网下载源代码,这里推荐下载.tar.bz2的包,下载完成后,找到对应的目录,用tar
命令或者图形化操作来解压,这里我用命令行的方式来操作:
$ tar -jxvf pjproject-2.2.1.tar.bz2
第二步:编译
首先,要在pjlib/include/pj/目录下,建立一个config_site.h的文件,切换到该目录下,用vi
或者touch
一个文件:
$ cd pjlib/include/pj/
$ vi config_site.h
按照官方的说明文档,我们文件内容定义如下:
#define PJ_CONFIG_IPHONE 1
#include <pj/config_site_sample.h>
OK,保存,切换回主目录下(也就是有pjlib、pjmedia、pjnath等目录的文件夹),这时候我们就可以编译了,还有个前提,你必须安装了XCode的Command Line Tools(XCode –> Preferences –>Downloads)。
i386
首先编译模拟器平台的静态库,依次执行下面这三句:
$ export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
$ ARCH="-arch i386" CFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" LDFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" ./configure-iphone
$ make dep && make clean && make
OK,没有什么问题的话,你模拟器版本的静态库就编译完成了,它们存在于:
- pjlib/lib
- pjlib-util/lib
- pjmedia/lib
- pjnath/lib
- pjsip/lib
- third_party/lib
这些,是在以后的SIP开发中,必须要使用到的静态库,目前该库只支持模拟器(可使用lipo -info
命令来查看,只支持i386),所以,我们将其拷贝出来,当然,我已经为你写好拷贝的脚本了:
1 |
|
将该脚本保存为copylibs.sh存放到主目录下(你应该知道主目录在哪吧!),然后执行:
$ ./copylibs.sh i386
如果提示权限不够,那么使用chmod 777 copylibs.sh
来赋予该文件最大的访问权限,执行完后,所有生成的静态库,都被拷贝到主目录下lib目录中的对应位置。
armv7
下面继续编译armv7版的库,关闭刚刚的那个控制台,注意,是全部关闭后再进入,然后到主目录依次执行下面的命令:
$ ARCH='-arch armv7' ./configure-iphone
$ make dep && make clean && make
$ ./copylibs.sh armv7
armv7s
现在编译armv7s版本的库,这次不用关闭控制台了,直接依次执行下面的命令(有报错误,但都是示例项目编译出错,和静态链接库文件没关系):
$ ARCH='-arch armv7s' ./configure-iphone
$ make dep && make clean && make
$ ./copylibs.sh armv7s
arm64
最后,我们完成arm64版本库的编译:
$ ARCH='-arch arm64' ./configure-iphone
$ make dep && make clean && make
$ ./copylibs.sh arm64
第三步:合并静态链接库
好了,现在我们需要的库都已经被拷贝到lib目录下了,它目前应该是这样的:
对的,这底下有一个mix.sh,当然,这也是我为你写好的脚本:
1 |
|
将上面的脚本,保存到lib目录下mix.sh中,控制台中,cd
切换到lib目录下,然后执行:
./mix.sh
OK,现在一切都完成了,在lib目录下会多出个mixed目录,该目录底下的所有库,都是包含了上诉各种架构版本信息的,可以使用lipo
来验证下:
注意,无论是合并还是查看,都要使用Xcode下的lipo,mac自带的那个lipo可能版本很低。
如果你觉得,亲自动手太麻烦的话,那么这里有一个已经帮你编译好的版本,直接下载使用即可:
https://github.com/chebur/pjsip
不过,我还是推荐你自己动手来一遍,自己弄出来的,使用起来才更有意思嘛,呵呵~