当设备连接到 3G 网络时,为什么我的代码会导致“无互联网”结果?

问题描述 投票:0回答:1

我正在测试用户是否连接到互联网。运行一些测试后,我发现了奇怪的行为:

  • 如果我连接到 WiFi 或 4G -> 我会得到
    HomeView
    ,这很好。
  • 如果我处于飞行模式 -> 我会得到
    ErrorView
    ,这也很好。
  • 但是如果我连接到 3G -> 我会得到
    HomeView
    ,这根本就不好,因为出于某种原因,3G 似乎意味着没有互联网。例如,当我使用 3G 时,App Store 应用程序告诉我未连接。

这是为什么,我该如何解决?

import SwiftUI

struct ContentView: View {
    @StateObject private var networkManager = NetworkManager()

    var body: some View {
        Group {
            if networkManager.isConnected {
                HomeView()
            } else {
                ErrorView()
            }
        }
    }
}
import Foundation
import Network

class NetworkManager: ObservableObject {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "Monitor")
    var isConnected = false

    init() {
        monitor.pathUpdateHandler = { path in
            self.isConnected = path.status == .satisfied

            Task {
                await MainActor.run { self.objectWillChange.send() }
            }
        }

        monitor.start(queue: queue)
    }
}
swift 3g
1个回答
0
投票

3G并不意味着“没有互联网”。这意味着系统认为它已连接到 3G 网络,该网络通常连接到“互联网”。

我在这里使用引号是因为“互联网”没有严格的含义。这不是什么特别的事情。它是一个计算机网络,其中一些您可能能够访问,一些您可能无法访问。这些计算机不断变化。除了手机信号塔(您的第一跳)之外,您没有任何特别的“连接”。 “连接到手机信号塔”的含义甚至没有严格的含义。

我们通常所说的“连接”是指,如果我们发送一个数据包,它会到达目的地,我们会得到一些响应。如果不发送数据包并接收响应,就无法知道您是否处于该状态。

网络不是“管道”,我们都抓住两端并可以知道另一端何时放手。它们就像邮政邮件。您将消息放入邮箱,然后查看邮箱,看看是否有回复。

NWPathMonitor
告诉您的是,如果您尝试在任何地方发送数据包(不仅仅是“互联网”,而是发送到任何其他服务器,可能在本地专用网络上),它会不会尝试发送数据包。例如,如果收音机被关闭,那么它显然没有连接。它描述的是第一跳。系统不可能知道该数据包是否能够真正到达目的地。但它可以告诉你它是否会尝试。

确定您是否已连接到某物的唯一方法是尝试向其发送数据,并查看它是否响应。 (这并不能告诉您发送的“下一个”数据包是否会成功,但这是您可以获得的最好提示。)这就是 AppStore 正在做的事情。它会向其服务器(而不是“互联网”)发送一条消息,如果失败,则表示您未连接。可能是所涉及的 3G 网络丢失了大量数据包,因此手机可能已连接到网络,但超时了。 你也需要做同样的事情。您可以使用

NSPathMonitor

作为您肯定离线的提示。如果您之前处于离线状态,它会很好地提示您何时可以重试。但要知道您确实在线的唯一方法是发送内容并获得回复。

    

© www.soinside.com 2019 - 2024. All rights reserved.