2011-01-26 5 views
49

Как определить, находится ли телефон в режиме полета? (Недостаточно обнаружить, что нет подключения к интернету, я должен уметь отличать эти 2 случая)Обнаружение режима самолета на iOS

+6

ли вы объяснить, почему ** ** Вы должны различать эти два случая? Какая разница, если у пользователя нет связи из-за покрытия или отсутствия соединения из-за режима самолета? – Jasarien

+12

Becuase мы можем отличить это на других мобильных платформах, и мы хотели бы как можно больше использовать те же функции на платформах. В зависимости от этого мы показываем разные сообщения о статусе, и мы пытаемся помочь пользователю исправить проблему. – Caner

+7

Я знаю, что это старый вопрос, но для того, чтобы уточнить необходимость этой «чрезвычайно узкой ситуации»: когда iPhone находится в режиме самолета, места GPS крайне ненадежны, но не вызывают ошибок. Я подписался на события GPS и оставил приложение в течение 2 часов. Никаких ошибок, никаких местоположений gps и всех проверок для возврата событий «может получать данные о местоположении» ДА. Однако отключение 3g и wifi вручную дало мне НЕТ для внутренних проверок «можно получить местоположение». Определенно необходимо четко определить режим полета самолета, а не общую проверку достижимости. – Owen

ответ

18

Попробуйте использовать SCNetworkReachabilityGetFlags (SystemConfiguration framework). Если возвращаемая переменная флагов равна 0, а возвращаемое значение равно YES, режим самолета включается.

Отъезд Apple's Reachability classes.

+5

Привет, возвращаемое значение ДА, и я получаю нуль в обеих этих ситуациях: 1) Wi-Fi отключен от настроек, и в телефоне нет SIM-карты. 2) Режим полета. Так что, к сожалению, ваше предложение не решает мою проблему. – Caner

+0

не достижимый статус в обеих ситуациях? хорошо, статус bluetooth может отличаться. – Felix

5

Вы можете добавить флаг буфера SBUsesNetwork, установленный в ваш Info.plist, чтобы отображать всплывающее окно, используемое в Mail, когда он находится в режиме полета.

+12

ЗА ИСКЛЮЧЕНИЕМ, что это недокументировано и может нарушиться в будущей версии iOS. –

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];