Internet检查不适用于所有设备ios应用程序

时间:2012-01-22 19:18:35

标签: iphone xcode reachability

我是一名新的iPhone开发者。我创建了一个iOS应用程序,我检查了互联网可用性检查。

我使用了以下方法:

-(BOOL)connectedToInternet
{
   NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]
                                                  encoding:NSStringEncoding
                                                     error:nil];
   return ( URLString != NULL ) ? YES : NO;
}

applicationDidFinishLaunching中我调用了方法,如果没有连接则显示警告,否则进入第二个屏幕。

我已经在iPhone(iOS 4.3.1)和iPad(iOS 4.3.3)中下载了应用程序。它成功地运作了。

但是我的客户说他在他的iPhone(iOS 4.3.5)上下载并且它始终显示“没有互联网连接”警告。

我搜索了几个网站,以找到问题和永久解决方案。但我没有发现我的错是什么以及为什么app不能正常使用所有设备。

4 个答案:

答案 0 :(得分:4)

首先,这是检查连接性的不好方法。请改为查看Apple的Reachability示例代码。

其次,你这样做了:

NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"] encoding:NSStringEncoding   error:nil];

停止传递nil作为错误参数。

NSError *error;
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"] encoding:NSStringEncoding error:&error];

如果URLString返回nil,请将error置于提醒状态。

答案 1 :(得分:1)

个人而言,我使用以下技术来测试互联网可用性(无论是WiFi还是3G)。我为它添加了一个特殊的类(在我的例子中,我将其称为WiFiCheckClass),并在.h文件中添加:

#import <Foundation/Foundation.h>
#import "SystemConfiguration/SCNetworkReachability.h"

@interface UIDevice (DeviceConnectivity)
+(BOOL) cellularConnected;
+(BOOL) wiFiConnected;
+(BOOL) networkConnected;
@end

在.m文件中我做了:

#import "WiFiCheckClass.h"

@implementation UIDevice (DeviceConnectivity)

+(BOOL) cellularConnected
{
    SCNetworkReachabilityFlags  flags = 0;
    SCNetworkReachabilityRef netReachability;
    netReachability = SCNetworkReachabilityCreateWithName(CFAllocatorGetDefault(), [@"www.google.com" UTF8String]);
    if(netReachability)
    {
        SCNetworkReachabilityGetFlags(netReachability, &flags);
        CFRelease(netReachability);
    }
    if(flags & kSCNetworkReachabilityFlagsIsWWAN) return YES;
    return NO;
}

+(BOOL) networkConnected
{
    SCNetworkReachabilityFlags flags = 0;
    SCNetworkReachabilityRef netReachability;
    BOOL  retrievedFlags = NO;
    netReachability = SCNetworkReachabilityCreateWithName(CFAllocatorGetDefault(), [@"www.google.com" UTF8String]);
    if(netReachability)
    {
        retrievedFlags  = SCNetworkReachabilityGetFlags(netReachability, &flags);
        CFRelease(netReachability);
    }
    if (!retrievedFlags || !flags) return NO;
    return YES;
}

+(BOOL) wiFiConnected
{
    if ([self cellularConnected]) return NO;
    return [self networkConnected];
}

@end

现在,每当我需要知道是否有Internet连接时,我都会导入库并执行以下测试:

if([UIDevice cellularConnected] || [UIDevice networkConnected] || [UIDevice wiFiConnected])
{
    //there is Internet, do what you want
}

答案 2 :(得分:0)

您可能希望使用可访问性API将该方法更改为在IOS上检测Internet可用性的“正确”方法。

请查看示例this SO answerApples sample如何操作。

答案 3 :(得分:0)

Apple推荐的查看设备是否在线的方法是使用Reachability课程 - 请参阅此处的示例代码:http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html