12

iPhone/iPad コンパスの開発で問題が発生しました。

CLHeading から取得した trueHeading は常に「-1」の値を与えます。ここで立ち往生しています。これが私のコードです:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];

また、位置情報を使用する地図アプリまたはコンパス アプリで trueHeading の値が突然正しく読み取られることもわかりました。原因は何だろうと思うのですが、何か考えはありますか?iPhone4 と iPad の両方で発生します。

また、設定で位置情報サービスをオフにして再度有効にすると、正しい trueHeading 値を読み取ることができなくなります。作成したアプリで位置情報サービスを有効にできないためでしょうか?

とにかく、事前に感謝します

---私の解決策---

下記参照。

4

8 に答える 8

7

見出しが-1.000000を返し続けるのを避けるために、startUpdatingHeadingを実行するだけでなく、startUpdatingLocationを一緒に実行すると役立ちます。

于 2011-09-20T19:52:35.743 に答える
4

これを使ってみて...

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    // Start heading updates. 
    if (locationManager.headingAvailable && locationManager.locationServicesEnabled) 
    {
        locationManager.headingFilter = kCLHeadingFilterNone; 
        [locationManager startUpdatingHeading];
    }

そして、このCLLocationManagerデリゲートメソッド呼び出しを行った後

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    // Use the true heading if it is valid. 
    [lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]]; 
}

しかし、このコーディングはシミュレーターではなくデバイスで機能します...

幸せなコーディング..

于 2011-09-12T06:06:35.237 に答える
2

---私の解決策---

私がしたことは、[self.locationManager startUpdatingLocation]前または後にに追加することでした[self.locationManager startUpdatingHeading];(位置情報サービスがオフになっていて、設定から再度有効になっている場合)。これが良い解決策かどうかはわかりませんが、これを機能させるために私が行ったことです。より良い解決策があれば共有してください。

于 2012-07-19T04:36:23.700 に答える
1

私自身、ロケーションマネージャーに問題があり、テスト時にコンピュータから iPhone を取り外すことが役に立ったことがわかりました。どういうわけか、iPhoneのプラグを抜いた後にのみキャリブレーションアラートがポップアップしました.

于 2011-11-03T20:57:08.783 に答える
0

私はこれと同じ問題を抱えていました。startUpdatingHeadingをボタンアクションに移動してから、CLLocationManagerが割り当てられている場所(正常に機能していた場所)に戻したところ、-1のみが返され始めました。

iPadを再起動すると、再び機能し始めました。うまくいけば、それはそのようにとどまります。

編集:いいえ、それはそのようにとどまりませんでした。startUpdatingLocationも使用する必要がありました。でもこれでバッテリーが消耗しませんか?とにかく位置データを使用していないため、desiredAccuracyをkCLLocationAccuracyThreeKilometersに設定しました。

于 2013-01-21T19:53:03.887 に答える
0

正確な読み取りには、コンパスを使用している場所の磁気変動を知る必要があります。前の議論から、磁気方向から真の方向を修正する関数は、変動値を取得するためにあなたの場所を必要とするようです。コードで位置 GPS 情報を使用したくない場合は、磁気読み取り値を読み取り、自分で値を修正することをお勧めします。最初に目的の位置の偏差を取得する必要があります。次に、次の式を適用する必要があります: T=M ± V、ここで、T は真の方向、M はコンパスの磁気読み取り値、V は偏差です。東には「+」、西には「-」を使用します。必要な場所のバリエーション(磁気偏角)を提供する許可Webサイトを見つけました:http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php

于 2014-05-05T03:29:04.047 に答える
0

位置情報サービスがオフの場合、didUpdateHeading delegate methodは磁気方位のみを返します。用途に合わせてお使いいただけます。アップルのドキュメントによると..

見出し関連のイベントの配信を開始するには、デリゲートをロケーション マネージャー オブジェクトに割り当て、その startUpdatingHeading メソッドを呼び出します。位置の更新も有効になっている場合、位置マネージャーは真の方位と磁気方位の値の両方を返します。位置の更新が有効になっていない場合、位置マネージャーは磁気方位の値のみを返します。

于 2016-03-03T12:18:21.317 に答える