Обнаружение GPS оборудования в iphone
Я хочу знать, как обнаружить GPS HardWare в Iphone или нет
4 ответа
Даже если вы не можете определить это с помощью SDK, вы можете использовать свои знания современных моделей. Если вы ограничиваете себя iPhone 3G, iPhone 3GS и iPod Touch 2-го поколения (лично я не поддерживаю более старые версии iPhone edge или iPod Touch 1-го поколения), то вы уже знаете, что модели iPhone поставляются с реальным устройством AGPS, а iPod Touch 2-го поколение может использовать - если и когда доступно - горячие точки Wi-Fi с геотегами. Затем вы можете использовать следующий метод для определения модели, на которой вы работаете:
- (NSString *) deviceModel{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname("hw.machine", answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
free(answer);
return results;
}
Метод возвращает @"iPhone2,1" для 3GS, @"iPhone1,2" для 3G и @"iPod2,1" для ipod touch 2-го поколения; Вы называете это следующим образом
NSString *deviceModel = [[self deviceModel] retain];
и используйте его следующим образом:
if([self.deviceModel isEqualToString:@"Pod2,1"]){
// no real GPS unit available
// no camera available
...
}
Вы не можете обнаружить оборудование, по крайней мере, через официальный SDK. Однако вы можете взаимодействовать с ним (а именно получать информацию из него) из своего приложения (через платформу CoreLocation). И это работает на каждом устройстве, которое когда-либо поставлялось с момента выпуска iPhone OS 2.0 (даже iPod без сенсорного GPS внутри).
Чтобы не запрашивать разрешения GPS, просто чтобы узнать, существует ли GPS, я использую небольшую хитрость. Поскольку все устройства с настоящим GPS также имеют 3G, я просто проверяю, есть ли на телефоне оператор.
//Use classLoaders to avoid crashes on iPhone OS 3.x
id netInfo = [[NSClassFromString(@"CTTelephonyNetworkInfo") alloc] init];
if (netInfo)
{
id carrier = [netInfo subscriberCellularProvider];
if ([[carrier carrierName] length] <=0)
{
//NO operator=>NO 3G and no real GPS
}
}
[netInfo release];
Конечно, это не может быть на 100% будущим, но в данный момент это работает хорошо. Я использую его в своем приложении Battery HD, чтобы скрыть оценки GPS, поэтому я, очевидно, не хочу запрашивать у пользователя разрешения на это.
Лучшее, что я нашел, это использовать тот факт, что CLLocation.verticalAccuracy
устанавливается только для устройств, оборудованных GPS. Конечно, это означает, что доступность GPS может быть определена только после первого обновления местоположения.
Из документации Apple:
Для определения вертикальной точности требуется устройство с возможностями GPS. Таким образом, на некоторых более ранних устройствах на базе iOS это свойство всегда содержит отрицательное значение.
Обновление: иногда Core Location отправляет объекты CLLocation с verticalAccuracy = -1 на iPhone 4. Вероятно, это происходит, когда нет GPS-фиксированного местоположения, а базовое местоположение используется для определения местоположения в ячейке или Wi-Fi. Таким образом, тот факт, что вы получаете -1, не обязательно означает, что у вас нет GPS. Только если вы получаете положительное значение, которое вы точно знаете, у вас есть GPS.