2

我不是在谈论可达性。

我所说的是弄清楚如何通过蜂窝接口从 iOS 设备创建网络连接。

为什么?因为我有设备连接到 WiFi 接入点的条件,所以它选择了 WiFi……但该接入点没有连接互联网,而且无处可去。我有数据,我必须尽一切努力提供,在某些情况下,它会在通往炼狱的 WiFi 网关中丢失。在使用 Reachability 和依赖 MPTCP 两种情况下,Apple 已经在堆栈中优先考虑了 WiFi。

我知道NSURLSessionConfiguration可以设置allowsCellularAccess允许蜂窝访问 - 我希望需要蜂窝进行路由。

即使在CFNetwork我正在查看kCFStreamPropertyConnectionIsCellular状态的级别,kCFStreamPropertyNoCellular禁用蜂窝。

反正我找不到优先考虑蜂窝无线电。我意识到 Apple 已经竭尽全力偏爱 WiFi,而我反对这一点——这就是为什么我很难找到答案的原因。

我希望将其保持在 Cocoa 级别,但不反对进入 Foundation 或更深的级别。我想避免尝试解析接口表(如果它甚至可以访问)来确定哪个是蜂窝接口。

尽管似乎存在 WiFi,但是否有人成功地通过蜂窝链接创建了网络连接?

多路径 TCP的一些配置是这里的答案吗?

4

2 回答 2

0

在 iOS 12 及更高版本中,您可以使用Network Framework。示例代码在这里

于 2018-11-19T02:28:31.167 回答
0

要绑定到特定接口,据我所知,您必须一直下降到原始套接字级别,并且无法为 NSURLSession 目的提供自定义套接字,因此您基本上是从头开始重写它。您应该提交一个错误,请求支持将 NSURLSession 绑定到源 IP。

您遇到的行为是 iOS 和断开网络的已知问题。iOS 9 及更高版本做得更好,但即便如此,它们也可能存在很大问题;这些设备有时会拒绝与 Wi-Fi 网络通信,有时会拒绝与蜂窝网络通信。具体来说,如果任何一个信号很弱,它似乎都会失败。就在今天早上,我实际上不得不通过将 iPhone (iOS 10) 置于飞行模式并仅启用 Wi-Fi 来强制与断开的 Wi-Fi 网络通信。

有人告诉我,您可以通过将网络的 DHCP 服务器配置为不提供路由器广告来解决此问题;也就是说,每次我尝试过时,iOS设备都会不断地反复询问报价。也许那个错误在某个时候得到了修复。如果是这样,它可能值得一试,但不要指望它可以在旧版本的 iOS 中工作。

如果做不到这一点,假设您不需要在 iOS 3 和更早版本中支持 Web 浏览器,您可能会尝试完全消除该 Wi-Fi 网络上的 DHCP 服务器,而只依赖具有零配置 IP 的 DNS 服务发现。这样,设备将看不到路由器,并且不会尝试将数据发送到该接口,除了那些链接本地 IP。

如果由于某种原因无法做到这一点,通常我会建议使用 libcurl 的自定义副本,但我怀疑这是否适用于您的情况,因为 POSIX 网络不会唤醒蜂窝硬件。

于 2017-01-23T09:23:43.490 回答