当前位置: 首页 > 面试题库 >

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

夹谷阳夏
2023-03-14
问题内容

我正在开发一个用Swift编写的iOS应用程序,该应用程序可与本地网络上的HTTP服务器通信,并且我正在使用Apple的Reachability类来确定运行HTTP服务器的远程计算机是否在线。这是代码

...
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)
}

问题是无论远程计算机是联机还是脱机,

(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)

只要我连接到Wifi网络,总是如此。但是,当我关闭Wifi时,它会导致错误而不是真实。我在这里做错什么了吗,还是Reachability类与Swift /
xCode 6 Beta不兼容?我也尝试过这个:

(ReachabilityInst.currentReachabilityStatus() == ReachableViaWiFi)

但这导致xCode告诉我“无法为接受提供的参数的’==’找到重载”,即使这两个参数看起来都属于’NetworkStatus’类型。

提前致谢。


问题答案:

您使用的Reachability类基于Apple的SCNetworkReachability类,该类不能完全满足您的期望。从SCNetworkReachability文档中:

当应用程序发送到网络堆栈的数据包可以离开本地设备时,就可以认为远程主机可以访问。可达性不能保证主机将实际接收到数据包。

因此,它不是用于测试远程主机是否真正在线,而是用于(1)当前网络设置是否允许尝试访问它,以及(2)通过什么方法进行测试。确定网络处于活动状态后,您需要尝试连接以查看远程主机是否真正启动并正在运行。

注意: 此测试:

(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)

是正确的检查方法-
由于某些原因,这NetworkStatus是在没有NS_ENUM宏的情况下创建的少数苹果枚举之一。



 类似资料:
  • 问题内容: 我正在将现有的Objective- C代码(iOS)重写为Swift,现在正面临Apple类用于检查网络可用性的问题…在现有代码中,我使用以下代码来实现这一目标。 我收到此错误: 在此行: 是否有获取网络状态的方法或类? 我需要以下三个条件: 问题答案: 对于网络可用性(在Swift 2中有效): 对于Wi-Fi连接:

  • 可达性 一个产品,如果对于任何人(无论能力)而言,都是非常容易掌握、理解并可以用之来完成他们的目标的话,那么这个产品就是可达的。一个成功的产品对于任何可能的使用者来说都应该是可达的。 这些设计准则对于想要了解可达性的设计师而言是一个很好的起点。设计完全可达的产品是一个复杂的课题,需要深入研究。欲了解更多信息,请访问谷歌的可达性网站。 如何使你的产品更好地服务于身有残疾的用户? 首先,让你的产品使用

  • 问题内容: 如何使用Java检查服务?我找到了这篇文章,但这仅用于检查主机名。 我的问题是如何检查端口x上的服务是否在运行,例如ex 或or ,我可能正在这些端口上运行服务n或p,但是如果手动进行操作,则可以通过网络看到它,如何在java中达到相同的效果? 问题答案: 该代码段发送了一个ping,您无法对其进行操作以实现所需的功能。只需打开一个套接字并捕获任何异常。 如果需要检测正在运行的服务,则

  • 问题内容: 我正在尝试使用sparkjava.com框架为我的Apache Spark作业构建Web API。我的代码是: 如果删除lambda表达式或将其放在简单的jar而不是Web服务(以某种方式称为servlet)中,它将运行无任何错误。但是在servlet中使用lambda表达式将导致以下异常: PS:我尝试过将jersey和javaspark与码头,tomcat和resin结合使用,所有

  • 问题内容: 是否可以使用Swift检查互联网连接是否可用? 我知道有很多第三方库可以执行此操作,但是它们都是用Objective-C编写的。我正在寻找Swift的替代方案。 问题答案: 如评论中所述,尽管可以在Swift中使用Objective-C库,但我想要一个更纯粹的Swift解决方案。现有的AppleReachability类和其他第三方库对于我来说转换为Swift似乎太复杂了。我用Goog

  • 此外,Google Play Services引用库是否会包含在APK导出中,或者这只是为了开发环境?