iOS和OS X中的网络技术非常相似,大多数网络应用几乎不要求特定于平台的代码。但是,你应该知道两者还是有所不同的。
在iOS中,你可以使用特定平台的网络API来处理捕获网络的验证,并可以指定VoIP网络流。还有,iOS网络应用更有可能在多个设备上运行(通常使用蜂窝网络以及Wi-Fi连接),并且需要在应用进入后台的时候清理网络连接。
在OS X中的网络环境是高度可配置和可扩展的。系统配置(System Configuration)框架提供用于确定和设置当前网络配置的API。此外,网络内核扩展允许你通过添加类似防火墙或VPN这样的功能,来扩展OS X的核心网络基础架构。
本章描述这些与特定平台有关的差异。
iOS要求你处理后台并指定蜂窝网络使用策略
这部分描述了网络技术以及特定于iOS的技术,包括关于捕获网络支持的信息、后台、以及仅连接Wi-Fi等内容。
正确地限制蜂窝网络
有两种方法防止通过蜂窝网络发送连接。要基于应用的要求和目的选择方法。
在SCNetworkReachability API中的kSCNetworkReachabilityFlagsIsWWAN标记,告诉你如果应用连接到特定主机,哪个接口将可能被使用。但是这个标记可能会被误导,因为:
- Wi-Fi信号可能会在应用检查可达性之后、连接之前消失。
- 不同的主机可能被不同的接口访问。你不能信任一个对多个主机都有效的可达性检查(并且你不能信任对虚拟IP地址的可达性检查,例如0.0.0.0)。
- 同一主机的不同IP地址,可能会被不同接口访问。如果远程主机同时有IPv4和IPv6地址,iOS通常会尝试同时连接两个地址,然后使用最先创建的连接,并取消对另一个连接的尝试。如果用户的蜂窝网络提供IPv6并且用户的Wi-Fi网络没有提供,则可以使用蜂窝网络或Wi-Fi连接,这取决于哪个连接更快。注意:在iOS 6中,如果Wi-Fi被作为IPv4或IPv6的主要接口,则蜂窝网络就不会被作为这两者的主要接口,所以这个特殊情况只是特定于iOS 5及更早版本。
如果应用必须绝对避免通过蜂窝连接发送数据,应用必须在创建连接的时候明确的声明限制策略。如果你以询问的方式使用可达性(比如,在使用蜂窝网络下载较大的电影之前询问用户),你还应该考虑将蜂窝网络的连接禁用。如果连接失败,请求用户对使用蜂窝网络发送数据的许可,并在没有上述标记的情况下再次尝试。
在Foundation层,你可以使用NSMutableURLRequest的setAllowsCellularAccess:方法来指定是否一个请求能通过蜂窝网络连接发送。你还可以使用allowsCellularAccess来检查当前的值。
在Core Foundation 层,你可以在打开一个数据流(从CFSocketStream 或 CFHTTPStream APIs获取)之前通过设置kCFStreamPropertyNoCellular属性来实现相同的效果。
在老版本的iOS中,你可以继续使用kSCNetworkReachabilityFlagsIsWWAN作为确定是否使用蜂窝网络连接发送流量的一种方式,但你应该知道它的局限性。
正确地处理后台
当应用在后台时它可以被挂起,这意味着它不能长时间处理网络流量。在一些情况下,当应用被挂起的时候,已经存在的连接会被关闭。要了解应对后台的技术,请阅读Networking and Multitasking。
正确地注册VoIP sockets
NSInputStream, NSOutputStream, CFStream, 和 NSURLConnection API有对VoIP通信的内建支持。这个支持允许你为VoIP注册TCP连接,以便如果应用被挂起,在数据到达时该应用会被唤醒。
更多信息,阅读App Programming Guide for iOS中的Implementing a VoIP Application。
为捕获的网络支持注册
捕获网络是Wi-Fi网络,它在用户执行某些操作(例如登录、指定支付、或统一条款及条件)之前是不能提供网络访问的。捕获网络通常是在公共区域,例如机场和酒店。
当用户加入一个捕获网络,Captive Network Support(捕获网络支持)通常会提供一个用于允许用户使用网络的认证网页表单。如果你的应用注册了捕获网络的SSID,但是该网页被禁用,该用户可以在你的应用中完成认证。
更多信息,请阅读CaptiveNetwork Reference。
OS X让你进行全系统更改
下面的部分介绍了在何处能了解在OS X中使用网络接口,以及开发扩展网络堆栈的网络核心扩展。
开发网络设置应用程序
如果你想在用户级别的应用程序中修改当前的网络配置,使用System Configuration框架。
想要了解关于System Configuration的架构,请阅读System Configuration Programming Guidelines。然后阅读 System Configuration Framework Reference来了解可用的API。
如果你的应用程序专门使用Wi-Fi连接到无线网络,你可以使用Core WLAN框架。更多信息,请阅读CoreWLAN Framework Reference。
开发网络内核扩展
如果你想修改或扩展OS X的网络基础架构,例如实现一个自定义防火墙、自定义VPN、或者一个带宽管理系统,你需要编写一个内核扩展(kernel extension,kext),这个扩展插入到内核的网络子系统。这些扩展被称为网络内核扩展,或NKE。
想要了解编写kext的基础知识,请阅读Kernel Extension Programming Topics。然后阅读Network Kernel Extensions Programming Guide来了解如何实现网络kext。
网友评论