2011-01-26 59 views
49

如何檢測手機是否處於飛行模式? (這是不夠的,沒有檢測到互聯網連接,我必須能夠區分這兩種情況)在iOS上檢測飛行模式

+6

你能解釋一下爲什麼** **你需要區分這兩種情況?如果用戶由於覆蓋或由於飛行模式沒有連接而沒有連接,會有什麼不同? – Jasarien 2011-01-26 12:17:46

+12

因爲我們可以在其他移動平臺上區分這一點,我們希望儘可能在平臺上擁有相同的功能。我們根據此顯示不同的狀態消息,並嘗試引導用戶糾正問題。 – Caner 2011-01-26 13:11:37

+7

我知道這是一個古老的問題,但只是爲了澄清這種「非常狹窄的情況」的需要:當iPhone處於飛行模式時,GPS位置非常不可靠,但不會導致錯誤。我訂閱了GPS事件,並讓我的應用程序運行了2個小時。沒有錯誤,沒有GPS位置,並且'可以接收位置事件'的所有檢查返回YES。然而,手動禁用3g和wifi手機給了我內部「可以接收位置」檢查的NO。與普通的可達性檢查相比,顯然需要明確檢測飛行模式。 – Owen 2012-09-07 09:41:16

回答

18

嘗試使用SCNetworkReachabilityGetFlags(SystemConfiguration框架)。如果返回的flags變量爲0並且返回值爲YES,則打開飛行模式。

看看蘋果的Reachability classes

5

您可以在Info.plist中添加設置爲true的SBUsesNetwork布爾標誌以顯示在飛行模式下使用的郵件彈出窗口。

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

對於越獄的調整/應用:

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

... 

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