60

如何检测手机是否处于飞行模式?(仅仅检测到没有网络连接是不够的,我必须能够区分这两种情况)

4

5 回答 5

19

尝试使用SCNetworkReachabilityGetFlags(SystemConfiguration 框架)。如果返回的 flags 变量为 0,返回值为 YES,则开启飞行模式。

查看 Apple 的可达性类

于 2011-01-26T12:21:36.560 回答
5

您可以在 Info.plist 中添加设置为 true 的 SBUsesNetwork 布尔标志,以在飞行模式下显示 Mail 中使用的弹出窗口。

于 2011-01-26T23:26:42.863 回答
3

由于 iOS 12 和网络框架,它可以通过某种方式检测飞行模式是否处于活动状态。

import Network

let monitor = NWPathMonitor()

monitor.pathUpdateHandler = { path in
    if path.availableInterfaces.count == 0 { print("Flight mode") }
    print(path.availableInterfaces)
}

let queue = DispatchQueue.global(qos: .background)
monitor.start(queue: queue)

path.availableInterfaces正在返回一个数组。例如[en0, pdp_ip0]. 如果没有可用的接口可能是在飞行模式。

警告 如果飞行模式和 wifi 处于活动状态,则不path.availableInterfaces为空,因为它正在返回[en0]

于 2019-03-24T13:31:05.360 回答
2

对于越狱的调整/应用程序:

@interface SBTelephonyManager : NSObject
+(id)sharedTelephonyManager;
-(BOOL)isInAirplaneMode;
@end

...

bool isInAirplaneMode = [[%c(SBTelephonyManager) sharedTelephonyManager] isInAirplaneMode];
于 2017-06-08T06:14:24.937 回答
1

如果不使用私有库,我们无法获得这些信息。这是一些代码,但当载波信号不可用时它将不起作用。

UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];

NSString *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) {
            dataNetworkItemView = subview;
            break;
     }
}
double signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue];
 if (signalStrength > 0) {
        NSLog(@"Airplane mode or NO signal");
  }
  else{
        NSLog(@"signal available");
  }
于 2016-11-29T11:21:01.773 回答