给app快速集成IM功能的大体实现有两种方式:
搭建自己的通信服务器(比如搭建基于XMPP的Openfire)
使用第三方提供的服务器(比如融云,环信以及本文的LeanCloud)
每种方式都各有利弊,主要看公司的情况而定,大公司一般都采用自己的通信服务器,采用第三方服务器的方式比较适合初创型互联网公司
本文初步小结在开发中使用LeanCloud中的一些坑.
从集成LeanCloud的Framework开始
关于LeanCloud的文档和技术支持这里就不吐槽了.直接爆自己遇到的一些坑.
小坑1
按照官方的说明文档集成框架之后,第一次运行,会报下面的一个错误,这个一看就比较容易解决.但官方文档竟然漏掉了sqlite这个库(也可能是我粗心,未在官方说明中找到相关信息)
symbols for architecture i386:
"_sqlite3_bind_blob", referenced from:
1 | -[LCDatabase bindObject:toColumn:inStatement:] in AVOSCloud(LCDatabase.o) |
解决办法
- 选择工程—选择Target— 选择Build Phases — 选择Link Binary With Libraries— 点击+号
- 添加libsqlite3.dylib即可
小坑2
先看错误提示:
-[LCDatabase userVersion]: unrecognized selector sent to instance 0x7a4ed7f0
这个坑算是比较隐蔽的,当时遇到的时候,google了世界也没有具体的针对性的说明,而且官方的技术工单是需要付费的(#_#).只好自己动手了.
辛辛苦苦搭建好界面,写好初始化代码之后,编译运行,UI正常,但是发送message的时候,直接崩溃!
起初,看错误,是经典信息啊,容易看出是数据库调用了一个没有定义的方法,使用断点查看栈信息后,可以找到如下:
Queue:fmdb <LCDatebaseQueue:....>
- 猜想1:当时以为是LeanCloud在内部使用第三方数据库框架FMDB而未引用其头文件,于是自己动手直接再项目中添加FMDB,结果无效,问题依旧.
- 猜想2:可能是LeanCloud框架中使用Category,于是在
Other Linker Flags
中添加-Objc.结果问题依旧.
- 在猜想2失败后,纠结了好一阵,后来无意在官网上查到-all_load这个参数.于是乎有了下面的解决办法
解决办法
将猜想2中的-Objc换为-all_load,问题解决.
姿势补充:
-Objc:的作用是将静态库中
所有
的和对象相关的文件
都加载进来.-all_load:加载静态库中
所有文件
,包括没有objc的代码文件.
后续
后续还要做一个与web端通信的研究,待续中….