39

我找到了几个代码示例来做我想做的事情(检查可达性),但似乎没有一个足够精确,对我有用。我不明白为什么这不想玩得很好。

我的项目中有reachability.h/m,我正在做

#import <SystemConfiguration/SystemConfiguration.h>

我添加了框架。我也有:

#import "Reachability.h"

在我尝试使用可达性的 .m 顶部。

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"http://www.google.com"];    // set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if(remoteHostStatus == NotReachable) {NSLog(@"no");}
else if (remoteHostStatus == ReachableViaWiFiNetwork) {NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) {NSLog(@"cell"); }

这给了我各种各样的问题。我究竟做错了什么?我是一个很好的编码员,我只是很难弄清楚需要把什么放在哪里来启用我想做的事情,无论我是否想知道我想做什么。(好沮丧)

更新:这就是正在发生的事情。这是在我的视图控制器中,我有

#import <SystemConfiguration/SystemConfiguration.h>

#import "Reachability.h"

设置。到目前为止,这是我最不喜欢的编程部分。(来源:sneakyness.com可达性问题


FWIW,我们从来没有最终在我们的代码中实现这一点。需要互联网访问的两个功能(参加抽奖活动和购买 DVD)不是主要功能。没有其他需要互联网访问。

我们没有添加更多代码,而是将两个 Internet 视图的背景设置为通知用户他们必须连接到 Internet 才能使用此功能。它与应用程序界面的其余部分处于主题中,并且做得很好/有品位。他们在审批过程中只字未提,但我们确实接到了一个私人电话,以确认我们正在赠送与电影实际相关的物品。根据他们通常含糊不清的协议,否则不允许您进行抽奖活动。

我还认为这也更严格地遵循了他们的“仅在绝对需要时才使用它们”的理念。

这是应用程序 EvoScanner 的 iTunes 链接。

4

5 回答 5

65

从您的屏幕截图中,您似乎没有将可达性添加到您的项目中。您必须从 Apple 下载 Reachability:

https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

并将 .h 和 .m 文件添加到您的项目中。

更新:你注意到你有可达性。但是查看最新版本,我可以看到您列出错误的原因 - 它们更改了 API,您可能正在使用您在其他地方找到的示例代码。尝试:

在 .h 文件中:

//import Reachability class
#import "Reachability.h"

// declare Reachability, you no longer have a singleton but manage instances
Reachability* reachability;

在 .m 文件中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil];

reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

 if(remoteHostStatus == NotReachable) {NSLog(@"no");}
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); }

.....

- (void) handleNetworkChange:(NSNotification *)notice
{

  NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

   if(remoteHostStatus == NotReachable) {NSLog(@"no");}
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); }
}
于 2009-12-07T21:55:40.793 回答
29
[reachability setHostName:@"http://www.google.com"];

注意力!我遇到的问题是,如果使用 http:// 前缀,它总是“NotReachable”。

拉斐尔

于 2010-03-16T03:26:25.393 回答
7

这是正确的代码,因为它今天对我有用!!!

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange:) name: kReachabilityChangedNotification object: nil];

reachability = [Reachability reachabilityForInternetConnection];

[reachability startNotifier];

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if(remoteHostStatus == NotReachable) {NSLog(@"no");}
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); }
于 2010-08-15T10:39:02.813 回答
3

您在任何地方都有以下代码吗?

[reachability startNotifier];

如果您的可达性代码来自苹果的示例,那么您需要先执行此操作,然后它才能开始向您报告状态更新。

于 2009-12-07T17:59:12.740 回答
-3

改变这个

reachability = [Reachability reachabilityForInternetConnection];

对此

reachability = [[Reachability reachabilityForInternetConnection] retain];
于 2012-02-11T11:10:09.503 回答