iOS网络高级编程(1-5)

第一章

运行循环

运行循环是由类 NSRunLoop 表示的,有些线程可以让操作系统唤醒睡眠的线程以管理到来的事件,而运行循环则是这些线程的基础组件。运行循环是可以在一个周期内调度任务并处理到来的事件。

辅助线程必须显示运行自己的运行循环。在辅助线程中开始运行循环之前,你至少要添加一个输入源或定时器;否则,运行循环就会立刻退出。

辅助线程与网络交互,就需要开始运行循环。

运行循环会从两类源中接收事件:输入源与定时器。

定时器会生成基于时间的通知,它为应用(特别是线程)提供了一种机制以在未来的某个时间执行某个具体任务。定时器事件是同步发出的,并且与特定的模式有关,

在iOS中有两个预定义的运行循环模式。NSDefaultRunLoopMode是系统默认的,在开始运行循环及配置输入源时通常会使用它。NSRunLoopCommonModes是个可配置的模式集合。

运行循环也可以有观察者,它们不会被监控,这为对象提供了一种方式,使之可以在运行循环执行过程中的某个活动发生时收到回调。

第二章

设计服务架构

1.实现远程门面

定义一个不变的服务契约,应用可以通过该契约在外部创建、读取、更新、或删除数据。


远程门面

2.使用服务版本化支持老版本应用

服务版本化是更新与客户端的API契约,同时依然保留之前的版本以供现有的应用版本使用。

关闭现有服务器而不影响旧版本的用户几乎是不可能的。

3.使用服务器定位器探测端点

服务定位器是一个帮助应用动态探测远程源API端点的工具,它可以解决应用硬编码的无效或不再存在的端点问题。

实现了服务定位器模式的任何客户端的第一个动作通常都是加载并解析文件。由于所有的网络调用都需要端点,而端点只位于该文件中,因此在任何其他的网络动作发生之前必须先解析该文件。

第三章

构建请求

1.HTTP

HTML定义了向文本添加样式的一种的方式、HTTP定义了在服务器端和客户端之间传输数据的一种方式、URL定义了在网络机器中定位唯一资源的一种方式。

HTTP与HTTPS之间的最重要差别在于会话的连接建立阶段。在TCP连接建立好、HTTP请求发送前,客户端与服务器之间必须建立SSL会话。SSL会话建立包含多个阶段:客户端与服务器协商使用何种密码、交换公钥、验证协商以及验证身份(可选)。当SSL会话建立完毕后,在TCP连接之上传输的所有数据都将是加密的。

2.URL结构

URL为Internet上的任何资源与内容提供了全局唯一的位置名。单个资源可以通过多个URL定位,但单个URL不能引用不同的资源。在iOS的URL加载系统中,NSURL对象用于管理URL对象。通常情况下,URL由5部分构成,如图:


URL构成

协议:协议部分指定了使用哪个应用层协议与服务器通信。

认证:某些HTTP服务器支持在URL中传输用户认证以实现BASIC认证。认证部分包含了认证用户的用户名和密码。这种认证方式的安全性有些低。

主机名: URL的主机名部分指定了包含请求资源的主机TCP主机名或IP地址。如果URL协议是FILE,那么这部分与端口部分必须省略掉。

端口:URL的端口部分指定了客户端连接的TCP端口。如果省略,那么客户端使用特定协议的默认端口:HTTP是80,HTTPS是443

绝对路径:绝对路径部分指定了网络资源的路径。

查询字符串:URL的最后一部分是查询字符串。

3.请求/响应内容

HTTP请求包含3部分:请求行、请求头、与请求体。请求行与请求头是文本行。

响应内容:状态行,后面是头,然后是响应体。

状态行(HTTP/1.1 200 OK)包含3个域,域之间通过空格分隔。第一个域是响应的HTPP版本。接下来两个域是请求结果的状态值,和说明短语

4.iOS应用与HTTP服务器进行HTTP通信有3个主要的方法

同步:启动线程的代码会阻塞,直到整个响应加载完毕并返回调用方法为止。容易实现,不过局限性也最大

队列式异步:创建请求,放到一个队列中在后台线程中执行。

异步:起始代码开启一个请求,该请求运行在起始线程中,不过在请求处理时会调用委托方法。实现最为复杂,却提供了最大的灵活性。

所有请求类型共用的对象:NSURL NSURLRequest NSURLConnection 与 NSURLResponse对象。

5.操作Cookie

Cookie时HTTP协议加入的一个重要组件。它向服务器提供了追踪会话状态的能力。同时又无须维持客户端与服务器之间的连续。Cookie值是由服务器通过请求提供的,然后被放到随后的请求中。非常小,基本几十到几百个字节。

从服务器发送的Cookie有几个属性用于确定Cookie值、何时返回到服务器以及客户端应该保留Cookie的时间。这些属性有:

name:Cookie的名字,从同一DNS域返回的所有Cookie名都是唯一的。只有name和value这两个属性才会在后续的请求中发送给服务器。

value:由服务器发送的下一请求返回的值。

domain:后续请求在Cookie中包含的DNS域。

path:path限制发送给请求的Cookie都是针对指定的URL路径。

......

URL加载系统提供了两个重要的对象以管理Cookie:NSHTTPCookie与NSHTTPCookieStorage。

6.头信息操作进阶

当代码需要修改请求头时,需要创建NSMutableURLRequest对象,

1.setAllHTTPHeaderFields:方法提供了一种方式以通过一次调用替换所有的请求头。

删除请求冲标准头的方式就是使用空值覆写默认值

第四章

生成与解析负载

1. Web Service协议与风格

简单对象访问协议(Simple Object Access Protocol, SOAP)是个轻量级协议,用于通过可扩展标记语言(Extensible Markup Language, XML)实现系统间的结构化数据交换。

可以服务于防火墙内外的客户端,SOAP消息中包含信封,信封中包含头和体。

根据动作或服务来实现

表述性状态转移(Representational State Transfer, REST)是一种架构设计风格,不仅仅限于HTTP这一种应用层协议。

REST的一项中心议题就是资源的概念,资源具有全局标识符。统一资源标识符(Uniform Resource Identifier, URI)这一概念将REST与其他架构风格区分开来。

1.XML 是一种标记语言,用于编码和组织数据。

XML文档包含标记与内容。标记由标签、属性、与元素构成。有3种类型的标签:起始标签(<person>)、结束标签(</person>)以及空元素标签(<noContace />)。空元素标签也叫自关闭标签。XML文档的结构要求发送端与接收端遵循某种服务契约。

解析方式:

SAX (Simple API for XML) 与 DOM (Document Object Model).

SAX解析器是事件驱动的,它会顺序解析XML文档中的元素,一次处理一个元素。

DOM解析器则会将整个XML文档以可遍历的结点树的形式读取到内存中。

iOS自带两种原生XML解析器,分别是NSXMLParser 与 libxml。

NSXMLParser是个OC SAX解析器。在遇到元素、属性、CData快、注释与文档起始和结束事件时会调用各种委托方法。

libxml SAX解析类似于NSXMLParser,

libxml DOM 会将整个XML文档读取为结点树,可以通过XML Path Language(XPath)遍历与查询。


2.json是一种用于交换结构化信息的轻量级数据格式。拥有小巧的格式规则定义集合,在创建负载时需要严格遵守。

Apple 通过NSJSONSerialization 类提供了原生的JSON解析支持。

3.HTML是一种标记语言,用于组织网页上的数据,这样浏览器就可以解析页面了。

HTML文档本身通常不带契约,它们可以频繁的发生巨大的变化而不必通知用户。

解析HTML非常麻烦。在解析过程中可能出现很多问题的地方,每处都会导致应用不可用。

第五章

1.错误处理

考虑一个字节是如何从设备发送远程服务器以及从远程服务器将这个字节接收到设备。下图展示了Internet协议栈的各个层次。


Internet协议栈的各个层次

每一层都会执行某种错误检测,错误检测出现在栈的每一层,自下而上直到应用层,应用层则会语法和语义上检查消息。手机和服务器可以分成3种错误类别:操作系统错误、HTTP错误与应用错误。下图展示了向应用服务器发出的HTTP请求的简单序列图。每块阴影区域都表示这3种错误类型的错误域。典型地,操作系统错误是由HTTP服务器问题导致的。HTTP错误是由HTTP服务器或应用服务器导致的 。应用错误是由请求传输的数据或应用服务器查询的其他系统导致的。


操作系统错误是由数据包没有达到预定目标导致的。

OS错误:没有网络、无法路由到目标主机、没有应用监听目标端口、无法解析目标主机名。

在iOS的URL加载系统中,操作系统错误会以NSError对象的形式发送给应用。iOS通过NSError在软件组件间传递错误信息。相比简单的错误代码来说。使用NSError的主要优势在于NSError对象包含了错误域属性。应用可以创建自己的NSError对象。

NSError对象有3个主要属性:

code:表示错误的NSIntegen值。对于产生错误的错误域来说。这个值是唯一的。

domain:指定错误域的NSString指针,比如NSPOSIXErrorDomain、NSOSStatussErrorDomain、及NSMachErrorDomain.

userInfo:NSDictionary指针,其中包含特定于错误的值。

如果应用创建的是异步请求,那么NSError对象就会返回到委托类的方法。

Apple建议不要过度使用UIAlertViews,因为这会破坏设备的使用感受。

iOS设备通信错误的另一主要原因就是由于没有网络连接而导致设备无法访问目标服务器。可以在尝试发起网络连接前检查一下网络状态,这样可以避免很多OS错误。请记住,这些设备可能会很快的进入或离开网络。因此,在每次调用前检查网络的可达性是非常合情合理的事情。

iOS的SystemConfiguration框架提供了多种方式来确定设备的网络连接状态。可以在SCNetworkReachability参考文档中找到关于底层API的详尽信息。Apple提供了一个名为Reachability的实例程序,它为SCNetworkReachability实现了一个简化、高层次的封装器。

Reachability封装器提供如下4个主要功能:

1. 标识设备是否具备可用的网络连接

2. 标识当前的网络连接是否可以到达某个特定的主机

3. 标识当前使用的哪种网络技术:Wi-Fi、WWAN还是什么技术都没用

4. 在网络状态发生变化时发出通知

可达性可以确定当前网络上某个特定的主机是否是可达的。可以通过该特性根据应用是处于内部隔离的网络上还是公开的Internet上调整企业应用的行为。请记住,该特性对目标主机的访问有个来回。如果每个请求都使用该特性,那就会极大增加应用的网络负载与延迟。

2.HTTP错误

HTTP错误是由HTTP请求、HTTP服务器或应用服务器的问题造成的。HTTP错误通过HTTP响应的状态码发送给请求客户端。

404状态是常见的一种HTTP错误,表示找不到URL指定的资源。

一共有5类HTTP错误:

1.信息性质的100级别:来自于HTTP服务器的信息,表示请求的处理将会继续,不过带有警告。

2.成功的200级别:服务器处理了请求。每个200级别的状态都表示成功请求的不同结果。比如,204表示请求成功,不过没有向客户端返回负载。

3.重定向需要的300级别:表示客户端必须执行某个动作才能继续请求,因为所需的资源已经移动了。

4.客户端错误400级别:表示客户端发出了服务器无法正确处理的错误数据。比如未知的URL或是不正确的HTTP头会导致这个范围内的错误。

5.下游错误500级别:表示HTTP服务器与下游应用服务器之间出现了错误。比如,如果Web服务器调用了javaEE应用服务器,Servlet出现了NullPointerException,那么客户端就会收到500级别的错误。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • iOS网络编程读书笔记 Facade Tester客户端门面模式的实例(被动版本化) 被动版本化,所以硬编码URL...
    melouverrr阅读 1,575评论 3 7
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,820评论 0 3
  • 网络 理论模型,分为七层物理层数据链路层传输层会话层表示层应用层 实际应用,分为四层链路层网络层传输层应用层 IP...
    FlyingLittlePG阅读 710评论 0 0
  • 今天继续赖床,在辞职的两个多月后,没目标的继续活着,也有去试着找一些工作,心里却依然没找到出口。迷茫,不知道我能把...
    喵家海小阳阅读 185评论 0 0
  • 她的脑子里好像有个开关。 她身处谷底。 她没有找过爬出谷底的路。 她躺在谷底看天。 你路过了,你不知所措。 她懒洋...
    樱嘤姑娘阅读 270评论 0 0