iPhone 应用程序连接到离线网络中的服务器

Posted

技术标签:

【中文标题】iPhone 应用程序连接到离线网络中的服务器【英文标题】:iPhone application connection to server in offline network 【发布时间】:2015-11-19 22:44:11 【问题描述】:

我正在开发一个系统,它在没有 Internet 连接的专用网络中具有一个简单的 Java 服务器,一个允许移动设备连接到网络和服务器的 Wifi 路由器,一个使用 TCP 连接到服务器的 ios 应用程序。我发现当非蜂窝设备(例如:iPod touch)通过 Wifi 路由器连接到网络时,连接到服务器没有问题。但是,将 iPhone 连接到 Wifi 热点时,设备上的客户端应用程序需要 5 分钟以上才能找到服务器。

我相信,如果没有互联网连接,该设备将使用其蜂窝网络访问互联网。从一个观察来看,在连接到热点之后,一些在线通知仍然被推送到手机上(我 100% 确定网络中没有互联网访问),但几分钟后,不再访问互联网并且手机可以连接到服务器。

所以问题是如何实现与 iPhone 的服务器的即时连接?有什么东西可以诱使连接的客户端设备认为可以访问互联网吗?

【问题讨论】:

【参考方案1】:

服务器有负载均衡器吗?

其他选项是您可以检查网络或wifi连接,如果wifi关闭则显示提示。

 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(nil, UnsafePointer($0)).takeRetainedValue()
    

    var flags: SCNetworkReachabilityFlags = 0
    if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 
        return false
    

    let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

    return (isReachable && !needsConnection) ? true : false

【讨论】:

服务器上没有负载均衡器,它是一个非常简单的Java服务器。如问题中所述,只有 iPhone 无法连接到服务器。 Wifi 网络不提供 Internet 连接,因此我怀疑该设备使用其蜂窝连接来访问 Internet。但是,有时会稍后建立连接。

以上是关于iPhone 应用程序连接到离线网络中的服务器的主要内容,如果未能解决你的问题,请参考以下文章

在连接到热点时通过 iPhone 连接到 localhost

如何用 Objective-C 判断 iPhone 是不是连接到 wifi 网络?

当设备连接到网络时,AWS AppSync 离线突变会多次更新到服务器

当我们执行以下操作时,您的应用程序在运行 iOS 11.1 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃:

指南 2.1 - 性能 在我们审核期间,您的应用在运行 iOS 11.2.5 并连接到 IPv6 网络的 iPad 或 iPhone 上崩溃

异步套接字延迟