4

我正在开发一个 iPhone 应用程序,每当我调用我的网络服务时,我都想确保用户已连接到互联网。

我在 github 上使用了 Tony Million 提供的 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 并运行应用程序,完美,网络服务被调用。这里没什么好担心的。
  • 我断开手机与 wifi 的连接并再次运行应用程序,我希望出现警报,告诉我它未连接,但随后我看到 UI 活动指示器在我的应用程序中旋转,这意味着应用程序检测到某种连接并且正在尝试连接到我的网络服务。但这永远不会发生,我知道它正在检测蜂窝 3g,因为我进入设置->常规->使用->蜂窝使用,将统计信息重置为 0。过了一会儿,我可以看到正在发送和接收的数据。
  • 我去设置->常规->蜂窝->关闭3g,运行应用程序,现在它显示没有连接的警报。

我知道很多人都有数据包,而且我看到应用程序以我上面提到的可达性水平进入市场,我只是觉得在我刚才解释的场景中可以改进。

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

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

被ping通,或者不是?

虽然我确实关闭了我的 wifi 并打开了 safari,但它的行为方式相同,它表明它加载了一段时间,然后只是说 safari 无法打开......

这只是无法完成的事情吗?

最后,我什至看到了 github 页面上提供的示例 Tony Million,当在我的手机上运行时,尽管 wifi 已关闭且我没有数据包,但它显示可访问。

我查看了一些堆栈溢出答案,用户询问是否检查互联网连接,但大多数答案都围绕“类型”wifi、wwan 等,而不是检测它是否是有效的互联网连接而不是连接到网络。

感谢您的时间。

4

2 回答 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)和检查下载的数据可以作为应用程序的一个很好的检查点。

于 2013-07-29T21:44:04.117 回答
2

首先,您需要在设置中检查您的应用程序的蜂窝数据权限。

在此处输入图像描述

于 2017-01-24T06:52:57.910 回答