Доступность режима полета (3G) против Wi-Fi
Я знаю, что код Reachability предоставит, если у телефона будет доступ к сети Wi-Fi или 3G.
Тем не менее, если в телефоне включен 3G и включен Wi-Fi, код Reachability по умолчанию означает, что в телефоне включен 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.
Это возможно?
Помощь будет принята с благодарностью.
2 ответа
В настоящее время нет способа сделать это на iPhone, следуя рекомендациям Apple и без использования их частного API.
Обновление: кажется, что это невозможно на данный момент. Однако вы можете попробовать следующие коды, на всякий случай, если это поможет.
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;