【问题标题】:Easiest way to determine whether iPhone internet connection is available?确定 iPhone 互联网连接是否可用的最简单方法?
【发布时间】:2009-04-24 05:02:25
【问题描述】:

我正在确定 iPhone 上是否有可用的互联网连接。应用程序是 wifi 还是 EDGE 或其他什么都没有关系。

使用 SeismicXML 示例中的代码似乎不起作用,而来自 Apple 的 Reachability 示例代码似乎对应用程序来说太过分了......

有没有一种快速简便的方法来确定 iPhone 上的网络可用性?

谢谢, 本

【问题讨论】:

标签: iphone


【解决方案1】:

遵循以下 3 个简单的步骤 -

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

第 2 步:包含来自 Reachability 示例的 Apple 的 Reachability.h 和 Reachability.m

第 3 步:现在将此代码添加到 .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;
    }
}

【讨论】:

  • ^ 那个,除了 Reachability 为不同的目的提供了不同的方法: 使用reachabilityWithHostName:@"your.hostname" 来检查你是否可以到达你自己的服务器。使用reachabilityForInternetConnection 检查是否有网络连接;后者似乎更接近这里的原始问题。我不会检查第三方服务器,例如Apple.com - 这是一个 hack。
【解决方案2】:

我从他们的 Reachability 示例中包含了 Apple 的 Reachability.h 和 .m 以及上面提到的 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;
}
}

【讨论】:

  • [self startReachability] - 这个方法是在哪里定义的?
【解决方案3】:

我在尝试将 SystemConfiguration.framework 复制到中时破坏了 XCode 后想通了...这是任何可能感兴趣的人的解决方案...

将 SystemConfiguration.framework 添加到您的项目中,执行 #import ,然后添加以下代码:

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 的可能值,并非所有这些值都意味着“可以立即访问 Internet”。(developer.apple.com/documentation/Networking/Reference/…) Apple 的可达性示例要准确得多。
【解决方案4】:
【解决方案5】:

这是解决您的问题的最快和最简单的解决方案:

([NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]!=NULL)?YES:NO; 

如果已连接,它将返回 YES,如果未连接,则返回 NO。它只是尝试加载 google,如果成功则返回 YES

然后你可以有一个带有返回值的if 语句,这样你就可以抛出一个通知或任何你喜欢的东西。

【讨论】:

  • stringWithContentsOfURL 已弃用。所以现在不行了。
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2014-03-29
    • 2011-09-02
    相关资源
    最近更新 更多