可达性和国际漫游(Reachability and International Roaming)

2019-09-24 05:38发布

我现在用的Reachability从苹果类,以确定数据是否或无线网络连接。 然而,用户(与美国iPhone)正在测试在其他国家的应用程序,他看到下面的错误,而试图访问MapKit。

安慰

在我对这个错误的研究,我发现, PBRequesterProtocolBuffer。

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;
    }
}

我们如何可以检测用户是否漫游,或者至少确保我们不会遇到这个错误,如果是偶然的用户漫游?

Answer 1:

OK - 这不是一个答案,但可能你指出正确的方向。 首先,我无法找到一个目标C类,似乎让你这样做(如NSURLRequest类)。

我想你会需要直接去CFNetwork框架(CFNetwork框架参考) ,因为在看CFNetworkError码具有这些诱人的条目(符合你的错误信息,):

kCFURLErrorNotConnectedToInternet  = -1009,
kCFURLErrorInternationalRoamingOff = -1018,
kCFURLErrorDataNotAllowed          = -1020,

不幸的是,我不知道CFNetwork框架,尽管看着苹果的文档,我没有关于这CFNetwork框架API的使用这些值更聪明。 但我相信会有办法。

我的两个“点子”(我用这个词松散):

  1. 使用CFHost (并得到一个回调来查询错误代码)
  2. 使用CFNetDiagnosticCopyNetworkStatusPassively (并解析返回的字符串)。

我希望能看到真正的答案,如果有一个专家在那里。



Answer 2:

您可以像使用第三方服务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了解详情。



Answer 3:

苹果居然建议您不要使用可达性,如果你能避免它,只是拨打电话并检查结果。 通话之前,您可以设置allowsCellularAccess为NO,以避免昂贵的3G连接。

显然,你会得到错误。 在特殊情况下的3G是可能的,但不允许,也没有无线网络,你kCFURLErrorDataNotAllowed。 然后,您可能会问用户是否想要让你3G连接。

否则,你会得到kCFURLErrorNotConnectedToInternet如果没有互联网连接,并在特殊情况下会出现一个3G连接,但数据漫游是不允许的(如在另一个国家美国的电话),您得到kCFURLErrorInternationalRoamingOff。 还有kCFURLErrorCallIsActive,你会得到无法在通话使用3G,而在手机上。



Answer 4:

我这样做是为了检查漫游(它不是一个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];
}
  1. 每当你需要检查currentCarrier Vs的保存上最早推出的应用程序的一个,如果名称不同,那么用户漫游。


文章来源: Reachability and International Roaming