一个iOS项目总结(一):网络接口的封装

本文作者分享了在开发iOS应用过程中,如何封装网络接口,特别是遇到的字符编码(gb2312)问题、XML解析的难点(包括控制字符、非法字符的处理)以及Cookie管理的解决方案。通过实例展示了如何处理网络数据,以确保正确通信和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:代培
地址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值