我想查看我是否在iOS上使用Cocoa Touch库或使用Cocoa库在macOS上 Build 了Internet连接 .
我想出了一个使用 NSURL
来做到这一点的方法 . 我这样做的方式似乎有点不可靠(因为即使谷歌有一天可能会失败并依赖第三方看起来很糟糕),而且如果谷歌没有回复,我可以查看其他网站的回复,在我的应用程序中看起来似乎很浪费并且不必要的开销
- (BOOL) connectedToInternet
{
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return ( URLString != NULL ) ? YES : NO;
}
我做得不好,(更不用说 stringWithContentsOfURL
在iOS 3.0和macOS 10.4中被弃用)如果是这样,有什么更好的方法来实现这一目标?
30 回答
下载Reachability文件,https://gist.github.com/darkseed/1182373
并在框架中添加
CFNetwork.framework
和'SystemConfiguration.framework'#import“Reachability.h”
First :在框架中添加
CFNetwork.framework
Code :
ViewController.m
还有另一种使用iPhone SDK检查Internet连接的方法 .
尝试为网络连接实现以下代码 .
Reachability类可以确定设备是否可以使用Internet连接......
但是在访问Intranet资源的情况下:
使用可访问性类对Intranet服务器进行Ping操作始终返回true .
因此,在这种情况下,快速解决方案是创建一个名为
pingme
的Web方法以及该服务上的其他Web方法 .pingme
应该返回一些东西 .所以我在常用函数上编写了以下方法
上面的方法对我来说非常有用,所以每当我尝试将一些数据发送到服务器时,我总是使用这个低超时URLRequest来检查我的Intranet资源的可达性 .
Important :应始终异步执行此检查 . 以下大部分答案都是同步的,所以要小心,否则你会冻结你的应用程序 .
斯威夫特
1)通过CocoaPods或Carthage安装:https://github.com/ashleymills/Reachability.swift
2)通过闭包测试可达性
Objective-C
1)将
SystemConfiguration
框架添加到项目中,但不要担心将其包含在任何地方2)将Tony Million的
Reachability.h
和Reachability.m
版本添加到项目中(在此处找到:https://github.com/tonymillion/Reachability)3)更新接口部分
4)然后在您可以调用的视图控制器的.m文件中实现此方法
Important Note:
Reachability
类是项目中使用最多的类之一,因此您可能会遇到与其他项目的命名冲突 . 如果发生这种情况,您必须将其中一对Reachability.h
和Reachability.m
文件重命名为其他内容以解决此问题 .Note: 您使用的域名不仅仅是测试任何域的网关 .
除了可达性之外,您还可以使用Simple Ping helper library . 它工作得非常好,并且易于集成 .
使用Apple的Reachability代码,我创建了一个函数,可以正确地检查这个,而不必包含任何类 .
在项目中包含SystemConfiguration.framework .
做一些进口:
现在只需调用此函数:
它已经为您测试了iOS 5 .
Checking the Internet connection availability in (iOS) Xcode 8 , Swift 3.0
使用http://huytd.github.io/datatify/ . 它比自己添加库和编写代码更容易 .
非常简单....尝试以下步骤:
Step 1: 将
SystemConfiguration
框架添加到项目中 .Step 2: 将以下代码导入
header
文件 .Step 3: 使用以下方法
Import header :
#import "Reachability.h"
Step 4: 如何使用:
首先下载可达性类,并在Xcode中放入reachability.h和reachabilty.m文件 .
最好的方法是创建一个通用的Function类(NSObject),以便您可以在任何类中使用它 . 这是网络连接可达性检查的两种方法:
现在,您可以通过调用此类方法来检查任何类中的网络连接 .
要做到这一点非常简单 . 以下方法将起作用 . 请确保不允许使用名称传递主机名协议(如HTTP,HTTPS等) .
它快速简单,无痛 .
您可以使用
Reachability
by(available here) .在
ViewController
中导入Reachable.h
类,并使用以下代码检查 connectivity :First :在框架中添加
CFNetwork.framework
Code :
ViewController.m
这是一个非常简单的答案:
该URL应指向一个非常小的网站 . 我使用Google 's mobile website here, but if I had a reliable web server I' d上传 a small file with just one character in it 以获得最高速度 .
如果检查设备是否以某种方式连接到Internet是您想要做的一切,我肯定建议使用这个简单的解决方案 . 如果您需要知道用户的连接方式,可以使用Reachability .
小心:这会短暂阻止你的线程加载网站时 . 在我的情况下,这不是一个问题,但你应该考虑这一点(Brad指出这一点) .
这里有一个漂亮的,ARC和GCD使用的可达性现代化:
Reachability
或者使用 Reachability class .
使用iPhone SDK有两种方法可以检查Internet可用性:
1. Check the Google page is opened or not.
2. Reachability Class
有关更多信息,请参阅Reachability(Apple Developer) .
我认为这是最好的答案 .
“是”表示已连接 . “否”表示断开连接 .
关于iOS 5 Reachability的版本是darkseed/Reachability.h . 不是我的! =)
这曾经是正确答案,但它现在已经过时了,因为您应该订阅可达性通知 . 此方法同步检查:
您可以使用Apple的Reachability类 . 它还允许您检查是否启用了Wi-Fi:
SDK中不包含Reachability类,而是this Apple sample application的一部分 . 只需下载它,并将Reachability.h / m复制到您的项目中 . 此外,您必须将SystemConfiguration框架添加到项目中 .
我已经使用了this discussion中的代码,它似乎工作正常(阅读整个线程!) .
我没有用各种可能的连接(如ad hoc Wi-Fi)对其进行详尽的测试 .
我发现它简单易用的库SimplePingHelper .
示例代码:chrishulbert/SimplePingHelper(GitHub)
Apple提供sample code以检查不同类型的网络可用性 . 另外,iPhone开发者手册中有一个example .
Note: 请参阅@KHG 's comment on this answer regarding the use of Apple' s可达性代码 .
步骤1:在项目中添加Reachability类 .
步骤2:导入Reachability类
步骤3:创建以下功能
如果您正在使用AFNetworking,则可以使用自己的实现来实现Internet可访问性状态 .
使用
AFNetworking
的最佳方法是将AFHTTPClient
类子类化,并使用此类进行网络连接 .使用此方法的一个优点是,您可以使用
blocks
在可达性状态更改时设置所需的行为 . 假设我已经创建了一个名为BKHTTPClient
的AFHTTPClient
(如"Subclassing notes"上"Subclassing notes"上所述)的单例子类,我会做类似的事情:您还可以使用
AFNetworkReachabilityStatusReachableViaWWAN
和AFNetworkReachabilityStatusReachableViaWiFi
枚举(more here)专门检查Wi-Fi或WLAN连接 .Apple提供了一个示例应用程序,它正是如下:
Reachability
只有Reachability类已更新 . 你现在可以使用:
以下是我在我的应用程序中执行的操作:虽然200状态响应代码不保证任何内容,但它对我来说足够稳定 . 这不需要像在此处发布的NSData答案那样多的加载,因为我只检查HEAD响应 .
Swift Code
Objective-C Code
我喜欢简单易懂 . 我这样做的方式是:
然后,每当我想看看我是否有连接时,我都会使用它:
此方法不会等待更改的网络状态以执行操作 . 它只是在您要求时测试状态 .