第一次写博客,因为最近想把iOS网络这部分搞懂搞熟!
言归正传,我们现在开始吧!
iOS网络包括包括4层框架栈,从高层到底层分别是:
1:用URL加载的objC API,bonjour,以及gameKit
2:core Foundation层的CAPI ,其中包括CFNetwork(基于CFStream,CFSorket) CFNetService
3:BSD Socket(完全使用C语言实现,对远程设备和服务器通信具有完全的控制能力)
4:HARDWARE(WI-FI,蜂窝,蓝牙)
它们的层级关系如下图所示:
苹果建议开发者使用CFNetwork及以上层网络框架!基于C语言的BSD Socket无法访问系统范围的VPN,Wi-Fi以及蜂窝无线电!而CFNetwork 已经帮我们处理好了!
下面我们来看一下iOS网络API
1:NSURLConnection
NSURLCoonnection 是 cocoa 级别的API ,构建与NSStream 之上。它针对如下4个常见的URI模式进行了优化支持:文件/http/https/FTP 。虽然它限制了开发者能够使用的协议,但是对底层的缓存读写工作做了抽象,包括认证机制,还提供了健壮的缓存引擎!
它主要依赖于NSURLConnectionDelegate协议,默认情况下是异步请求,当然也可以同步!
2:GameKit
Game Kit 核心功能是提供构建一个先对点的通信选项!Game Kit 构建与 bonjour 之上,但是它不需要任何的网络基础设施就能使用。它能组建自组的蓝牙个人区域网络(Blue Tooth Person Area Networks). gamekit 在创建网络时候只需要会话标示、显示名及连接模式 。不需要SOCKET 配置,或是任何底层的网络就可以实现点对点之间的通信!
GAME kit 通过GKSessionDelegate协议 进行通信 。
3:Bonjour
Bonjour是苹果基于0配置的网络实现 。它可以检测并与网络中的设备或者服务进行连接 同时无需了解设备的网络地址 。bonjour 通过名字、服务类型、与域这一元组来引用服务。cocoa 层通过NSNetserviceBrowser API探测bonjour 服务 。想要发布并解析bonjour服务需要了解core foundation才能配置通讯所需要的socket 。
4.NSStream
NSStream是一个cocoa 级别的API 构建在CFNetwork 之上 ,是NSURLConnection 的基础 ,旨在完成底层的通信任务 。NSStream 还可以在telnet\smtp等nsurlconnection不支持的协议上通信 。它没有提供对http(s)响应状态码及认证的内建支持 。它所发送与接收的数据位于C缓冲区中 。NSStream是异步的,通过NSStreamDelegate实现通讯更新 。
5.CFNetwork
CFNetwork 位于基础的BSD Socket 之上 。用于NSStream\bonjour\game kit \URl 加载系统 的API 实现之中 。它与BSD Socket 之间的主要差别在于运行循环的集成 。如果应用使用了CFNetwork ,那么输入与输出事件都会在线程的运行循环中调度 。如果输入与输出发生在辅助线程中,那么还需要以恰当的方式开启运行循环 。
CFNetwork 比url加载系统提供更多的配置选项 。但这些配置选项往往都需要自己添加 。CFNetwork 基础设施构建于core foundation 层的CFStream与 CF Socket API之上 。CFNetwork 还包括针对特定协议的API。比如用于FTP通讯 的 CFFTP、用于HTTP 通讯的CFHTTP 、用于BONJOUR服务的CFNetServices等。
6.BSDsocket
是网络框架层次体系中的最底层 。是大多数网络活动的基础 。
实现各种网络API 时需要理解他们是如何与应用集成的 。运行循环,会监测操作系统的网络事并将其转发给应用 。