`
lifaming15
  • 浏览: 64770 次
  • 来自: ...
文章分类
社区版块
存档分类

iphone检查网络状态

 
阅读更多

最近在做iphone网络链接部分,于是鄙人将各路的好贴整合了一下并且加了自己的一些想法,希望对大家有所帮助~~ 写的不好的地方还请各位大大多多指教啊

iPhone SDK中附带了 SCNetworkReachabilityCreateWithAddress用于检查ip地址是否可以访问。传入清零地址(0.0.0.0)可用来查询网络状态。
网络可使用时返回YES,否则为NO。

返回标记:
kSCNetworkReachabilityFlagsIsWWAN:测试用户使用的时运营商的网络还是本地wifi。



乐成3G论坛主要为大家提供
3G技术资料下载 3G课件分享 3G手机应用 下载等内容。


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);

分享到:
评论

相关推荐

    iphone网络编程知识必备

    ### iPhone网络编程知识必备...通过上述方法,可以确保应用程序在不同的网络环境下都能正常工作,并能根据网络状态的变化给出相应的提示或采取相应的措施。这对于提升用户体验以及确保应用符合苹果审查标准都至关重要。

    卡iphone在线工具

    5. 解决方法:针对iPhone的网络问题,用户可以尝试重启设备、检查SIM卡、更新运营商设置、还原网络设置或者恢复出厂设置(作为最后手段)。对于QQ问题,可以尝试清除应用缓存、更新QQ版本、检查账号状态或者联系客服...

    卡永久iPhone在线

    标题“卡永久iPhone在线”可能指的是一个教程或者解决方案,旨在帮助用户解决iPhone设备出现的网络连接问题,使得手机能够保持长时间的在线状态。这可能是针对那些遇到iPhone经常断网、无法持续在线或电池耗电过快等...

    iPhone在线

    【标题】"iPhone在线"可能指的是与iPhone设备的网络连接状态或者使用iPhone进行在线操作相关的主题。这可以涵盖从基础的Wi-Fi连接、移动数据设置到更复杂的在线服务如App Store下载、Safari浏览以及Apple ID的管理等...

    iphone配置实用工具

    2. **网络诊断**:实用工具内置了网络诊断功能,可以检测网络连接状况,找出可能导致3G无法使用的问题所在。通过诊断结果,用户可以有针对性地进行故障排除。 3. **网络重置**:在某些情况下,恢复网络设置到出厂...

    iOS网络高级编程 iPhone和iPad的企业应用开发

    iOS提供了Reachability框架来检查网络连接状态,开发者可以据此决定是否发起网络请求,同时,通过本地缓存和数据同步策略,可以让应用在离线时也能提供一定的功能。 总的来说,《iOS网络高级编程:iPhone和iPad的...

    卡iphone24小时不掉线

    标题“卡iphone24小时不掉线”暗示了一个关于iPhone保持稳定网络连接的主题,特别是针对可能遇到的网络连接不稳定或容易断线的问题。这可能是针对iOS设备用户的一个指南,教他们如何优化设置,确保他们的iPhone在24...

    exui仿iPhone网络验证UI源码

    当用户打开应用时,系统会检查网络状态,如果没有连接或者连接不稳定,就需要显示相应的提示,告知用户当前的网络状况并引导他们进行网络设置。这种用户体验在iOS设备上已经非常成熟,因此许多Android开发者也希望能...

    iphone激活及版本查询

    这不仅可以确保你正确设置并开始使用新购买的iPhone,还能帮助你跟踪设备的状态,以便于升级、维修或出售。以下是对这些知识点的详细说明: 一、iPhone激活 1. 新买iPhone:当你购买一部全新的iPhone,它通常是未...

    IOS检查网络类型

    4. 使用 `isReachable`, `isReachableViaWiFi`, 和 `isReachableViaWWAN` 方法检查网络状态。`isReachable` 告诉你设备是否可以访问互联网,`isReachableViaWiFi` 检测是否通过Wi-Fi连接,`isReachableViaWWAN` 则...

    卡iphone在线

    总之,面对卡iPhone在线的问题,我们应首先检查系统更新、清理内存、解决软件冲突和优化网络环境。若问题持续存在,可以考虑寻求专业帮助,如联系苹果官方客服或授权维修中心。同时,谨慎对待不明来源的修复工具,...

    Reachability网络状态

    在iOS 11及更高版本中,由于苹果对用户隐私的加强保护,不再推荐使用Key-Value Coding(KVC)来直接访问导航栏视图中的网络状态,因此Reachability成为了更安全、更规范的网络状态检查方案。 首先,我们来看如何...

    iphone XCode实现了对无线网络的识别的功能

    4. 检测网络状态:通过Reachability对象的属性或方法获取当前网络状态,例如是否可达到目标主机,以及是通过Wi-Fi还是蜂窝数据连接。 5. 响应网络状态变化:根据获取到的网络状态,调整应用的行为,如加载本地数据、...

    iphone QQ 在线软件

    为解决这个问题,用户可能需要检查网络连接,确保Wi-Fi或移动数据的稳定;更新QQ到最新版本以获取性能优化和bug修复;清理设备内存,关闭不必要的后台应用;或者尝试重启设备。 在压缩包子文件的文件名称列表中,...

    iphoneQQ在线工具

    【标题】"iPhoneQQ在线工具"是一个专门为iPhone用户设计的应用,旨在模拟真实iPhone设备上的QQ在线状态,让用户在不使用实际iPhone的情况下也能保持QQ在线。这个工具的特点是它能够模仿真机挂Q的行为,确保与使用...

    iphone6手机连不上移动网络的处理方法.pdf

    这可能会刷新网络连接状态,使手机重新搜索可用的网络。 4. **检查SIM卡**: - 关闭iPhone,使用SIM卡针打开SIM卡托盘,取出SIM卡,清洁SIM卡接触面,然后重新插入。确保SIM卡安装正确,再开机检查是否能连上网。 ...

    iPhone4各种SHSH备份

    当用户尝试恢复或更新iOS设备时,Apple的验证服务器会检查设备提交的SHSH与即将安装的固件版本是否匹配。如果匹配,更新过程将继续;如果不匹配,Apple服务器将拒绝操作,以此保护设备免受未授权的固件修改。 ...

    好易通 IPHONE查询工具V1.2.rar

    【好易通 iPhone查询工具V1.2】是一款专为iPhone用户设计...无论是检查设备健康状况、确认保修状态,还是鉴别二手设备的真伪,这款工具都能提供必要的帮助。因此,对于拥有iPhone的用户来说,它是一款值得拥有的工具。

    电脑iPhoneqq在线

    而当我们提到“卡iPhoneQQ在线”时,可能是指在电脑上通过模拟器或屏幕镜像等方法运行iPhoneQQ时遇到的性能问题或者网络连接状况不佳导致的在线体验下降。 首先,我们来了解如何在电脑上使用iPhoneQQ。通常有以下两...

    卡永久iphone在线

    标签“iphone在线”进一步确认了主题与iPhone的网络状态有关。基于这些信息,我们可以深入探讨以下iPhone在线使用相关的知识点: 1. **网络设置**:确保iPhone正确配置了Wi-Fi或蜂窝数据。在“设置”&gt;“Wi-Fi”或...

Global site tag (gtag.js) - Google Analytics