检查互联网连接 - iOS逻辑

时间:2016-03-09 11:09:29

标签: ios swift swift2

我是iOS编程的新手,没有面向对象的编程背景。

我有一个应用程序,它本质上是几个Web API的用户界面。

我有一个Reachability类,可以让我检查是否有有效的互联网连接。当用户在登录页面上并且没有其他操作时,这很有效。

然而,假设我有一个带有5个按钮的视图,所有这些都需要互联网连接才能工作。我是否只需要每个按钮调用此Reachability.isConnected() - >在实际进行API调用之前的Bool方法?

我担心这不是正确的逻辑。我是否应该有后台程序来定期检查连接?

由于缺乏OOP经验,我将这个功能分解为离散类,因此我遇到了问题。

有关处理此连接检查的最佳方法的任何建议都会很棒。

3 个答案:

答案 0 :(得分:5)

要检查连接网络,您必须创建一个类,例如将其放在“服务”文件夹中,然后复制以下代码:

import Foundation
import SystemConfiguration

public class Reachability {

    class func isConnectedToNetwork() -> Bool {

        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
        }

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

        let isReachable = flags == .Reachable
        let needsConnection = flags == .ConnectionRequired

        return isReachable && !needsConnection

    }
}

然后,在任何您想要的地方使用它:

if Reachability.isConnectedToNetwork() {

     // Do stuff if you're connected to the internet

}
else {

    // Do stuff if you're not connected to the internet
}

希望它可以帮到你;)

答案 1 :(得分:0)

包括可达性

然后有这样的方法。

对于目标C: -

+ (BOOL)internetAvailable
{
// check if we've got network connectivity
    Reachability *myNetwork = [Reachability reachabilityWithHostname:@"google.com"];
    NetworkStatus myStatus = [myNetwork currentReachabilityStatus];

    switch (myStatus) 
    {
        case NotReachable:
        return NO;
        break;

    case ReachableViaWWAN:
        return YES;
        break;

    case ReachableViaWiFi:
        return YES;
        break;

    default:
        return YES;
        break;
    }
}

编辑: -

对于swift: -

import Foundation
import SystemConfiguration

public class Reachability {

class func isConnectedToNetwork() -> Bool {

    var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
    zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
    }

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

    let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

    return isReachable && !needsConnection
}

}

只要在需要的地方调用这些方法。

答案 2 :(得分:0)

有两种方法可以检查网络连接,您可以设置观察者进行网络连接更改,以便在网络连接状态发生变化(连接或断开连接)时收到通知。

(您可以使用iOS Reachability类检查网络连接,也可以使用AFNetworking库)

如果您想要持续监控网络更改,您应该按如下方式设置观察者:

将此代码添加到AppDelegate中的didFinishLaunchingWithOptions

NSNotificationCenter.defaultCenter().addObserver(self, selector:"checkNetworkStatus", name: ReachabilityChangedNotification, object: nil);

do{self.reachability = try Reachability.reachabilityForInternetConnection()}catch{}

  do{try self.reachability.startNotifier()}catch{

  }

self.performSelector("checkNetworkStatus", withObject: nil, afterDelay: 0.6)

将以下代码添加到AppDelegate

var networkStatus : Reachability.NetworkStatus!
var objNetworkStatusView : NetworkStatusView! = nil

func checkNetworkStatus()
{
    networkStatus = reachability.currentReachabilityStatus

    if (networkStatus == Reachability.NetworkStatus.NotReachable)
    {
        print("Not Reachable")
        objNetworkStatusView = NetworkStatusView(frame:CGRectMake(0, 0, self.window!.frame.size.width, self.window!.frame.size.height))
        UIApplication.sharedApplication().keyWindow?.addSubview(objNetworkStatusView)
        UIApplication.sharedApplication().keyWindow?.bringSubviewToFront(objNetworkStatusView)
    }
    else
    {
        print("Reachable")
        if((objNetworkStatusView) != nil)
        {
        objNetworkStatusView.removeFromSuperview()
        }
    }
}

如果您只是想在向服务提出请求之前检查网络连接,则应按如下方式手动检查网络连接:

在您必须调用Web服务的类中创建委托实例,或者您必须检查网络连接,

let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

并将网络连接检查为

if (delegate.networkStatus==Reachability.NetworkStatus.NotReachable) {
   delegate.checkNetworkStatus()
} else {
  //You can call web service here
}