2

私のIOSアプリでは、ジオフェンシングを実装しています。現在の実装では、次のようなコードを使用しています。

  CLRegion* region3 = [[CLRegion alloc] initCircularRegionWithCenter:coordinates radius:100 identifier:@"region3"];
[self.locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyHundredMeters];

そして、これらのデリゲートメソッドを使用しています:

 (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
        NSLog(@"didenterregion");

    }
    (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
        NSLog(@"didexitregion");
    }

    (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
    {NSLog(@"monitoringDidFailForRegion");}

ただし、このコードは半径が 100m を超える場合にのみ正常に機能します。

ここにいくつかの質問があります:

  1. Apple によると、iOS 6 以降では、半径 1 ~ 400 m がデバイス 4 以降でサポートされています。メッセージが表示されるまでにどれくらいの時間がかかるかは気にしないので (たとえば、リージョンに入るときにメッセージを見ることは気にしませんが、そのリージョンを一度通過した場合は後者で見ることを気にします)より小さい半径を使用しますか? 半径50m以下のようなものに興味がありますか? (一部の地域では、私の場合は 20m も必要になります)。

私もそう思ってきました。Apple は、最大 20 の地域をサポートできると述べています。このようなソリューションの長所と短所は何ですか (まだ実装していませんが、意見が欲しいです)。

擬似コードは次のようになります。

Declare the regions - save them in an array
Do not call start monitoring

次に、デリゲート メソッドで:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
      for loop in all my regions {
         if ([region containsCoordinate: newLocation.coordinate])
            code for entering region
      } 
}
  1. 遅くなりますか?
  2. それはより多くのバッテリーを消費しますか?(地域の監視はバッテリーを消費しないと思います)?
  3. もっと正確にできますか?
  4. モニターに登録していないので、20 を超えるリージョンを持つことはできますか?

前もって感謝します。

4

1 に答える 1

5

1.

2 番目の ( にdidUpdateToLocation:基づく) 実装は、最初の実装に比べて (バッテリ寿命の点で) より高価になると思います。これは、最初の ( にstartMonitoringForRegion:基づく) 実装でのみコードを実行するためです。追跡している (最大 20) 地域の 1 つの半径。

一方、2 番目の実装では、" " デリゲート呼び出し(かなり頻繁に発生します) が発生するたびにコードを実行する必要があり、デリゲート メソッド内のコードが実行されます。didUpdateToLocation:

ところで、コードは上記の半径 100m で正常に動作するとおっしゃっていますが、Apple のドキュメントでは、iOS6 では「半径 1 ~ 400m のデバイスが 4 以降でサポートされています」と動作するはずです。

あなたの「100m」という数字は実際の結果ですか、それとも使用しているデバイス (iPhone 4s または古い iOS バージョンよりも古いもの) の制限ですか?

2.

バックグラウンドで何かを行うとバッテリーが消費されますが、Apple はこれに対して CoreLocation を最適化しています(アプリの info.plist ファイルで正しいフラグを設定している場合) 。

3.

「startMonitoringForRegion:」がリージョンに入った、またはリージョンから出たことを報告するのに数分かかる場合があることを除けば、どちらもほぼ同じくらい正確だと思います。

4.

そして、ええ、2 番目の実装では、追跡する地域をいくつでも持つことができます。ただし、バックグラウンドで実行するコードが多いほど、バッテリーが熱くなり、バッテリーの消耗が早くなる可能性が高くなります。

于 2013-09-08T00:55:32.400 に答える