首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用Apple的Reachability在Swift中检查远程服务器的可达性

利用Apple的Reachability在Swift中检查远程服务器的可达性
EN

Stack Overflow用户
提问于 2014-07-12 13:33:07
回答 4查看 20.2K关注 0票数 17

我正在开发一个用Swift编写的iOS应用程序,该应用程序可以在本地网络上与HTTP服务器通信,我正在使用苹果的Reachability类来确定运行HTTP服务器的远程机器是否联机。下面是代码:

代码语言:javascript
运行
复制
...
let RemoteHost: String = "192.168.178.130"
var RemoteReachability: Reachability! = nil
var RemoteIsReachable: Bool = false

init() {
        super.init()
        self.RemoteReachability = Reachability(hostName: self.RemoteHost)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: self.RemoteReachability)
        self.RemoteReachability.startNotifier()
        self.RemoteIsReachable = (self.RemoteReachability.currentReachabilityStatus().value == ReachableViaWiFi.value)
}

func reachabilityChanged(notification: NSNotification) {
    let ReachabilityInst: Reachability = notification.object as Reachability
    self.RemoteIsReachable = (ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)
}

问题是,不管远程计算机是在线的还是离线的,

代码语言:javascript
运行
复制
(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)

总是正确的,只要我连接到Wifi网络。然而,当我关掉Wifi时,结果是假的,而不是真。我是不是做错了什么,还是Reachability类与Swift/xCode 6 Beta不兼容?我也试过这样做:

代码语言:javascript
运行
复制
(ReachabilityInst.currentReachabilityStatus() == ReachableViaWiFi)

但这导致xCode告诉我“无法找到接受所提供参数的'==‘的过载”,尽管两者似乎都是'NetworkStatus’类型。

提前谢谢。

EN

Stack Overflow用户

发布于 2019-11-19 11:39:24

使用组合和可实现性:

代码语言:javascript
运行
复制
import Combine
import Reachability
import os

class ReachabilityStore: ObservableObject {
    private var reachability: Reachability

    @Published var reachable: Bool = false
    @Published var reachableViaWifi: Bool = false
    @Published var reachableViaCellular: Bool = false

    init() {
        reachability = try! Reachability()

        reachability.whenReachable = { [weak self] reachability in
            guard let self = self else { return }

            self.reachable = true
            self.reachableViaWifi = reachability.connection == .wifi
            self.reachableViaCellular = !self.reachableViaWifi

            os_log(
                "Reachable via %{public}s",
                self.reachableViaWifi ? "WiFi" : "Cellular"
            )
        }

        reachability.whenUnreachable = { [weak self] _ in
            guard let self = self else { return }

            os_log("Unreachable")

            self.reachable = false
            self.reachableViaWifi = false
            self.reachableViaCellular = false
        }

        do {
            try reachability.startNotifier()
        } catch {
            os_log("Unable to start reachability notifier.")
        }
    }
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24713449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档