web-dev-qa-db-ja.com

iOSで機内モードを検出する

スマートフォンが機内モードかどうかをどのように検出できますか? (インターネット接続がないことを検出するには十分ではありません。これら2つのケースを区別できる必要があります)

56
Caner

SCNetworkReachabilityGetFlags(SystemConfigurationフレームワーク)を使用してみてください。渡されたフラグ変数が0で、戻り値がYESの場合、機内モードがオンになります。

Appleの 到達可能性クラス を確認してください。

20
Felix

Info.plistでSBUsesNetworkブールフラグをtrueに設定して追加すると、飛行機モードのときにメールで使用されるポップアップを表示できます。

5
Zac White

ジェイルブレイクされた微調整/アプリの場合:

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

...

bool isInAirplaneMode = [[%c(SBTelephonyManager) sharedTelephonyManager] isInAirplaneMode];
2
Clawish

プライベートライブラリを使用せずにこの情報を取得することはできません。ここにいくつかのコードがありますが、キャリア信号が利用できない場合は機能しません。

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");
  }
1
Vikash Rajput

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]を返すため、空ではありません

0
BilalReffas