4

ユーザーの位置の地図を表示し、アプリがバックグラウンドに移動するまでユーザーを追跡するアプリがあります。その時点で、場所の管理者は、場所の更新を停止し、代わりに地域 (最後の既知の場所から半径 100 メートル) を監視するように指示されます。iOS シミュレーターでは、期待どおりに動作し、ジオフェンシング インジケーターが表示されます (通常の位置情報サービス インジケーターと同じですが、アウトラインのみ)。iPhone では、期待どおりに動作しているように見えますが、アウトラインだけではなく、通常の位置情報サービス アイコンが表示されます。

これが起こっている可能性がある理由はありますか?シミュレーターと電話の間のこの不一致? 電話が実際にジオフェンシングのみを使用し、他のサービスを使用していないことを確認したいだけです(つまり、バッテリーの使用量を最小限に抑えるため)。

追加情報:

位置情報の更新を受信するには、バックグラウンド モードを設定する必要があります。これは、常にではなく、特定のケース (ユーザーが有効にした場合) に限られます。ただし、これを無効にしようとしましたが、問題は解決しません。

アプリのバックグラウンド化に使用しているコード:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Only monitor significant changes – unless specified
    if(!self.viewController.userSpecifiedToUseLocationServices)
    {
        // Stop using full location services
        [self.viewController.locationManager stopUpdatingLocation];

        // Create a boundary -- a circle around the current location
        self.viewController.currentBoundary = [[CLRegion alloc] initCircularRegionWithCenter:self.viewController.locationManager.location.coordinate radius:kSignificantLocationChange identifier:@"Current Location Boundary"];

        // Monitor the boundary
        [self.viewController.locationManager startMonitoringForRegion:self.viewController.currentBoundary desiredAccuracy:kCLLocationAccuracyBest];
    }
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Stop monitoring the region
    if(self.viewController.currentBoundary != nil)
    {
        [self.viewController.locationManager stopMonitoringForRegion:self.viewController.currentBoundary];
        self.viewController.currentBoundary = nil;
    }

    // Start full location services again
    [self.viewController.locationManager startUpdatingLocation];
}
4

1 に答える 1

5

まず第一に、シミュレーターの位置情報サービスは、実際のデバイスを忠実に再現したものではありません。したがって、両方のテスト プラットフォームで同じ結果が得られるとは限りません。

第二に、スタック オーバーフローに関するこの回答によると、それは iOS 5 での通常の動作のように思えます (さまざまなインジケーターが表示されます)。

また、ジオフェンシングは魔法のテクノロジーではないことにも注意してください。デバイスは引き続き位置情報サービスを使用する必要があり、それによってバッテリーが消耗します。独自にコーディングするよりも、Apple のstartMonitoringForRegion:orを使用してその実装を利用することをお勧めします。startMonitoringForRegion:desiredAccuracy:しかし、バッテリーの消耗も無視できるとは思いません。

最後に、 をkCLLocationAccuracyBest使用 startMonitoringForRegion:したり、より低い精度要件を指定したりするのではなく、精度を として指定しています。これがバッテリーの性能にどのように影響しないかわかりません。精度が高いということは、OS がより高品質の修正を取得するか、より定期的にポーリングするか、またはその両方を行う必要があることを意味します。

残念ながら、無料のランチはありません:(

于 2012-07-15T07:07:36.227 に答える