我是一名新的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不能正常使用所有设备。
答案 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 answer或Apples sample如何操作。
答案 3 :(得分:0)
Apple推荐的查看设备是否在线的方法是使用Reachability
课程 - 请参阅此处的示例代码:http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html