我想知道如何检测目前在Iphone中的GPS硬件
答案 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。