【问题标题】:Reachability in iOSiOS 中的可达性
【发布时间】:2013-04-26 05:02:46
【问题描述】:

这是这个问题的副本。 SCNetworkReachabilityGetFlags returns 0 even when wireless available

我尝试了该帖子中提出的所有解决方案。但它们都不适合我。

    SCNetworkReachabilityRef  reachabilityRef = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);
    BOOL success = SCNetworkReachabilityGetFlags(reachabilityRef, &flags); //flags are always 0.
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);

    CFRelease(reachabilityRef);

    if(isAvailable)
    {
        NSLog(@"Host is reachable: %d", flags);
    }
    else
    {
        NSLog(@"Host is unreachable");
    }

我正在尝试通过 VPN 连接到主机。有人可以建议一种解决方法吗?

【问题讨论】:

  • 您是否收到错误代码?定义“不工作”。
  • 不工作意味着标志始终为0,并且后续条件失败。
  • 另外,您是否尝试过按照 Apple 的 Reachability 示例中所述设置通知(请参阅应用程序委托中的代码)?您是否收到过可达性状态更改的通知?
  • 我假设您的主机名只是主机名,而不是 IP 号,没有方案(例如“http://”),没有目录或端口号等,只是主机名?您是否记录了主机名?你说flags(不是isAvailable)是0success 是什么?那是零还是非零?如果为零,您是否检查过System Configuration Reference 中描述的错误代码?您是否在其他主机(包括 VPN 和非 VPN)上尝试过此操作?

标签: ios ios6


【解决方案1】:

我在运输应用中使用此 API 取得了巨大成功。首先,主机名必须类似于 www.apple.com。可达性需要一些时间来确定主机是否存在。

我在我的应用程序中采用的策略是在启动时假设它就在那里,并监控在许多(如 20)秒后启动的可达性通知。如果你不能等那么久,这里有其他关于此的帖子,其中包含处理该问题的策略,例如,尝试立即 ping 主机。

请注意,移动设备在发布时确定此状态存在许多障碍,并且没有完美的解决方案。

我所做的是假设它已启动,放置一个显示“正在连接...”的微调器,如果我后来遇到可达性失败,则将其删除(或在请求失败时将其删除)。从那时起,它似乎会定期更新(我过去常常通过隧道将我的应用程序带到火车上,当网络访问发生变化时,我可以看到它显示“断开连接”和“连接”状态。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多