在iPhone中检测GPS硬件

时间:2010-01-05 08:05:16

标签: ios iphone gps core-location detection

我想知道如何检测目前在Iphone中的GPS硬件

4 个答案:

答案 0 :(得分:2)

您无法检测硬件,至少不能通过官方SDK。但是,您可以从应用程序(通过CoreLocation框架)交互(即从中获取信息)。这适用于自iPhone OS 2.0发布以来所发布的所有设备(甚至iPod触摸时没有真正的GPS)。

答案 1 :(得分:2)

为了避免要求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 :(得分:1)

即使您无法使用SDK确定这一点,您也可以利用您对当前模型的了解。如果你限制自己使用iPhone 3G,iPhone 3GS和iPod Touch第二代(我个人不支持旧的iPhone边缘或iPod Touch第一代),那么你已经知道iPhone型号附带一个真正的AGPS单元而iPod Touch 2nd一代可以使用 - 如果可用的话 - 带有地理标记的wifi热点。然后,您可以使用以下方法确定您正在运行的模型:

- (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;
}

该方法为3GS返回@“iPhone2,1”,为3G提供@“iPhone1,2”,为ipod touch第二代返回@“iPod2,1”;你可以这样称呼它

NSString *deviceModel = [[self deviceModel] retain];

并按如下方式使用:

if([self.deviceModel isEqualToString:@"Pod2,1"]){
    // no real GPS unit available 
    // no camera available
    ...
}

答案 3 :(得分:1)

我发现的最好的事情是利用CLLocation.verticalAccuracy仅针对配备GPS的设备设置的事实。当然,这意味着只有在第一次更新位置后才能确定GPS可用性。

来自Apple的文档:

  

确定垂直精度   需要带GPS的设备   能力。因此,在一些早些时候   基于iOS的设备,此属性   始终包含负值。

<强>更新 有时,Core Location也会在iPhone 4上发送具有verticalAccuracy = -1的CLLocation对象。当没有可用的GPS定位并且核心位置适应小区或Wi-Fi定位时,它可能正在这样做。所以你获得-1的事实并不一定意味着你没有GPS。只有当你获得肯定的正值时,你才能拥有GPS。