在iphone中检测GPS硬件

我想知道如何检测目前在iPhone或iPhone的GPS硬件

即使您无法使用SDK来确定这一点,您也可能会利用您对当前模型的了解。 如果仅限于iPhone 3G,iPhone 3GS和iPod Touch第二代(我个人不支持iPhone边缘或iPod Touch第一代),那么您已经知道iPhone机型配备了真正的AGPS设备,而iPod Touch 2nd世代可以使用 – 如果可用 – 地理标记的无线热点。 然后,您可以使用以下方法确定您正在运行的模型:

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

你无法检测硬件,至less不能通过官方的SDK。 但是,您可以通过应用程序(通过CoreLocation框架)与它交互 (即从中获取信息)。 而且这个function可以在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%的未来的certificate,但在这一点上,它运作良好。 我使用它在我的电池高清应用程序为了隐藏GPS估计,所以我显然不想问用户的授权。

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

从苹果的文档:

确定垂直精度需要具有GPSfunction的设备。 因此,在一些较早的基于iOS的设备上,这个属性总是包含一个负值。

更新:有时,Core Location也会在iPhone 4上发送verticalAccuracy = -1的CLLocation对象。 可能是这样做,当没有GPS修复可用和核心位置采取单元格或Wi-Fi定位。 所以你得到-1的事实并不一定意味着你没有GPS。 只有当你得到肯定的价值,你肯定知道,你有GPS。