在开发过程中,有时候可能需要判断网络是否真正可用,即真正可以访问互联网(比如连上未插网线的路由器WiFi时,网络并不是真正可用)。当在网络不可用时,可能需要提示用户或做一些其他操作。

如何去检测网络是否真正可用呢?其实可以通过Apple提供的特定域名来测试网络连通性。向这些特定域名发送HTTP请求,假如能收到正确的响应结果,则认为网络真正可用;否则,认为网络不可用。

iOS系统可能通过以下几个域名来测试网络连通性:
captive.apple.com
www.airport.us
www.ibook.info
www.itools.info
www.thinkdifferent.us
www.appleiphonecell.com

简单测试:拷贝以上某个域名到Safari浏览器地址栏中,然后按下↩︎回车键,会看到页面显示:Success,则说明网络真正可用。

具体实现代码如下:

#define DomainOfAppleToCheckNetwork @"http://captive.apple.com"#pragma mark - 检测网络是否真正可用/// 检测网络是否真正可用 (比如连上未插入网线的路由器WiFi时,网络并不真正可用)
/// @param completion 完成回调
+ (void)checkNetworkActuallyAvailable:(void(^)(BOOL available))completion {// 创建请求NSString *urlStr = DomainOfAppleToCheckNetwork;NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:3];#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10// 创建请求任务NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!data) {if (completion) {completion(NO);}return;}NSString *htmlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];// 解析HTML页面内容NSString *content = [self fetchContentFromHTMLString:htmlString];BOOL success = [content isEqualToString:@"SuccessSuccess"];if (completion) {completion(success);}}];[task resume];#elseNSOperationQueue *queue = [NSOperationQueue new];[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {if (!data) {if (completion) {completion(NO);}return;}NSString *htmlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];// 解析HTML页面内容NSString *content = [self fetchContentFromHTMLString:htmlString];BOOL success = [content isEqualToString:@"SuccessSuccess"];if (completion) {completion(success);}}];#endif
}/// 取出HTML的内容
/// @param htmlString HTML字符串
+ (NSString *)fetchContentFromHTMLString:(NSString *)htmlString {/* HTML字符串格式如下:<html><head><title>Success</title></head><body>Success</body></html>*/// 剔除HTML字符串中的标签,以获取内容NSString *content = [self replacingMatchesInString:htmlString withPattern:@"<[\\w/]*?>" withTemplate:@""];return content;
}/// 替换字符串中的匹配字符串为目标字符串
/// @param string 要替换的字符串
/// @param pattern 模式字符串
/// @param template 目标字符串
+ (NSString *)replacingMatchesInString:(NSString *)string withPattern:(NSString *)pattern withTemplate:(NSString *)template {NSError *error = nil;NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];if (error) {NSLog(@"正则表达式: %@ 无效! error: %@", pattern, error.localizedDescription);return string;}NSString *newString = [regex stringByReplacingMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, string.length) withTemplate:template];return newString;
}

Portal相关

1.客户端连上WiFi后是否会自动弹出Portal登录页面是由客户端决定的。

部分客户端连上WiFi后会向设定的网站发送探测报文,比如苹果手机会向 captive.apple.com 发送探测报文,这个报文到达设备后,设备就会对客户端进行重定向,此时客户端会自动打开浏览器,弹出Portal登录界面。而如果连上WiFi后的客户端不支持发送探测报文的功能,则Portal登录页面无法自动弹出。如果客户端无法自动弹出Portal登录页面,可以尝试使用浏览器访问任意网页,此时就可以弹出Portal登录页面。

2.在做Portal相关的工作时, 发现iOS系统在连接到一个WiFi热点之后,会向某些域名发送HTTP请求。如果不能收到正确的响应:

<html><head><title>Success</title></head><body>Success</body>
</html>

,就会弹出网络连通性测试界面,这个时候如果直接退出测试界面,iOS系统就会主动断开这个WiFi连接。

iOS开发 检测网络是否真正可用(真正可以访问互联网)相关推荐

  1. iOS开发 - 检测网络状态(WIFI、2G/3G/4G)

    检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是 让用户了解自己的网络状态,防止一些误会(比如怪应用无能) 根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 WIFI ...

  2. iOS开发系列--网络开发(转)

    iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 66365 阅读, 56 评论, 收藏, 编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...

  3. iOS开发之网络监听(一)Reachability

    demo下载 Reachability对系统的网络状况类SCNetworkReachability进行的封装,持有全局的网络状况句柄reachabilityRef,简化了SCNetworkReacha ...

  4. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载

    前言:iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载是在前篇iOS开发之网络编程--使用NSURLConnection实现大文件下载的基础上进行    断点续传的设置 ...

  5. iOS开发工具——网络封包分析工具Charles

    iOS开发工具--网络封包分析工具Charles 简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Char ...

  6. iOS开发笔记 - 网络篇

    计算机网络基础   计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享.   如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物. ...

  7. iOS开发之网络音乐播放器(SC音乐)(二)

    iOS开发之网络音乐播放器(SC音乐)(二) 前言 iOS开发之网络音乐播放器(SC音乐)(一)已经介绍完播放控制.音乐数据获取解析.歌词显示等.本文在上文的基础上介绍锁屏播放设置,后台播放设置,手势 ...

  8. wifi: 连接网络时提示“已连接无法访问互联网”几秒钟后消失

    android M版 连接网络时提示"已连接无法访问互联网"几秒钟后消失 1.描述 wifi: 连接网络时提示"已连接无法访问互联网"几秒钟后消失 产生原因见  ...

  9. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

最新文章

  1. python中的counter()、elements()、most_common()和subtract()函数的用法
  2. R语言与数据分析(6)-R包的安装
  3. 吃完降压药多久能睡觉 降压药什么时候吃好
  4. Apache Mina2.x网络通信框架使用入门
  5. 提升沟通效率52%  阿里政务钉钉助力政府数字化转型
  6. jlabel字怎么变化_怎样才能把字写好?详解最科学的练字方法及步骤
  7. 松下a6伺服驱动连接光栅尺_闭环伺服系统的数控贴条为什么要安装光栅尺?
  8. SQL Server中的查询优化技术:数据库设计和体系结构
  9. 湖北师范大学计算机应用基础,2019年湖北师范大学911计算机应用基础考研大纲...
  10. 1.oracle dblink(数据库不同实例数据对导)
  11. linux下Oracle 10g的安装
  12. ES 新增字符串方法
  13. ZigBee 协议栈的调度顺序代码分析
  14. 发起成立“ABCD联盟”,人工智能与区块链技术研讨会北京站精彩回顾
  15. Android中的PackageManager
  16. android组件化解耦,android module解耦组件化总体概述
  17. 自动化测试 -- 通过Cookie跳过登录验证码
  18. html 衣服特效,详细介绍HTML5 3D衣服摇摆动画特效如何实现
  19. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:淡水养殖池塘水华发生及池水自净化研究(附一等奖获奖论文和matlab代码)
  20. chrome绿色版浏览器

热门文章

  1. 计算机实战项目、毕业设计、课程设计之 含论文+辩论PPT+源码等]微信小程序ssm竞赛管理平台小程序+后台管理系统
  2. 效率(1)Excel常用操作技巧
  3. WIN10环境下MAVEN的安装与配置
  4. 论文翻译:Pose estimation at night in infrared images using a lightweight multi-stage attention network
  5. android10的coloros,OPPOReno10倍变焦版ColorOSV7刷机包(官方最新固件升级包安卓10ColorOS V7)...
  6. BEIT: BERT Pre-Training of Image Transformers论文解读
  7. 【VBA研究】VBA编程产生不重复随机数
  8. Contest3412 - 2022中石油大中小学生联合训练第七场
  9. 在Vue中使用WebSocket+HighCharts+Canvas实现高性能的频谱瀑布图
  10. 《怪诞行为学--丹.艾瑞里》知识点总结