スマートフォンが機内モードかどうかをどのように検出できますか? (インターネット接続がないことを検出するには十分ではありません。これら2つのケースを区別できる必要があります)
SCNetworkReachabilityGetFlags
(SystemConfigurationフレームワーク)を使用してみてください。渡されたフラグ変数が0で、戻り値がYESの場合、機内モードがオンになります。
Appleの 到達可能性クラス を確認してください。
Info.plistでSBUsesNetworkブールフラグをtrueに設定して追加すると、飛行機モードのときにメールで使用されるポップアップを表示できます。
ジェイルブレイクされた微調整/アプリの場合:
@interface SBTelephonyManager : NSObject
+(id)sharedTelephonyManager;
-(BOOL)isInAirplaneMode;
@end
...
bool isInAirplaneMode = [[%c(SBTelephonyManager) sharedTelephonyManager] isInAirplaneMode];
プライベートライブラリを使用せずにこの情報を取得することはできません。ここにいくつかのコードがありますが、キャリア信号が利用できない場合は機能しません。
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");
}
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]
です。インターフェースが利用できない場合は、おそらくフライトモードです。
[〜#〜] warning [〜#〜]機内モードでwifiがアクティブな場合、path.availableInterfaces
は[en0]
を返すため、空ではありません