Доступность авиарежима (3G) по сравнению с Wi-Fi

Я знаю, что код доступности предоставит, если у телефона есть доступ к сети Wi-Fi или 3G.

Однако, если на телефоне есть 3G и Wi-Fi, код доступности по умолчанию говорит о том, что на телефоне включен Wi-Fi, и я не могу определить, включена ли сеть 3G или нет (режим полета включен или выключен).

Мне нужно выяснить, включен или выключен режим 3G при включенном Wi-Fi.

Вот код:

Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus status = [reachability currentReachabilityStatus];

NSLog(@"status: %u", status);

if(status == NotReachable)  //status = 0
{
    //No internet
    NSLog(@"nothing is reachable");
}
if (status == ReachableViaWiFi) //status = 1
{
    //WiFi
    NSLog(@"Wifi is available");
}
if (status == ReachableViaWWAN) //status = 2
{
    //3G
    NSLog(@"3G is available");
}
NSLog(@"%@", s);

Обычно статус возвращается 1, даже если включен 3G и Wi-Fi.

Это возможно?

Помощь будет очень признательна.


person C0D3    schedule 26.10.2012    source источник
comment
Если у телефона есть доступ к 3G и Wi-Fi, он всегда будет подключаться к сети Wi-Fi, а не выбирать 3G, поэтому обнаруживать этот факт может не иметь смысла.   -  person    schedule 27.10.2012
comment
Я знаю, что вы говорите, однако, в моем случае, к сожалению, он должен определять, включен ли 3G для приложения, которое я разрабатываю.   -  person C0D3    schedule 27.10.2012
comment
проверьте эту ссылку, она может быть вам полезна stackoverflow.com/questions/11960813/   -  person Pushpa Raja    schedule 14.02.2014


Ответы (2)


Обновление: похоже, что сейчас это невозможно. Однако вы можете попробовать следующие коды, на всякий случай, если это поможет.

Code1: Просто мысль. Не пробовал.

if (status == ReachableViaWiFi) //status = 1
{
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]) {
        NSLog(@"Wifi and 3G are available");
    } else {
        NSLog(@"Wifi is available, but 3G is not available");
    }
}

Код 2:

Для внутренних приложений вы можете использовать этот подход, как упоминалось здесь,

Примечание. Здесь используется частный API, поэтому ваше приложение будет отклонено, если вы используете его в приложении appstore.

Скопируйте и вставьте приведенное ниже содержимое в RadioPreferences.h

@protocol RadiosPreferencesDelegate
-(void)airplaneModeChanged;
@end


@interface RadiosPreferences : NSObject
{
    struct __SCPreferences *_prefs;
    int _applySkipCount;
    id <RadiosPreferencesDelegate> _delegate;
    BOOL _isCachedAirplaneModeValid;
    BOOL _cachedAirplaneMode;
    BOOL notifyForExternalChangeOnly;
}

- (id)init;
- (void)dealloc;
@property(nonatomic) BOOL airplaneMode;
- (void)refresh;
- (void)initializeSCPrefs:(id)arg1;
- (void)notifyTarget:(unsigned int)arg1;
- (void)synchronize;
- (void *)getValueForKey:(id)arg1;
- (void)setValue:(void *)arg1 forKey:(id)arg2;
@property(nonatomic) BOOL notifyForExternalChangeOnly; // @synthesize notifyForExternalChangeOnly;
@property(nonatomic) id <RadiosPreferencesDelegate> delegate; // @synthesize delegate=_delegate;

@end 

Тогда попробуйте, как показано ниже.

id rp = [[RadiosPreferences alloc] init];
BOOL status = [rp airplaneMode];
return status;
person iDev    schedule 26.10.2012
comment
Я попробовал это, но canOpenURL ничего не меняет. Он по-прежнему считает, что 3G также доступен, когда он находится в режиме полета. Затем я также попробовал openURL: [NSURL URLWithString: @tel: // 1234567], но на этот раз он покажет сообщение о том, что вы должны отключить режим полета, чтобы сделать телефонный звонок. Точно так же, как обычное сообщение, которое вы получаете, когда пытаетесь позвонить в режиме полета - person C0D3; 29.10.2012
comment
Большое спасибо за редактирование RadiosPreferences и всю вашу другую помощь, хотя RadiosPreferences не работал, он всегда возвращает статус NO (false). Я также нашел это: sessions.apple.com/thread/1761374?start=0&tstart = 0 нет никакого смысла в том, что Apple не разрешает разработчикам проверять этот простой флаг. - person C0D3; 29.10.2012
comment
Кроме того, это приложение должно быть в AppStore, как только оно будет готово, так что это тоже не помогает. - person C0D3; 29.10.2012

В настоящее время нет возможности сделать это на iPhone, следуя рекомендациям Apple и без использования их частного API.

person C0D3    schedule 30.11.2012