我现在用的Reachability
从苹果类,以确定数据是否或无线网络连接。 然而,用户(与美国iPhone)正在测试在其他国家的应用程序,他看到下面的错误,而试图访问MapKit。
安慰
在我对这个错误的研究,我发现, PBRequester
是ProtocolBuffer。
2012年10月15日21:16:00.921 WrightsCS应用[24239:907] PBRequester失败,错误错误域= kCFErrorDomainCFNetwork代码= -1018 “国际漫游目前为关闭”。 的UserInfo = 0x1e5587d0 {NSErrorFailingURLKey = HTTPS://gsp13-cn.ls.apple.com/shift,NSErrorFailingURLStringKey = HTTPS://gsp13-cn.ls.apple.com/shift,NSLocalizedDescription =国际漫游目前为关闭。}
例
-(BOOL)hasDataConnection
{
Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
if ( networkStatus == NotReachable )
{
return NO;
}
else
{
if ( ! [Reachability reachabilityWithHostName:@"www.google.com"] )
return NO;
return YES;
}
}
题
我们如何可以检测用户是否漫游,或者至少确保我们不会遇到这个错误,如果是偶然的用户漫游?
OK - 这不是一个答案,但可能你指出正确的方向。 首先,我无法找到一个目标C类,似乎让你这样做(如NSURLRequest
类)。
我想你会需要直接去CFNetwork框架(CFNetwork框架参考) ,因为在看CFNetworkError码具有这些诱人的条目(符合你的错误信息,):
kCFURLErrorNotConnectedToInternet = -1009,
kCFURLErrorInternationalRoamingOff = -1018,
kCFURLErrorDataNotAllowed = -1020,
不幸的是,我不知道CFNetwork框架,尽管看着苹果的文档,我没有关于这CFNetwork框架API的使用这些值更聪明。 但我相信会有办法。
我的两个“点子”(我用这个词松散):
- 使用
CFHost
(并得到一个回调来查询错误代码) - 使用
CFNetDiagnosticCopyNetworkStatusPassively
(并解析返回的字符串)。
我希望能看到真正的答案,如果有一个专家在那里。
您可以像使用第三方服务http://ipinfo.io (我自己的服务),以找出基于设备的IP地址,甚至运营商代码当前的国家。 然后,您可以比较,为CTCarrier
细节,以确定设备是否处于漫游状态。 这里的ipinfo.io API响应标准:
$ curl ipinfo.io/24.32.148.1
{
"ip": "24.32.148.1",
"hostname": "doc-24-32-148-1.pecos.tx.cebridge.net",
"city": "Pecos",
"region": "Texas",
"country": "US",
"loc": "31.3086,-103.5892",
"org": "AS7018 AT&T Services, Inc.",
"postal": "79772"
}
定制包现已推出,还包括移动IP地址的MNC / MCC细节虽然。 见http://ipinfo.io/developers了解详情。
苹果居然建议您不要使用可达性,如果你能避免它,只是拨打电话并检查结果。 通话之前,您可以设置allowsCellularAccess为NO,以避免昂贵的3G连接。
显然,你会得到错误。 在特殊情况下的3G是可能的,但不允许,也没有无线网络,你kCFURLErrorDataNotAllowed。 然后,您可能会问用户是否想要让你3G连接。
否则,你会得到kCFURLErrorNotConnectedToInternet如果没有互联网连接,并在特殊情况下会出现一个3G连接,但数据漫游是不允许的(如在另一个国家美国的电话),您得到kCFURLErrorInternationalRoamingOff。 还有kCFURLErrorCallIsActive,你会得到无法在通话使用3G,而在手机上。
我这样做是为了检查漫游(它不是一个100%,充分证明,但..):
1.首先,当用户加载首次应用不断节省运营商网络为用户默认设置:
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [netinfo subscriberCellularProvider];
NSString *name = [[carrier carrierName] copy];
NSLog(@"Carrier Name: %@", name);
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
self.homeNetwork = [standardUserDefaults objectForKey:SNAP_homeNetwork];
if(self.homeNetwork == nil || self.homeNetwork.length == 0){
self.homeNetwork = [[Globals sharedInstance] getCarrier];
[standardUserDefaults setObject:self.homeNetwork forKey:SNAP_homeNetwork];
[standardUserDefaults synchronize];
}
- 每当你需要检查currentCarrier Vs的保存上最早推出的应用程序的一个,如果名称不同,那么用户漫游。