Objective-C报”NSURLErrorInternationalRoamingOff”异常的原因和解决办法

  • Post category:IOS

NSURLErrorInternationalRoamingOff异常表示设备处于飞行模式或国际漫游关闭状态,无法连接网络。在使用NSURLConnectionNSURLSession等网络请求功能时,可能会遇到此异常。以下是可能引起该异常的两种情况及其解决方法。

情况一:设备处于飞行模式

如果设备处于飞行模式,无法连接无线网络,就会出现NSURLErrorInternationalRoamingOff异常。可以通过检查设备的wifi和蜂窝数据是否开启来确定是否处于飞行模式。

解决办法如下:

1.检查设备是否处于飞行模式,如果是,则打开无线网络或退出飞行模式。

// 检查是否处于飞行模式
BOOL flightMode = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
// 如果是,则提示用户关闭飞行模式或打开无线网络
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"无法连接网络" message:@"当前处于飞行模式,请打开无线网络或退出飞行模式。" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:alertAction];
[self presentViewController:alertController animated:YES completion:nil];

2.使用SCNetworkReachability类检查设备是否联网

// 初始化网络连接监控器
SCNetworkReachabilityRef reachRef = SCNetworkReachabilityCreateWithName(NULL, "www.baidu.com");
SCNetworkReachabilityFlags flags;
// 获取当前网络状态
SCNetworkReachabilityGetFlags(reachRef, &flags);
// 判断网络状态,如果没有联网,则提示用户
if((flags & kSCNetworkFlagsReachable) == 0) {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"无法连接网络" message:@"请检查您的网络连接。" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
    [alertController addAction:alertAction];
    [self presentViewController:alertController animated:YES completion:nil];
}
CFRelease(reachRef);

情况二:国际漫游关闭状态

如果设备位于国际漫游已关闭的地方,则会发生此异常。在这种情况下,可以启用国际漫游或等到设备到达网络覆盖范围。

解决办法如下:

1.启用国际漫游

// 启用国际漫游
Class ctaClass = NSClassFromString(@"CTTelephonyNetworkInfo");
SEL selector = NSSelectorFromString(@"defaultTelephonyNetworkInfo");
id ctaInstance = [ctaClass performSelector:selector];
if ([ctaInstance respondsToSelector:@selector(setAllowsInternationalRoaming:)]) {
    [ctaInstance setAllowsInternationalRoaming:YES];
}

2.等待设备到达网络覆盖范围

// 监测网络状态的变化
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

Reachability *internetReachability = [Reachability reachabilityForInternetConnection];
[internetReachability startNotifier];

- (void)checkNetworkStatus:(NSNotification *)notification {
    Reachability *reachability = (Reachability *)notification.object;
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    if (networkStatus == NotReachable) {
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"无法连接网络" message:@"请检查您的网络连接。" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
        [alertController addAction:alertAction];
        [self presentViewController:alertController animated:YES completion:nil];
    } else {
        // 等待设备到达网络覆盖范围
    }
}