我正在构建一个只有在激活飞行模式时才应该使用的应用程序。该应用程序至少可以说是为不精通技术的人准备的。因此,我不能指望他们向上滑动并单击飞机图标。在我的应用程序中简单地打开飞行模式表单最接近的方法是什么?
基本上,我正在寻找 UIRequiresPersistentWifi 的反面。
目前没有用于直接检查飞行模式是否开启的公共 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];
好吧,我可以给你一个更容易和更快的技术。在询问用户之前运行此答案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
)但它不会,并且两个环回地址始终处于活动状态。
你可以做得比让用户教你飞行模式是什么样子更好,pdp_接口是蜂窝接口,所以如果它们不存在,那么手机要么处于飞行模式,要么一开始就没有蜂窝。这对我的目的来说已经足够了,至少。
这是我的代码在 Xamarin 中的样子:
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
if ((OperationalStatus.Up == ni.OperationalStatus) && (ni.Description.StartsWith("pdp_")))
return false;
}
return true;