Обнаружение 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.

Другие вопросы по тегам