我想检查一下我是否可以在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文件到其他文件来解决这个问题。

注意:您使用的域名并不重要。这只是在测试通往任何领域的入口。

其他回答

进口“Reachability.h”

-(BOOL)netStat
{
    Reachability *test = [Reachability reachabilityForInternetConnection];
    return [test isReachable];
}

使用Xcode 9和Swift 4.0检查Internet连接的可用性(iOS)

遵循以下步骤

步骤1:

创建一个扩展文件,并将其命名为ReachabilityManager.swift。然后添加下面的代码行。

import Foundation
import SystemConfiguration
public class ConnectionCheck
{
    class func isConnectedToNetwork() -> Bool
    {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)

        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress,
        {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        })
        else {
            return false
        }

        var flags: SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
            return false
        }

        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)

        return (isReachable && !needsConnection)
    }
}

步骤2:使用下面的代码调用上面的扩展。

if ConnectionCheck.isConnectedToNetwork()
{
     print("Connected")
     // Online related Business logic
}
else{
     print("disConnected")
     // Offline related business logic
}

创建一个AFNetworkReachabilityManager对象,并使用以下代码跟踪网络连通性

self.reachabilityManager = [AFNetworkReachabilityManager managerForDomain:@"yourDomain"];
[self.reachabilityManager startMonitoring];
[self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
            case AFNetworkReachabilityStatusReachableViaWiFi:
                break;
            case AFNetworkReachabilityStatusNotReachable:
                break;
            default:
                break;
        }
    }];

重要:该检查应该始终异步执行。下面的大多数答案是同步的,所以要小心,否则你会冻结你的应用程序。


斯威夫特

通过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文件到其他文件来解决这个问题。

注意:您使用的域名并不重要。这只是在测试通往任何领域的入口。

如果你正在使用AFNetworking,你可以使用它自己的实现internet可达状态。

使用AFNetworking的最好方法是子类化AFHTTPClient类,并使用这个类来进行网络连接。

使用这种方法的优点之一是,当可达性状态发生变化时,您可以使用块来设置所需的行为。假设我已经创建了一个名为BKHTTPClient的AFHTTPClient的单例子类(如AFNetworking文档上的“子类注释”所述),我会做如下的事情:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

您还可以使用AFNetworkReachabilityStatusReachableViaWWAN和AFNetworkReachabilityStatusReachableViaWiFi枚举来检查Wi-Fi或WLAN连接。