作者:代培
地址:http://blog.youkuaiyun.com/dp948080952/article/details/52650092
转载请注明出处
写在前面
今年暑假,自己独立完成了一个简单的iOS的APP,是一个bbs的客户端,叫做喻信星空。现在正在测试,准备将其上架app store。但是光做项目不做总结肯定不行,所以这里写篇博客,把项目里遇到的坑都记录下来,不过这篇博客里肯定是有干货的,所以如果你看到了这里,希望你能把它看完,并顶我一下(^-^)
这是一系列博客,此系列共四篇文章,此篇博客是该系列博客的第一篇:网络接口的封装。
正文
从抓包开始
这个bbs已经有了安卓版的客户端,所以我就直接用安卓应用来抓包,不得不说用Charles真的是抓包的神器,抓包的具体细节这里就不详细说了。
概述
在动手写UI层的东西之前,我首先想到的是将网络请求封装起来,在这里我很不要脸的用SDK进行命名,想想自己能写SDK也是很不错啊。
那么现在的问题是这个SDK该如何组织呢?具体来说有哪些类,分别负责什么呢。对于像我这样接触编程不久的人来说在架构上的体会是很少的,虽然自己的目标一直是成为一名架构师,但是这是需要一个很长时间的积累才能再回头看书进行总结,才能有所小成。所以我这里几乎没有什么设计,就是从实用的角度弄出了一个可以正常使用的东西,大家如果有更好的设计,欢迎在下面留言讨论。
我的SDK分为3个部分:YuXinSDK,YuXinModel,YuXinXmlParser,其中YuXinSDK作为一个主要的部分,网络请求都封装在这个类中,使用这个SDK时也只要导入这个类的头文件就可以了。YuXinModel从名字就能看出来是做什么的,是数据模型。最后YuXinXmlParser是一个Xml的解析器,对从网络返回的Xml数据进行解析生成YuXinModel,这个Model是一个基类,有很多继承这个类不同的Model,当然这些Model不仅仅就是一个数据的承载器,在其内部也进行了数据的进一步加工(至于具体的加工什么,后面会具体讨论)。
字符编码问题
由于这个bbs的服务器是一个非常老的服务器,它的编码方式是gb2312,这里也有一个小小的坑,在苹果封装的NSStringEncoding里没有gb2312的编码方式
NSASCIIStringEncoding = 1,
NSNEXTSTEPStringEncoding = 2,
NSJapaneseEUCStringEncoding = 3,
NSUTF8StringEncoding = 4,
NSISOLatin1StringEncoding = 5,
NSSymbolStringEncoding = 6,
NSNonLossyASCIIStringEncoding = 7,
NSShiftJISStringEncoding = 8,
NSISOLatin2StringEncoding = 9,
NSUnicodeStringEncoding = 10,
NSWindowsCP1251StringEncoding = 11,
NSWindowsCP1252StringEncoding = 12,
NSWindowsCP1253StringEncoding = 13, /* Greek */
NSWindowsCP1254StringEncoding = 14, /* Turkish */
NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */
NSISO2022JPStringEncoding = 21,
NSMacOSRomanStringEncoding = 30,
NSUTF16StringEncoding = NSUnicodeStringEncoding,
NSUTF16BigEndianStringEncoding = 0x90000100,
NSUTF16LittleEndianStringEncoding = 0x94000100,
NSUTF32StringEncoding = 0x8c000100,
NSUTF32BigEndianStringEncoding = 0x98000100,
NSUTF32LittleEndianStringEncoding = 0x9c000100
我试了上面大部分的编码方式,很多都是英文没有问题,但是中文在服务器那边都会变成乱码
后来在网上看到有人说gb2312的编码方式在更底层的CFStringEncodings中才有,使用时要将CFStringEncodings转换为NSStringEncoding。然后在CFStringEnodings的枚举里看到了kCFStringEncodingGB_2312_80 = 0x0630
,当时欣喜若狂,觉得马上就要成功了,但现实是残酷的,中文字符还是会出问题,最后终于在网上发现了有人说实际上gb2312是kCFStringE