【问题标题】:How to check for internet connection repeatedly?如何反复检查互联网连接?
【发布时间】:2016-04-03 01:23:14
【问题描述】:

我正在使用 Swift 和 Parse 构建应用程序。在几个不同的View Controllers 中,我使用 Parse 来保存和查看对象。但是,如果我必须有 Internet 连接才能访问 Parse。目前,我开发了以下方法来检查互联网:

    let url = NSURL(string: "http://myeighthours.com/")

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in

        print(data)
        print(response)
        print(error)

        if let _ = data {

            UIApplication.sharedApplication().endIgnoringInteractionEvents()
            self.activityIndicator.stopAnimating()

            //Success


        } else {


            UIApplication.sharedApplication().endIgnoringInteractionEvents()
            self.activityIndicator.stopAnimating()

            //Failed

        }

    }

    task.resume()

现在这是一个单独的View Controller。如果我要持续检查互联网,每次尝试访问 Parse 时,我都必须在所有视图控制器中使用此代码。这将是非常乏味和低效的。另外,我必须 1. 为单独的“无 Internet 连接”视图控制器创建一个 segue,或 2.为每个视图控制器添加一个按钮,显示“没有 Internet 连接。点击重试”。如果我关闭我的互联网连接并运行该应用程序,它只是停留在那里加载。我在调试日志中收到此错误消息:

2015-12-29 12:43:19.700 MYAPPNAME[975:354550] [Error]: The Internet connection appears to be offline. (Code: 100, Version: 1.7.5)
2015-12-29 12:43:19.700 MYAPPNAME[975:354550] [Error]: Network connection failed. Making attempt 2 after sleeping for 1.958450 seconds.
2015-12-29 12:43:21.854 MYAPPNAME[975:354549] [Error]: The Internet connection appears to be offline. (Code: 100, Version: 1.7.5)
2015-12-29 12:43:21.855 MYAPPNAME[975:354549] [Error]: Network connection failed. Making attempt 3 after sleeping for 3.916899 seconds.
2015-12-29 12:43:26.132 MYAPPNAME[975:354549] [Error]: The Internet connection appears to be offline. (Code: 100, Version: 1.7.5)
2015-12-29 12:43:26.133 MYAPPNAME[975:354549] [Error]: Network connection failed. Making attempt 4 after sleeping for 7.833799 seconds.

重复检查互联网连接的最有效方法是什么?感谢您的帮助。

【问题讨论】:

标签: ios xcode swift parse-platform internet-connection


【解决方案1】:
#import <SystemConfiguration/SCNetworkReachability.h>

一旦检测到 Internet 无法访问以持续检查连接性,NSTimer 调用 isNetworkReachable 方法...计时器重复持续时间应为 2-3 秒。此外,您的 NStimer 实例应该是全局的,而不是在每个视图控制器中

+(BOOL)isNetworkReachable
{
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityRef address;
    address = SCNetworkReachabilityCreateWithName(NULL, "www.google.com" );
    Boolean success = SCNetworkReachabilityGetFlags(address, &flags);
    CFRelease(address);

    bool canReach = success
    && !(flags & kSCNetworkReachabilityFlagsConnectionRequired)
    && (flags & kSCNetworkReachabilityFlagsReachable);

    return canReach;
}

【讨论】:

  • 请确保您的代码在提交之前可以正常工作。我收到各种错误。仔细检查 oyur coude。
  • 我想你忘了在你的项目中添加 systemConfiguration 框架...转到项目设置并在构建设置中在你的项目中添加系统配置框架
  • 你不讨厌人们只是从 SO 中复制+粘贴代码并期望它能够工作,而至少没有尝试了解代码是如何工作的吗?
  • @penatheboss OP 给出的示例在ObjectiveC 中,可能这就是它在您的Swift 文件中给出编译错误的原因
  • 我使用objectivec2swift将代码转换为swift。此外,@Divyanshu Sharma 从未在他的原始答案中说明添加框架。
【解决方案2】:

检查互联网连接是否正常工作并在 Swift 2.0 上测试的最佳方法

1) 创建一个新的 swift 文件 connection.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(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() == true {
                println("Internet connection OK")
            } else {
                println("Internet connection FAILED")
            }
            If the user is not connected to the internet, you may want to show them an alert dialog to notify them.
            if Reachability.isConnectedToNetwork() == true {
                println("Internet connection OK")
            } else {
                println("Internet connection FAILED")
                var alert = UIAlertView(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", delegate: nil, cancelButtonTitle: "OK")
                alert.show()
        }

灵感来自

https://github.com/Isuru-Nanayakkara/Reach

【讨论】:

  • 真的很好很整洁
猜你喜欢
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2017-11-30
  • 2012-03-23
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多