iOS可达性(reachability)在3G网络下提示可以连接但实际上无法连接互联网。

4
我正在开发一款iPhone应用程序,每当我调用Web服务时,我希望确保用户已连接到互联网。
我使用了Tony Million在Github上提供的Reachability类,链接在此,任何人都可以获取:https://github.com/tonymillion/Reachability 然后我只是按照示例进行设置,并拥有以下代码。
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];

reach.reachableBlock = ^(Reachability*reach)
{
    // call web service here
};

reach.unreachableBlock = ^(Reachability*reach)
{
   // alert user not reachable
};

[reach startNotifier];

现在我在模拟器中测试,一切都很完美,当连接到wifi时我的服务被调用。如果我关闭wifi,我会看到显示的警报,这正是我需要的。
现在我在设备上测试,并获得了不错的结果,但并非完全符合我的需求。需要注意的是,我的手机没有数据套餐。
以下是场景:
- 我将手机连接到wifi并运行应用程序,完美,调用了web服务。在这里没有什么可担心的。 - 我断开手机与wifi的连接,再次运行应用程序,我期望看到警报告诉我它没有连接,但是我看到应用程序中的UI活动指示器正在旋转,这意味着应用程序已检测到某种连接并正在尝试连接到我的web服务。但这永远不会发生,我知道它正在检测蜂窝3g,因为我进入设置->常规->使用情况->蜂窝数据使用情况,将统计数据重置为0。过一段时间后,我可以看到发送和接收的数据。 - 我去设置->常规->蜂窝移动网络->关闭3g,运行应用程序,现在它显示没有连接的警报。

我知道很多人都有数据包,我也看到了市场上有一些应用程序具有我上面提到的可达性水平,但是在我刚才解释的情况下,我觉得这可以得到改进。

我有一个3G连接,但我不知道如何......

[Reachability reachabilityWithHostname:@"www.google.com"]; 

收到ping,还是没有?

虽然我已经关闭了wifi并打开了Safari,但它的表现方式相同,它显示正在加载一段时间,然后只是说Safari无法打开...

这只是不能完成的事情吗?

最后,我甚至看到Tony Million在github页面上提供的示例,在我的手机上运行时,尽管wifi关闭并且我没有数据包,但它仍然显示可达。

我查看了几个Stack Overflow答案,其中用户询问如何检查互联网连接性,但大多数答案都围绕“类型”wifi、wwan等展开,而不是检测是否存在有效的互联网连接,而不是连接到网络。

谢谢您的时间。


你可能没有数据套餐,这是原因之一……你尝试过在开启飞行模式的带有数据套餐的手机上连接吗?然后会发生什么? - Dummy Code
现在,如果我打开飞行模式,它会显示未连接。这很好。但是我说的是某些地区普遍存在的没有数据的情况。当用户没有连接时,体验不好,它只会显示加载了一些内容,但在5分钟后什么也没有加载,这会让他们失望。我不知道3G和运营商是如何工作的,也许运营商只限制没有购买数据计划的人所允许的带宽量,因此可以检测到连接,但不足以做其他任何事情? - Shawn Frank
@ShawnFrank 你找到问题的答案了吗? - Harish Pathak
2个回答

2

经过几天的研究,我找到了一个对我有用的解决方案,希望将来其他人也能从中受益。

我创建了一个单例类,其中包含上述可达性代码,以便我可以轻松地在进行网络调用时使用它并检查它。虽然这并没有解决我的问题,正如我之前提到的那样,但这是第一次检查。

然后,我继续按照常规步骤从URL获取数据。

NSdata * data [NSData dataWithContentsOfURL:myurlhere];
if([data length] == 0)
{
    show alert view here
}
else
{
    doing stuff with the items in data
}

因此,结合可达性(在某些情况下,如使用3g或4g的蜂窝网络,这并不总是有效)和检查所下载的数据可以作为应用程序的良好检查点。


在浪费了无数个小时揪着头发之后,我发现当我的手机连接到一个无法联网的WiFi AP时,苹果原生的Reachability检测出“有网络连接”,所以我也选择了这种(表面上的)蛮力解决方案。你可能认为这是杀鸡焉用牛刀,但如果你在自己的服务器上创建一个URL,那就是完全的幸福和100%的稳定。 - Isaac

2
首先,在设置中检查您的应用程序的移动数据权限。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接