iPhoneに存在するGPSハードウェアを検出する方法を知りたい
4 に答える
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%将来を保証するものではないかもしれませんが、現時点ではうまく機能します。GPSの見積もりを非表示にするためにBatteryHDアプリで使用しているので、ユーザーにその承認を求めたくないのは明らかです。
少なくとも公式のSDKを介してでは、ハードウェアを検出することはできません。ただし、(CoreLocationフレームワークを介して)アプリケーションから操作(つまり、情報を取得)することはできます。そしてこれは、iPhone OS 2.0のリリース以降に出荷されたすべてのデバイスで機能します(実際のGPSが内蔵されていないiPod touchでも)。
CLLocation.verticalAccuracy
私が見つけた最善の方法は、GPSを搭載したデバイスにのみ設定されているという事実を活用することです。もちろん、これは、GPSの可用性は最初の位置の更新後にのみ決定できることを意味します。
Appleのドキュメントから:
垂直精度を決定するには、GPS機能を備えたデバイスが必要です。したがって、一部の以前のiOSベースのデバイスでは、このプロパティには常に負の値が含まれます。
更新: 時々、CoreLocationはiPhone4でもverticalAccuracy=-1のCLLocationオブジェクトを送信します。おそらく、GPS修正が利用できず、コアロケーションがセルまたはWi-Fiポジショニングに頼っているときにそれを行っています。したがって、-1を取得しているという事実は、必ずしもGPSを持っていないことを意味するわけではありません。あなたが確かに知っている正の値を得ている場合にのみ、あなたはGPSを持っています。
SDKを使用してこれを判断することはできませんが、現在のモデルに関する知識を活用することができます。iPhone 3G、iPhone 3GS、iPod Touch第2世代(私は古いiPhoneEdgeまたはiPodTouch第1世代を個人的にサポートしていません)に限定する場合、iPhoneモデルには実際のAGPSユニットが付属していますが、iPodTouch2ndはすでにご存知でしょう。世代は、利用可能な場合は、ジオタグ付きの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"、ipodtouch第2世代の場合は@"iPod2,1"を返します。あなたはそれを次のように呼びます
NSString *deviceModel = [[self deviceModel] retain];
次のように使用します。
if([self.deviceModel isEqualToString:@"Pod2,1"]){
// no real GPS unit available
// no camera available
...
}