Знайте, есть ли у iOS устройства сотовые возможности данных
У меня есть переключатель в моем приложении, который "загружает только на Wi-Fi". Однако этот переключатель бесполезен для iPod touch или WiFi-iPads.
Есть ли способ узнать, обладает ли устройство сотовыми данными в коде? Что-то, что будет работать в будущем, тоже будет здорово (например, если iPod touch 5-го поколения с 3G выходит).
Ответы
Ответ 1
Привет, вы должны проверить, имеет ли он интерфейс pdp_ip0
#import <ifaddrs.h>
- (bool) hasCellular {
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
bool found = false;
if (getifaddrs(&addrs) == 0) {
cursor = addrs;
while (cursor != NULL) {
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"pdp_ip0"]) {
found = true;
break;
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return found;
}
Это не использует частные API.
Ответ 2
3G сам по себе сложно найти. Вы можете узнать, может ли устройство совершать звонки с помощью [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]
. Вы можете проверить, может ли устройство получить доступ в Интернет, период (и по какому методу, который может в настоящее время), используя Досягаемость code:
NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection]
currentReachabilityStatus];
if(currentStatus == kReachableViaWWAN) // 3G
else if(currentStatus == kReachableViaWifi) // ...wifi
else if(currentStatus == kNotReachable) // no connection currently possible
.., но помимо этого, я не думаю, что вы можете проверить наличие 3G-модема в устройстве. ***** Если он не может позвонить, и в настоящее время не имеет ячейки данные включены и Wi-Fi выключен, вы не сможете узнать, поддерживает ли он 3G.
Альтернативный способ (не совместимый с переходом, хотя, возможно, вы этого не хотите) заключается в сравнении модели устройства с исчерпывающим списком, зная, какие из них имеют 3G-модемы, как показано .
***** В соответствии с ответом bentech, если вы хотите перекопать имена устройств (это может перестать работать без предварительного предупреждения, если Apple решит изменить имя интерфейса 3g), вызовите getifaddrs
и проверьте интерфейс pdp_ip0
.
Ответ 3
В iOS 6.1 я смог использовать Core Telephony, чтобы успешно проверить наличие возможностей сотовой базовой полосы. Это работает на всех проверенных мной iPad: Verizon с активированной услугой и без AT & T с отключенной услугой, входом и выходом SIM-карты и iPad с Wi-Fi.
Используемый мной код выглядит следующим образом:
CTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;
Для всех iPads с аппаратным обеспечением сотовой базовой полосы carrier
не равно нулю. Для iPad с поддержкой Wi-Fi carrier
равен нулю.
Ответ 4
Я думаю, вы должны использовать CoreTelephony Framework.
Он действительно выдает, что он предназначен для использования операторами, поэтому я не уверен, что он против TOS для доступа к нему.
Перевозчики могут использовать эту информацию для написания приложений, которые предоставляют услуги только для своих собственных подписчиков.
Ответ 5
Swift 3.0 (UIDevice + Extension) ответа @bentech
Добавьте эту строку в свой BridgingHeader.h:
#import <ifaddrs.h>
Где-то еще:
extension UIDevice {
/// A Boolean value indicating whether the device has cellular data capabilities (true) or not (false).
var hasCellularCapabilites: Bool {
var addrs: UnsafeMutablePointer<ifaddrs>?
var cursor: UnsafeMutablePointer<ifaddrs>?
defer { freeifaddrs(addrs) }
guard getifaddrs(&addrs) == 0 else { return false }
cursor = addrs
while cursor != nil {
guard
let utf8String = cursor?.pointee.ifa_name,
let name = NSString(utf8String: utf8String),
name == "pdp_ip0"
else {
cursor = cursor?.pointee.ifa_next
continue
}
return true
}
return false
}
}
Ответ 6
Один из способов сделать это - попросить местоположение пользователей. Когда это так точно, как возможно, вы узнаете, есть ли у устройства GPS. Все устройства с GPS будут иметь 3G. А тем, у кого GPS нет, 3G не будет.
Ответ 7
Apple предоставила код здесь.
https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
Вы должны скопировать Reachability.h и Reachability.m в свой проект и импортировать
Reachability.h в ваш класс, затем
Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
while (networkStatus==NotReachable) {
NSLog(@"not reachable");
//no internet connection
return;
}
while (networkStatus==ReachableViaWWAN) {
NSLog(@" ReachableViaWWAN ");
}
while (networkStatus==ReachableViaWiFi) {
NSLog(@"ReachableViaWiFi");
}
Ответ 8
Другой способ - это: https://github.com/monospacecollective/UIDevice-Hardware/blob/master/UIDevice-Hardware.m с этим:
-(bool) hasCellular:(NSString*)modelIdentifier {
if ([modelIdentifier hasPrefix:@"iPhone"]) return YES;
if ([modelIdentifier hasPrefix:@"iPod"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad1,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,5"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,5"]) return YES;
if ([modelIdentifier isEqualToString:@"i386"]) return NO;
if ([modelIdentifier isEqualToString:@"x86_64"]) return NO;
return YES;
}
(Ясно, что его можно было отредактировать, чтобы удалить NO или YES только в зависимости от того, каким способом вы хотите ошибиться, если есть новая модель...)