确定iPhone是真正连接到互联网还是仅限于受限制的热点

Val*_*ier 6 network-programming objective-c internet-connection ios

我在严格识别iPhone的网络访问类型方面遇到了很多麻烦.我在StackOverflow上看过很多像这样的问题,但没有一个对我有帮助.例如,我已经看到过:如何检查iOS或OSX上的活动Internet连接?

但我想确切地知道以下3个案例何时发生:

  1. Wifi 3G被禁用

  2. 启用了Wifi 3G,但没有互联网连接.这可能是由于3G没有真正起作用,即使它出现在状态栏上,或者WiFi是一个热点,要求在让您访问互联网或最后一个场景之前登录:WiFi源是本地网络但是不提供任何Internet连接.

  3. 一切正常

当然我尝试过各种各样的东西,例如:

// Allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];

// Set the blocks
reach.reachableBlock = ^(Reachability*reach)
{
    /* NOT REACHABLE */
    dispatch_async(dispatch_get_main_queue(), ^{
        iarcSBInternetWarning.visible = NO;
    });
};

reach.unreachableBlock = ^(Reachability*reach)
{
    /* REACHABLE */
    iarcSBInternetWarning.visible = YES;
};

// Start the notifier, which will cause the reachability object to retain itself
[reach startNotifier];
Run Code Online (Sandbox Code Playgroud)

但这似乎只是说Wifi或3G是启用的,并没有检查可能的互联网限制.对于帮助我确定三种情景的任何答案,我都会非常高兴.

当然,从返回特定字节序列的个人服务器API分析直接HTTP请求输出可以工作,但这不是我想要做的.我更喜欢使用任何类型的Reachability API.

我使用过Apple的可访问性API,它似乎无法识别热点重定向.

如果使用Reachability API无法做到这一点,那么向服务器发出简单请求的最低资源消耗方法是什么,检查它是否在指定的超时之前是可达的,并且URL未被重定向到热点登录页面(可能只检查标题,而不是整个服务器字节序列输出)?每15秒运行一次这样的脚本是一个好主意,还是会使用过多的电池和/或网络数据?

che*_*bob 4

检查出站连接的最简单方法是获取 Google 的generate204 页面并检查响应代码

http://www.google.com/generate_204

或者你可以使用

http://www.apple.com/library/test/success.html这是操作系统使用的页面