如何使用 swift 4 测试 iPhone 与互联网的连接?
Posted
技术标签:
【中文标题】如何使用 swift 4 测试 iPhone 与互联网的连接?【英文标题】:How to test for iPhone connection to internet with swift 4? 【发布时间】:2017-11-01 02:43:27 【问题描述】:对于 Swift 4/xcode: 我已经在互联网上搜索了这个问题的解决方案,但我还没有找到一个涵盖所有基础的明确、全面的答案。 Stack上有几个在一定程度上回答了这个问题,包括诸如these或AshleyMills Reachability之类的快速具体答案,但很多都是旧的,并不全面。 1. 我想要检查互联网连接的方法,而不是只是连接到 wifi。网上的一些方法只是检查 Wi-Fi 的连接,但不确认通过 wifi 可以访问互联网。我想要一个仅在检测到互联网连接时返回 true 的方法。 2. 对于蜂窝数据使用,此方法必须也返回 true。是的,Wi-Fi 可以提供互联网连接,但数据也可以。如果提供了蜂窝/wifi 互联网中的一个或两个,则此方法需要足够全面才能返回 true。 最后,一个注释。在线没有完整的快速答案可以检查所有框的事实使我想知道我对这个问题的处理方法是否在更一般的意义上是不正确的。我的应用程序需要从数据库加载数据,这就是它需要互联网连接的原因。对于当今流行的应用程序来说,这是非常普遍的事情。应用程序不会因尝试在没有互联网连接的情况下加载其数据而崩溃。我认为他们所做的(这是这个问题的基础)是这样的:
if doesHaveInternetConnection
//run loading data functions
else
//don't run loading data functions
这不是它的做法吗?如果没有,解决这个问题的更好方法是什么?
【问题讨论】:
检查您是否“已连接”与是否可以访问 Internet 上的某些主机之间存在很大差异。您可以使用“正常”可达性来查看您是否已连接。如果是,请尝试“ping”某些特定主机以查看它是否响应。 就应用程序的功能而言,连接和能够访问主机有什么区别?此外,在为每次拉取启动数据库数据拉取之前不断尝试 ping 主机不会大大降低应用程序的速度吗? @AlekPiasecki 在大多数情况下使用 URLSession 就足够了。如果您尝试下载数据并且没有 Internet 连接,则错误描述将是 Internet 连接似乎处于脱机状态。只需向用户显示警报并将错误本地化描述作为消息传递。 @LeoDabus URLSession 如何与解析服务器数据调用一起工作?对我的数据库的调用没有格式化为 URLRequest,那么我该如何处理呢? @AlekPiasecki 您需要同时使用 URLSession 和可达性。当 Reachability 告诉您标志已更改时,您使用 URLSession 来获取您的应用程序数据。如果发生错误,只显示返回的错误。 【参考方案1】:Here 是发出网络请求时的URLError
s 列表。在列表中,有一个名为notConnectedToInternet
的枚举值。当您发出网络请求但失败时,请查看错误代码以了解是由于没有连接还是其他原因。
或者,您可以在您的服务器上托管一个health-check
端点。在发出任何请求之前,请向此端点发出请求。如果请求成功,您可以放心有互联网连接。不过,我强烈建议您使用第一个选项。
示例
注意:下面的代码在 Swift 3 中。
URLSession.shared.dataTask(with: *URLRequest*) (data, response, error) -> Void in
if error != nil
if let e = error as? URLError, e.code == .notConnectedToInternet
//Not connected to internet
else
//Some other error
else
//The request was successful
.resume()
【讨论】:
我看到了列表并看到了枚举值,但您能否更详细地解释一下,或许可以举个例子,我将如何在应用程序中使用它?我无法理解它的实现。 这将取决于实现。您是使用内置的URLSession
提出请求还是使用像 Alamofire 这样的第三方库?
更新了答案
无需将错误转换为 URLError。只需显示带有错误本地化描述的警报。检查我今天发布的这个答案***.com/a/47044973/2303865
@Malik,如果我的数据提取当前不使用URLSession
,这将如何工作。我使用了解析服务器,我的 datapulls 使用findObjectInBackground
运行。我是否只是将这些函数包装在 URLSession
中?【参考方案2】:
在 Swift 4 中使用 Alamofire 检查内部人员
import Foundation
import Alamofire
class Connectivity
class func isConnectedToInternet() ->Bool
return NetworkReachabilityManager()!.isReachable
然后调用这个函数
if Connectivity.isConnectedToInternet()
print("Yes! internet is available.")
// do some tasks..
【讨论】:
简答,好:) 这不是解决方案。如果您的设备已连接到 wifi,但 wifi 网络没有互联网,则此方法返回 true。以上是关于如何使用 swift 4 测试 iPhone 与互联网的连接?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4 相机视图,为啥这会在 iPad 而不是 iPhone 上崩溃?
无法在 iPhone 中使用 Swift 连接到 Parse