在实现收发网络数据的代码时,请记住这是设备上最耗电的操作之一。最少化收发数据的时间有助于提高电池的使用寿命。为此,您在编写与网络相关的代码时需要考虑如下贴士:
对于您自己控制的协议,请将数据格式定义得尽可能紧凑。
避免使用聊天式的协议进行通讯。
在任何可能的时候,将数据包成群传输。
蜂窝网和Wi-Fi无线网都被设计为在没有数据传输活动时关闭电源。然而,根据无线网络的不同,这样做可能需要花几秒钟的时间。如果您的应用程序每隔数秒就发送少量的数据,则即使无线装置实际上并没做什么,也会一直保持电源打开,持续耗电。相比于经常性地传输少量数据,一次性传递所有数据或间隔时间较长但每次传递数据量较大是更好的选择。
在进行网络通讯时,意识到数据包在任何时候都可能丢失是很重要的。在编写网络通讯代码时,请务必在出现错误时进行处理,使程序尽可能强壮。实现响应网络条件变化的处理程序是完全合理的,但如果这些处理程序始终没有被调用,也不要觉得奇怪。举例来说,在网络服务消失时,Bonjour的网络回调函数并不总是立即被调用。当接收到某个服务即将消失的通告时,Bonjour系统服务确实立即调用浏览回调函数(browsing callbacks),然而,网络服务可能没有通告就消失了,如果设备提供的网络服务意外地丢掉网络连接,或者通告在传递中丢失,就可能出现这种情况。
使用Wi-Fi
如果您的应用程序通过Wi-Fi无线信号访问网络,则必须将这个事实通知系统,即在应用程序的Info.plist
文件中包含UIRequiresPersistentWiFi
键。包含这个键使系统知道在检测到活动的Wi-Fi 热区时应该弹出网络选择框,同时还使系统知道在您的应用程序运行时不应试图关闭Wi-Fi硬件。
为了防止Wi-Fi硬件消耗太多的电能,iPhone OS内置一个定时器,如果在30分钟内没有应用程序通过UIRequiresPersistentWiFi
键请求使用Wi-Fi,就会完全关闭该硬件。如果用户启动某个包含该键的应用程序,则在该程序的生命周期中,iPhone OS会有效地禁用该定时器。但是一旦该程序退出,系统就会重新启用该定时器。
请注意:即使UIRequiresPersistentWiFi
键的值为true
,在设备空闲(也就是处于屏幕锁定状态)时也是没有效果的。在那种情况下,应用程序被认为是不活动的,虽然它可能在某些级别上还在工作,但没有Wi-Fi连接。
有关UIRequiresPersistentWiFi
键及Info.plist
文件中其它键的更多信息,请参见“信息属性列表”部分。
飞行模式警告
当应用程序启动时,如果设备处于飞行模式,系统可能会显示一个对话框通知用户。系统仅在下面的所有条件都满足时才会显示这个通知对话框:
应用程序的信息属性列表(
Info.plist
) 文件包含UIRequiresPersistentWiFi
键,且该键的值被设置为true。应用程序启动的同时设备处于飞行模式。
在切换到飞行模式后设备上的Wi-Fi还没有被手工激活。