3

開いた後に常に場所を更新する必要がある場所ベースのアプリを作成しようとしています。アプリを閉じたときに位置情報をバックグラウンドに保持する方法を探していましたが、iPhone のバッテリーがすぐに消耗してしまうため、最善の方法ではないことがわかりました。

簡単に言うと、「地域監視」で見つけたのは、Appleが位置情報でも機能するアプリ「リマインダー」に使用するものと同じであることがわかったからです。次に、そのオプションを使用してアプリをテストしましたが、正しく作成されているにもかかわらず、シミュレーターで「didEnterRegion」メソッドに「決して」入らないことがわかりました。

-(void) locationManager: (CLLocationManager *) manager didEnterRegion: (CLRegion *) region
 {
     NSLog (@ "entering the region");
     CLLocation * location1 = manager.location;
     CLLocation * location2 = [[CLLocation alloc] initWithLatitude: latitud.doubleValue longitude: longitud.doubleValue];
 }

メソッドが呼び出されていることに最終的に気付きましたが、そのエリアの大部分を離れてそのエリアに戻ったときだけでした。これは、すでにその場所にいたために機能しなかったことを示しています(これはすべてシミュレーターにあります)、奇妙なことそうではなかったということです、シミュレーターの場所は監視する地域から何マイルも離れていました!半径50mや100mの領域を作ったのに、3kmや4kmに広がっていたので、精度の問題だと思います。

iOS 6 シミュレーターにこのエラーがあるかどうか、または精度の問題があるかどうかを知っている人はいますか? iPhone で直接テストするための開発者ライセンスをまだ持っていません。アプリはまだ完成していないため、まだ購入したくありません。このトピックについて何か助けていただければ幸いです。

前もって感謝します。

4

7 に答える 7

2

DidEnterRegion と ExitRegion はあまり正確ではありません。+、-150m程度の精度。

しかし -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations は非常に正確です。これを使用して、地域に座標/現在の場所があることを確認します

CLLocation *currentLocation = [locations lastObject];

 if ([self.ARegionYouSetBeforeHand containsCoordinate:currentLocation.coordinate])
{
 //you arrived at this region!!
}
于 2014-04-14T03:28:23.720 に答える
2

実際の地上試験を行うことをお勧めします。領域監視の精度は、テストの場所によって大きく異なります。

2 つ目のオプションは、リージョン モニタリングを使用してアプリを起動し、標準の位置情報サービスを開始することです。これを行うには、アプリをバックグラウンドで実行する権限が必要です。Apple はこれを承認しない場合があります。私たちのアプリは、このアプローチを使用して拒否されました。

于 2013-03-06T19:59:31.490 に答える
1

地域の監視は、(一般に) 「重要な位置変更」位置情報サービスと同じ基準で機能します。つまり、セル タワーの位置を使用します。Apple は、通常 1 km 前後の精度を期待できることを示唆していますが、実際の精度は、お住まいの地域のセル タワーの密度によって異なると警告しています。Core LocationのWWDC ビデオで、このトピックの詳細な背景を見つけることができます。

CLLocationManager試したことはありませんが、Region Monitoring を使用して (アプリを起動し、) ユーザーの位置を一般的に推測してから、より正確な修正を得るために高精度モードを使用することは可能かもしれません。

于 2012-12-21T06:35:55.803 に答える
0

最後に、リージョンモニタリングの精度はほとんどの目的に十分であることに気付きましたが、シミュレーションルートでもデバイスで「リージョンモニタリング」を使用した場合、GPSまたは携帯電話のハードウェアがないため、シミュレータでは注意が必要です。この機能は正しく機能します。

さらに正確にするために、CLLocationManagerのメソッド「startUpdatingLocation」をメソッド「didEnterRegion」に呼び出しました。これは問題なく機能します。

于 2013-02-04T00:05:09.150 に答える
0

MK MapView の定義済み GPS 精度

  1. kCLLocationAccuracyBestForNavigation –
    追加のセンサー データによって強化された最高レベルの精度を使用します。

  2. kCLLocationAccuracyBest –
    バッテリ電源で動作するデバイスに推奨される最高レベルの精度。

  3. kCLLocationAccuracyNearestTenMeters - 10 メートル以内の精度。

  4. CLLocationAccuracyHundredMeters – 100 メートル以内の精度。

  5. kCLLocationAccuracyKilometer – 1 キロメートル以内の精度。

  6. kCLLocationAccuracyThreeKilometers – 3
    キロメートル以内の精度。

使用法:

var locationManager: CLLocationManager = CLLocationManager()

    //MapView Location
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
    locationManager.startUpdatingHeading()
于 2016-03-30T13:54:10.287 に答える
0

組み込みのリージョン モニタリングは、私のニーズに対して十分に正確ではないことがわかりました。より高い精度が必要な場合は、まず精度を適切に設定してから、次のようなものを使用できます。

(@coolcool1994 と同じ方法を使用しますが、もう少し詳しく、Swift 2.1 を使用します。セットアップCLLocationManagerとそのデリゲート (以下の関数が存在する場所) を忘れずに設定し、位置の更新の受信を開始してください)

var activeRegions = Set<String>()
var monitoredRegions = [
  CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
    radius: 300, identifier: "Region1"),
  CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
    radius: 300, identifier: "Region2")
]

func manuallyUpdateActiveRegionsFromLocation(location: CLLocation){
  // Optionally explicitly reject unwanted location updates
  // Setting the location manager delegate's desiredAccuracy should be enough
  let maxOldTime = 300 //5 minutes
  let minAccuracy = 300 //300 metres
  if abs(location.timestamp.timeIntervalSinceNow) > maxOldTime
    || location.horizontalAccuracy > minAccuracy {
      return
  }

  for monitoredRegion in monitoredRegions {
    if monitoredRegion.containsCoordinate(location.coordinate) {
      activeRegions.insert(monitoredRegion.identifier)
    } else {
      activeRegions.remove(monitoredRegion.identifier)
    }
  }

}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
  if let location = locations.last {
    manuallyUpdateActiveRegionsFromLocation(location)
  }
}
于 2016-02-07T19:05:29.437 に答える