4

我想使用一种在 3G 上运行良好但不能在某些公司防火墙上运行的消息传递协议。即使在 WiFi 网络可访问的情况下,我的应用程序在无法通过 WiFi 连接时如何强制使用蜂窝网络?

编辑:阅读完 Reachability 类的实现后,我仍然不确定这两者是否确实相互排斥。很可能通过 发现这两个接口gethostbyname(),我可能会尝试看看会出现什么。

4

3 回答 3

6

使用 getifaddrs 枚举网络接口。查找以“pdp”开头的 ifa_name。这将是蜂窝接口(例如,pdp_ip0)。测试 (ifa_flags & IFF_UP) 以确保接口已启动,并从 ifa_addr 获取 IP 地址。然后使用 bind() 将您的套接字绑定到该地址。

如果蜂窝接口尚未启动,则不确定如何激活它。通常,我只是进行高级 http 调用以让 iOS 唤醒网络,但不确定当 wifi 也可用时蜂窝服务在什么条件下变为活动状态。我怀疑它通常作为wifi的后备存在。

于 2015-01-06T23:15:48.710 回答
2

http://iphonedevsdk.com/discussion/comment/120957

从那个线程的外观来看,这似乎是不可能的。您最好的选择可能是尝试使用该协议,如果它不起作用,请说“请断开 wifi 并重试”之类的内容。

该线程说的几乎相同:

如何以编程方式在 iPhone 上启动 3g 连接?

您可以使用可达性类来测试当前网络连接是否超过 3G 或 WiFi,甚至可以检查网络上是否有特定资源可用。

于 2012-10-17T01:24:14.227 回答
2

您可以使用任何套接字库来强制使用蜂窝。从 getifaddrs 找到蜂窝接口,将接口传递给套接字函数,套接字绑定将与蜂窝发生。例如CocoaAsyncSocket

于 2018-05-17T09:33:08.153 回答