質問: [CMMotionManager new]; [motionManager setDeviceMotionUpdateInterval:1.0/30.0]; [motionManager setShowsDeviceMovementDisplay:YES]; [self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical]; ``` 位置データは1/30.0秒ごとに更新されます。 デバッグの目的のために私はUILabelを持っています。これは現在のコンパスの見出しを更新間隔ごとに更新してくれます。 アプリケーションが起動している間、私はいつもコンパスを較正するためにマジカル8をしなければなりません。 コンパスを較正した後、北と南の見出しはほぼ2〜5秒間正確です。 数秒後、コンパスは野生になり、角度は飛び跳ねます。 ほとんどの場合、開始位置から両方向に約10〜20度浮いています。 Wierdの結果を得ようとした。 30-60秒後には今もまた南北が交換されたり、東と西に見えたりします。 WWDC 2011では、この問題を解決するために、各センサを別のセンサでどのように計算するかについてセッションが話されています。 CoreMotionの設定で私が見逃したことはありますか?正確な見出し結果のこの大きな問題がありますか? 私は今コンパスを3つのデバイス(2つのiPhone 4とiPhone 4)でビル内外でテストしました。私は野原、小都市、大都市にいました。それはいつも起こります。 Appleのサンプルコンパスアプリは、テストで90%の精度でほぼ正確です。残念ながら、それはAppleによって供給されたオープンではありません。 読んでくれてありがとう。
回答: CoreMotionの使用*〜* CoreLocationは、あなたが探しているものを得るでしょう。 デフォルトでは、ハンドセットは校正図8を行い、これを無効にするには `locationManagerShouldDisplayHeadingCalibration:`を次のようにオーバーライドします。 ``` - (BOOL)locationManagerShouldDisplayHeadingCalibration: (CLLocationManager *)manager { return NO; } ``` `startUpdateHeading` を呼び出しているのかどうかは、あなたの質問のコードからは分かりません。もしそうでなければ、そうする: ``` if( [CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) { [myLocationManager startUpdatingLocation]; [myLocationManager startUpdatingHeading]; } ``` 見出しフィルタをオンにしないと、狂った結果が得られることがあります。そうすることをお勧めします。その後、 `didUpdateHeading` が呼び出されたときに、ロケーションマネージャ代理人の見出しの変更を取得するだけです。 また、ハンドセットがランドスケープモードの場合、見出しは常にPortraitの参照フレームにあるため、見出しを適切な度数(+/- 90)で調整する必要があります。