【问题标题】:Possible bug in CFNetDiagnosticCopyNetworkStatusPassively? Returning kCFNetDiagnosticConnectionDown over 3G/4G only.CFNetDiagnosticCopyNetworkStatusPassively 中可能存在的错误?仅通过 3G/4G 返回 kCFNetDiagnosticConnectionDown。
【发布时间】:2012-10-04 16:16:35
【问题描述】:

这里有一个奇怪的错误。这仅在 iOS 设备专门用于 3G/4G 网络时才会出现。即如果通过 WiFi - 没有错误,一切正常。

- ( BOOL ) isInternetAccessAvailable
{
    CFNetDiagnosticRef diag;

    diag = CFNetDiagnosticCreateWithURL ( NULL, ( __bridge  CFURLRef )[NSURL URLWithString:@"www.apple.com"] );

    CFNetDiagnosticStatus status;

    status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL );

    CFRelease ( diag );

    if ( status == kCFNetDiagnosticConnectionUp )
    {
        return YES;
    }
    else
    {
        NSString * title   = @"No Internet Connection";
        NSString * message = @"Please ensure you have an Internet Connection.";

        [self showAlertWithTitle:title andMessage:message];

        return NO;
    }
}

好的,所以我在尝试将数据加载到 UIWebView 之前调用了上述方法。

正如我所说 - 通过 WiFi 网络,这非常有效。

如果 WiFi 已关闭(或不可用/未连接)并且设备正在使用 SIM 卡进行 3G/4G 网络。

调用所在的行:

status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL );

返回一个 long 等价于:

kCFNetDiagnosticConnectionDown

因此我的测试失败,我向用户显示警告 UIAlertView。

但是网络在那里!如果我把测试线改成这样:

if ( ( status == kCFNetDiagnosticConnectionUp ) || ( status == kCFNetDiagnosticConnectionDown ) )

它通过 3G/4G 运行并下载网页 - 因此设备或网络没有故障。

但对 CFNetDiagnosticCopyNetworkStatusPassively 的调用仅在 3G/4G 上失败。

有什么想法吗?

刚刚在我最近加快进入 App Store 的应用中发现了这个问题,以满足广告和商品销售的最后期限,如果我的代码有问题 - 我需要尽快修复并重新提交。

【问题讨论】:

    标签: ios 3g internet-connection cfnetworking


    【解决方案1】:

    Apple 确认的错误。

    如果你愿意,可以复制:错误 ID# 12443370

    【讨论】:

    • 在哪里可以找到苹果确认的错误?
    • 当然希望这里有指向错误的链接和/或指向“欺骗”的链接
    • 据我了解,Apple 仍未修复此错误。我尝试使用 CFNetDiagnosticDiagnoseProblemInteractively 而不是 CFNetDiagnosticCopyNetworkStatusPassively,但状态为 kCFNetDiagnosticErr!
    【解决方案2】:

    您可以使用它来检查连接

    How to check for an active Internet connection on iOS or OSX?.

    cannyboyn 同步版本的答案: 以https://github.com/tonymillion/Reachability 中的Reachability.h 和Reachability.m

    #import "Reachability.h"
    
    - (BOOL)connected 
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];  
        NetworkStatus networkStatus = [reachability currentReachabilityStatus]; 
        return !(networkStatus == NotReachable);
    }
    

    【讨论】:

    • 这不是重点 - 可达性是进行此检查的一种方法。关键是上面的代码完全有效,并且适用于所有 iOS 版本(APART FROM 6.0)。这已通过 Apple 验证并按照他们的要求记录为错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多