iPhone SDK中附带了 SCNetworkReachabilityCreateWithAddress用于检查ip地址是否可以访问。传入清零地址(0.0.0.0)可用来查询网络状态。
网络可使用时返回YES,否则为NO。
返回标记:
kSCNetworkReachabilityFlagsIsWWAN :测试用户使用的时运营商的网络还是本地wifi。
kSCNetworkFlagsConnectionRequired:无需更多链接。
kSCNetworkFlagsReachable:表明网络可以访问。
代码如下:
头文件:
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <netdb.h>
#import <SystemConfiguration/SCNetworkReachability.h>
frameworks:/System/Library/Frameworks/SystemConfiguration.framework
- (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
//call like:
-(void) start {
if (![self connectedToNetwork]) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Network Connection Error"
message:@"You need to be connected to the internet to use this feature."
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
} else {
//do something
}
}
使用上述方法可能会出现以下问题:
当使用者在使用你的应用程式的时候,如果关掉萤幕,将装置放在锁定状态(就是那个重新打开时需要在萤幕上画一下「解锁」的状态)一阵子,然后再按一下按钮恢复使用,这个时候你想要做一些网路操作,其实是可以连线,但是Reachability API 还是告诉你无法连线;或刚打开应用程式的时候,也告诉你无法连线。当你需要判断能不能连线,使用者用了哪种连线而应不应该继续连线的时候,其实使用者可以连线,API 却始终一直告诉你不能连线。
把装置设定为锁定,然后恢复使用的状况是这样的-苹果的设计是,为了节省电力消耗,会在进入锁定状态后,自动关闭无线网路介面,而当你解除锁定后,才会把无线网路再度打开。而Reachability 基本上只询问「目前的网路状态」,如果装置的无线网路正处于从关闭的状态恢复的阶段,这时后回传的结果便是无法连线。
顺道一提,在第三方应用程式中,可以在Info.plist 档案中,设定UIRequiresPersistentWifi 这个选项,文件中说这个设定可以让应用程式持续保持无线网路的连线状态,但是,就算设了这项设定,在进入锁定状态后,系统仍然会自动关闭无线网路介面,这项设定仅局限于iPhone 一直开着、你不去把萤幕关掉的状况。
至于怎样在锁定状态下继续保持连线,那又是另外一个话题了。
刚进入应用程式的时候,也往往回传无法连线-猜测应该是使用iPhone 主画面(Springboard)的时候,无线网路介面大概也是关闭的。在点选要用什么应用程式的时候,好像也用不到什么网路功能,为了节电把网路介面关了也好。至于定时检查信箱、或从AppStore 下载软体什么的,应该是苹果有其他自己的背景程序,负责呼叫网路介面。
简言之,就是你常会遇到「问的时候说没有,但是下一秒钟网路就通」的状况,遇到这种状况,要使用比较白烂的作法,可以向Reachability 连续问两次,如果第一次说没有第二次却说有,那就代表其实还是有网路…可能比较好的作法,可以是,我们不要叫一个method 直接回传给我们网路状态,而是变成delegate 的方式来处理。
流程大概是这样,这边稍微有些啰嗦-
1. 设计两个delegate method,分别用于有网路与没网路两种状况。
2. 先生出一个SCNetworkReachabilityRef 物件,然后用SCNetworkReachabilityGetFlags() 抓取目前的网路状态,如果是有,就呼叫「有网路」的那组delegate method,直接结束。
3. 如果这一次抓取网路状态的结果是没有连线,我们就对刚刚产生的SCNetworkReachabilityRef 物件设定一个SCNetworkReachabilityCallBack function。因为只要连线状态出现变化,就会呼叫这个function,所以,在呼叫到的时候,再用SCNetworkReachabilityGetFlags() 抓一次目前的网路状态,决定要回传是「有网路」或「没网路」的delegate method。如果有呼叫到,通常是会有,如此一来,我们可以捕捉到了「第一次说没有,但是后来又有网路」的状况,并且成功回传「有网路」。
4. 同时设一组timer(或用NSObject 的perform selector after delay 之类的),如果超过一段时间,SCNetworkReachability API 都没有被呼叫前一点中提到的SCNetworkReachabilityCallBack function,就代表不但一开始没网路,而且后来一直还是那个状态,那…就代表一直没网路。这时后呼叫「没网路」的delegate method。
5. 记得要release 那个SCNetworkReachabilityRef 物件…。
采用这种实作,在没有网路连线的状态下,就会需要几秒钟的等待,确定目前的确没有网路连线。不过嘛,反正没有网路连线,也不能够做什么别的事情,所以等个几秒钟也无所谓嘛。
顺道一提,iPhone SDK 关于SCNetworkReachability 的说明文件里头有个错误,在讲如何设定SCNetworkReachabilityCallBack 的部份提到-
Here is an example of a function declared to conform to this type:
- (void)MyReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info);
另外一篇学习文章:
http://www.yifeiyang.net/iphone-web-development-skills-of-the-article-4-make-sure-the-network-environment-3gwifi/
apple的demo:Reachability
分享到:
相关推荐
开发者需要编写算法来检查每个单元格的邻居状态,并根据规则更新其下一状态。这涉及到数组操作和循环,可能还包括异步处理,以确保流畅的动画效果。 5. **CADisplayLink**:为了实现平滑的动画效果,项目可能使用了...
《iOS游戏应用源代码解析——unindented-copong-iphone-ae6a6c9.zip》 在iOS开发领域,源代码分析是一项至关重要的技能,它有助于开发者深入理解应用程序的工作原理,提升编程技巧,以及优化游戏性能。本文将详细...
开发者可能使用`PHPhotoLibrary.requestAuthorization`(Swift)或`PHAuthorizationStatus`(Objective-C)来请求和检查权限状态。 7. **GCD(Grand Central Dispatch)与异步编程**:为了保证用户体验,加载图片这...
《iOS游戏应用源代码——salemsayed-Connect4-iPhone-0ff2f00》是一款基于iOS平台的Connect4游戏源代码。Connect4是一种经典的两人棋类游戏,玩家轮流在垂直的7列、6行的棋盘上下色棋子,目标是先形成4个同色棋子的...
4. **网络状态**:虽然`UIDevice`本身不直接提供网络状态的检查,但可以通过其扩展方法获取网络连接类型,例如是否连接到WiFi或者蜂窝数据。 5. **硬件加速功能**:`hasAccelerometer`和`hasGyro`属性可以判断设备...
本项目“Chat-1”是一个基础的iPhone小程序,它展示了如何在iOS平台上实现一个简单的聊天应用。下面我们将深入探讨这个源码中的关键知识点。 1. **Xcode和Swift语言**: - Xcode是Apple官方的集成开发环境(IDE)...
首先,ultrasn0w是由著名的越狱团队—— Chronic Dev Team 和 iPhone Dev Team 开发的一款解锁程序。它的主要目标是帮助用户绕过运营商的SIM卡锁,使得iPhone可以使用任何兼容的GSM网络服务。这一版本,1.2.8,是...
《iPhone游戏源代码分享——揭示类似“钻石迷情”的开发秘籍》 在这个数字化的时代,游戏开发已经成为一种流行的艺术和技术结合体。今天我们将探讨一款名为"ColouredStones"的iPhone游戏源代码,它与经典的“钻石...
首先,我们要了解iPhone应用程序的基础——Xcode集成开发环境。Xcode是Apple官方提供的开发工具,用于编写、调试和发布iOS应用。在这个案例中,“FruitLink水果连连看”就是使用Xcode和Objective-C语言创建的。...
在IT行业中,序列号查询工具对于苹果用户来说是非常实用的工具,尤其是对于验证设备的合法性、检查保修状态以及了解设备历史等。标题提到的"Iphone序列号查询软件 一楼土木人"是一款专为iPhone设计的序列号查询软件...
本教程将聚焦于一个历史悠久、简单却充满挑战的经典游戏——俄罗斯方块,通过在iPhone平台上实现它,帮助你快速掌握游戏开发的基本技巧。 俄罗斯方块是一款起源于1984年的电子游戏,由俄罗斯工程师阿列克谢·帕基...
在本文中,我们将详细探讨iPhone越狱的相关知识点,包括越狱的目的、过程、风险以及推荐的工具——redsn0w。 一、越狱的目的 1. 自由度提升:越狱后,用户可以安装不受苹果官方限制的第三方应用,如Cydia,提供大量...
在标题“IOS应用源码——UIPickerView选择多个选项效果.rar”中,我们关注的重点是UIPickerView如何实现多选功能。通常,UIPickerView默认只支持单选,但通过自定义和扩展,可以实现选择多个选项的效果。这里我们将...
这个实例开发源码——苹果(iPhone)序列号和IMEI码查询系统,旨在帮助开发者构建一个能够验证和查询苹果设备序列号以及IMEI码的平台。在深入探讨源码之前,我们首先需要理解这两个关键概念。 **苹果序列号(Serial...
【标题】"IOS应用源码——webView控制器的一些常用控制.zip" 涉及到的是iOS应用开发中的一个关键部分:Web视图控制器的使用。在iOS应用开发中,WebKit框架提供了一个用于展示网页内容的控件,即WKWebView,它是...
【构建跨平台移动应用——基于浏览器的iPhone与Android开发(2)】 在移动应用开发领域,基于浏览器的应用程序提供了一种高效且灵活的方式,允许开发者为iPhone和Android平台创建一致的用户体验,而无需针对每个...
《iPhone自定义键盘优化版——数字键盘与字母键盘的实现详解》 在移动设备中,键盘作为用户输入的主要工具,其设计与优化至关重要。本文将深入探讨如何在iOS平台上实现一款自定义键盘,涵盖数字键盘与字母键盘的...