Обнаружение GPS оборудования в iphone - PullRequest
2 голосов
/ 05 января 2010

Я хочу знать, как обнаружить GPS HardWare в Iphone или нет

Ответы [ 4 ]

2 голосов
/ 01 июня 2011

Чтобы не запрашивать разрешения 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, поэтому я, очевидно, не хочу запрашивать у пользователя разрешения для этого.

2 голосов
/ 05 января 2010

Вы не можете обнаружить аппаратное обеспечение, по крайней мере, через официальный SDK. Однако вы можете взаимодействовать с ним (а именно получать информацию из него) из вашего приложения (через платформу CoreLocation). И это работает на каждом устройстве, которое когда-либо поставлялось с момента выпуска iPhone OS 2.0 (даже iPod не использует настоящий GPS).

1 голос
/ 15 октября 2010

Лучшее, что я нашел, это использовать тот факт, что CLLocation.verticalAccuracy установлен только для устройств, оборудованных GPS. Конечно, это означает, что доступность GPS может быть определена только после первого обновления местоположения.

Из документации Apple:

Определение точности по вертикали требуется устройство с GPS возможностей. Таким образом, на некоторых ранее устройства на базе iOS, это свойство всегда содержит отрицательное значение.

Обновление: Иногда Core Location отправляет объекты CLLocation с verticalAccuracy = -1 на iPhone 4. Вероятно, это происходит, когда нет GPS-фиксированного местоположения, и базовое местоположение прибегает к сотовой или Wi-Fi позиционирования Таким образом, тот факт, что вы получаете -1, не обязательно означает, что у вас нет GPS. Только если вы получаете положительное значение, которое вы точно знаете, у вас есть GPS.

1 голос
/ 05 января 2010

Даже если вы не можете определить это с помощью SDK, вы можете использовать свои знания о текущих моделях. Если вы ограничиваетесь iPhone 3G, iPhone 3GS и iPod Touch 2-го поколения (лично я не поддерживаю более старые версии iPhone edge или iPod Touch 1-го поколения), то вы уже знаете, что модели iPhone поставляются с реальным устройством AGPS, а iPod Touch 2nd поколение может использовать - если и когда доступно - горячие точки 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
    ...
}
...