我想检查一下我是否可以在iOS上使用Cocoa Touch库或在macOS上使用Cocoa库连接互联网。
我想出了一个方法来做这个使用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),如果是这样,有什么更好的方法来实现这一点?
重要:该检查应该始终异步执行。下面的大多数答案是同步的,所以要小心,否则你会冻结你的应用程序。
斯威夫特
通过CocoaPods或Carthage安装:https://github.com/ashleymills/Reachability.swift
通过闭包测试可达性
let reachability =可达性()!
可达性。whenReachable ={可达性
如果可达性。连接== .wifi {
打印(“可通过WiFi访问”)
}其他{
打印(“可通过蜂窝连接”)
}
}
可达性。whenUnreachable = {_ in
打印(“不可以”)
}
{做
尝试reachability.startNotifier ()
} catch {
打印("无法启动通知程序")
}
objective - c
将SystemConfiguration框架添加到项目中,但不要担心将它包含在任何地方
添加Tony Million版本的Reachability.h和Reachability。m到项目(在这里找到:https://github.com/tonymillion/Reachability)
更新接口部分
#进口“Reachability.h”
//在视图控制器的.m文件中添加这个接口
@interface MyViewController ()
{
可达性* internetReachableFoo;
}
@end
然后在视图控制器的。m文件中实现这个方法,你可以调用它
//检查我们是否有网络连接
- (void) testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
//网络可达
internetReachableFoo。reachableBlock = ^(可达性*reach)
{
//更新主线程的UI
设置(dispatch_get_main_queue()、^ {
NSLog(@“Yayyy,我们有了互联网!”);
});
};
//网络不可达
internetReachableFoo。unreachableBlock = ^(可达性*reach)
{
//更新主线程的UI
设置(dispatch_get_main_queue()、^ {
NSLog(@"有人破坏了互联网:(");
});
};
[internetReachableFoo startNotifier];
}
重要提示:Reachability类是项目中最常用的类之一,因此您可能会遇到与其他项目的命名冲突。如果发生这种情况,您将不得不重命名Reachability.h和Reachability对中的一个。M文件到其他文件来解决这个问题。
注意:您使用的域名并不重要。这只是在测试通往任何领域的入口。
很简单的…试试下面这些步骤:
步骤1:将SystemConfiguration框架添加到项目中。
步骤2:将以下代码导入到头文件中。
#import <SystemConfiguration/SystemConfiguration.h>
第三步:使用以下方法
类型1:
- (BOOL) currentNetworkStatus {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
BOOL连接;
BOOL与;
Const char *host = "www.apple.com";
SCNetworkReachabilityRef reachabilityreachabilitycreatewithname (NULL, host);
SCNetworkReachabilityFlags旗帜;
connected = SCNetworkReachabilityGetFlags(可达性,&flags);
isConnected = NO;
isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(可达性);
返回与;
}
类型2:
导入头文件:# Import "Reachability.h"
(保龄球)currentNetworkStatus
{
可达性*可达性=[互联网连接的可达性];
NetworkStatus NetworkStatus =[可达性currentReachabilityStatus];
返回networkStatus !=不可访问;
}
第四步:使用方法:
- (void)CheckInternet
{
BOOL network = [self currentNetworkStatus];
if (network)
{
NSLog(@"Network Available");
}
else
{
NSLog(@"No Network Available");
}
}
Alamofire
我知道这个问题是要求Coca Touch解决方案,但我想为搜索检查iOS上的互联网连接的人提供一个解决方案,在这里将有一个更多的选择。
如果您已经在使用Alamofire,以下是您可以从中受益的内容。
你可以将以下类添加到你的应用程序中,并调用MNNetworkUtils.main.isConnected()来获得一个关于它是否连接的布尔值。
#import Alamofire
class MNNetworkUtils {
static let main = MNNetworkUtils()
init() {
manager = NetworkReachabilityManager(host: "google.com")
listenForReachability()
}
private let manager: NetworkReachabilityManager?
private var reachable: Bool = false
private func listenForReachability() {
self.manager?.listener = { [unowned self] status in
switch status {
case .notReachable:
self.reachable = false
case .reachable(_), .unknown:
self.reachable = true
}
}
self.manager?.startListening()
}
func isConnected() -> Bool {
return reachable
}
}
这是一个单例类。每次,当用户连接或断开网络时,它都会覆盖self。因为我们开始在单例初始化时监听NetworkReachabilityManager。
另外,为了监视可达性,您需要提供一个主机。目前,我正在使用google.com,但如果需要,请随意更改到任何其他主机或您的主机之一。将类名和文件名更改为与项目匹配的任何名称。