判断iPhone是否可以上网的最简单方法是什么?

12

我希望确定 iPhone 是否有可用的互联网连接。对于应用程序而言,无论是 WiFi、EDGE 还是其他类型的连接都没关系。

使用 SeismicXML 示例中的代码似乎不起作用,而 Apple 的 Reachability 示例代码则似乎对应用程序来说过于复杂了...

有没有快速简便的方法来确定 iPhone 的网络连接是否可用呢?

谢谢, Ben


逐步解决方案查看答案:https://dev59.com/IV3Ua4cB1Zd3GeqP9yYn#25498693 - MD SHAHIDUL ISLAM
6个回答

24

按照以下3个简单步骤进行操作 -

第一步: 将“SystemConfiguration.framework”框架包含在您的项目中

第二步: 从Reachability示例中包含苹果公司的Reachability.h和Reachability.m文件

第三步: 将以下代码添加到您的.m文件中的任何位置。

Reachability* wifiReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
NetworkStatus netStatus = [wifiReach currentReachabilityStatus];

switch (netStatus)
{
    case NotReachable:
    {
        NSLog(@"Access Not Available");
        break;
    }

    case ReachableViaWWAN:
    {
        NSLog(@"Reachable WWAN");
        break;
    }
    case ReachableViaWiFi:
    {
        NSLog(@"Reachable WiFi");
        break;
    }
}

5
除了可达性(Reachability)外,提供了不同目的的不同方法:使用reachabilityWithHostName:@"your.hostname"来检查是否可以访问自己的服务器。使用reachabilityForInternetConnection来检查是否有互联网连接;后者似乎更接近于这里的原始问题。我不会检查第三方服务器,例如Apple.com - 那是一种hack行为。 - n13

9
我在我的应用程序中包含了苹果的Reachability.h和.m文件,这些文件来自于他们的Reachability示例,还有上面提到的SystemConfiguration框架,然后我添加了以下代码。这个方法比上面的答案有两个优点:它可以给你更多的信息,并且可以异步通知网络状态的变化。
在你的应用程序代理或类似的地方,在启动时添加以下代码:
[self startReachability];

然后添加以下方法,在网络变化时调用:

#pragma mark Reachability changed
- (void)reachabilityChanged:(NSNotification*)aNote
{
self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];

switch (self.remoteHostStatus)
{
case NotReachable:
  debugForComponent(kDebugMaskApp,@"Status changed - host not reachable");
  break;

case ReachableViaCarrierDataNetwork:
  debugForComponent(kDebugMaskApp,@"Status changed - host reachable via carrier");
  break;

case ReachableViaWiFiNetwork:
  debugForComponent(kDebugMaskApp,@"Status changed - host reachable via wifi");     
  break;

default:
  debugForComponent(kDebugMaskApp,@"Status changed - some new network status");
  break;
}
}

5
[self startReachability] 这个方法定义在哪里?这个方法的定义在代码中未被提供,因此无法确定其准确位置。 - Nicu Surdu

7

我曾经在尝试复制SystemConfiguration.framework时,不小心弄坏了XCode,但后来我找到了解决方法。以下是解决方案,供需要的人参考:

将SystemConfiguration.framework添加到你的项目中,在代码中添加 #import <SystemConfiguration/SystemConfiguration.h>,然后加入以下代码:

SCNetworkReachabilityFlags flags;
BOOL receivedFlags;

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(CFAllocatorGetDefault(), [@"google.com" UTF8String]);
receivedFlags = SCNetworkReachabilityGetFlags(reachability, &flags);
CFRelease(reachability);

if (!receivedFlags || (flags == 0) )
{
    // internet not available
} else {
    // internet available
} 

希望这能对某些人有所帮助...看起来这是一个被应用程序拒绝的常见方式...

你需要小心假设flags == 0意味着你的应用程序可以使用的连接。如果你查看SCNetworkConnectionFlags的可能值,不是所有的值都意味着“立即可用的互联网访问”。(http://developer.apple.com/documentation/Networking/Reference/SysConfig/SCNetwork/CompositePage.html#//apple_ref/c/tag/SCNetworkConnectionFlags)苹果的Reachability示例更加准确。 - lfalin


1
这是您问题的最快和最简单的解决方案:
([NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]!=NULL)?YES:NO; 

如果连接成功,它将返回YES,否则返回NO。它只是尝试加载谷歌,如果成功就返回YES

然后你可以使用返回值的if语句,这样你就可以弹出通知或者其他你喜欢的东西。


stringWithContentsOfURL已经被弃用,所以现在不起作用了。 - badweasel

0

我的第一个想法是看看能否连接到谷歌。


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