2

我正在构建一个只有在激活飞行模式时才应该使用的应用程序。该应用程序至少可以说是为不精通技术的人准备的。因此,我不能指望他们向上滑动并单击飞机图标。在我的应用程序中简单地打开飞行模式表单最接近的方法是什么?

基本上,我正在寻找 UIRequiresPersistentWifi 的反面。

4

3 回答 3

3

目前没有用于直接检查飞行模式是否开启的公共 API。

最接近的解决方案是使用SystemConfiguration框架并监控设备是否可以连接到网络。

使用Reachability 类(通过 tonymillion),您可以执行类似的操作

Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
reach.reachableBlock = ^(Reachability*reach) {
    // do something to prevent the app to be used
    // NOTE: this block is called on a background thread
    // so if you need to change the UI, do 
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI related stuff
    });
};
reach.unreachableBlock = ^(Reachability*reach) {
    // ok continue using the app
};
[reach startNotifier];
于 2013-10-23T19:13:44.370 回答
1

好吧,我可以给你一个更容易和更快的技术。在询问用户之前运行此答案getIPaddresses中的方法,并保存信息(或至少保存计数)。您应该看到如下内容:

"awdl0/ipv6" = "0:0:fe80::6456:66ff";
"en0/ipv4" = "192.168.1.4";
"en0/ipv6" = "0:0:fe80::4e5:772f";
"lo0/ipv4" = "127.0.0.1";
"lo0/ipv6" = "0:0:fe80::";
"pdp_ip0/ipv4" = "10.226.14.199";

这些都是活动的 IP 地址。现在让他们打开飞行模式。当他们点击是时,再次运行该代码,返回的字典应该为零。如果不是,和以前一样,他们就撒谎了!

我确实查看了飞行模式是否会关闭接口(interface->ifa_flags & IFF_UP)但它不会,并且两个环回地址始终处于活动状态。

于 2013-10-23T19:44:17.783 回答
0

你可以做得比让用户教你飞行模式是什么样子更好,pdp_接口是蜂窝接口,所以如果它们不存在,那么手机要么处于飞行模式,要么一开始就没有蜂窝。这对我的目的来说已经足够了,至少。

这是我的代码在 Xamarin 中的样子:

        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            if ((OperationalStatus.Up == ni.OperationalStatus) && (ni.Description.StartsWith("pdp_")))
                return false;
        }
        return true;
于 2016-12-01T19:13:08.193 回答