3

私は建物のブロック(キャンパス)の歩行者に焦点を当てたiOSアプリに取り組んでいます。私は十分に良い(私は信じる)ユーザーの位置情報の更新を開発しましたが、私よりも専門家の誰かに、正確な位置情報、バッテリーの問題などに関するヒント、アドバイスを教えてもらいたいです。さらに、位置情報の更新を停止することは可能ですか? n秒後に再開しますか?エネルギーを節約するために私がした考えです。現時点では、アプリは現在地を検出していますが、青い点(ユーザー)がまだ動き回っていて、気に入らないです。できることはありますか?

以下は私のdidUpdateToLocationメソッドです。

アプリはファイル(デバイスに保存されている)から建物の情報を読み取っています

    - (void)viewDidLoad{

        [super viewDidLoad];

        if ([self checkForInternet]) {

            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            _locationManager.distanceFilter = 10.0f;
            _locationManager.desiredAccuracy = 20.0f;

            [_locationManager startUpdatingLocation];

        }
    }

    - (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation {

        if (newLocation.horizontalAccuracy > manager.desiredAccuracy) return;

        [self.mapView removeAnnotations:listOfAnn];
        [listOfAnn removeAllObjects];
        if ([manager locationServicesEnabled]) {

            for (NSString* row in rows){
                NSArray* cells = [row componentsSeparatedByString:@"\t"];

                CLLocationCoordinate2D newCoord;
                newCoord.latitude = [[cells objectAtIndex:5]floatValue];
                newCoord.longitude = [[cells objectAtIndex:6]floatValue];

                CLLocation *locB = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
                CLLocation *centerLoc = [[CLLocation alloc] initWithLatitude:CAMPUS_LATITUDE longitude:CAMPUS_LONGITUDE];
                CLLocationDistance borders = [locB distanceFromLocation:centerLoc];

                if ((int)round(borders) > 500) {

                    BuildingViewController *newBuilding = [[BuildingViewController alloc] initBuildingWithName:[cells objectAtIndex:2]                                                                                                       coordinates:newCoord shortDescription:[cells objectAtIndex:4] image:(NSString*)[cells objectAtIndex:3]                                                                                                               inDistance: borders];

                    if ([[prefs stringForKey:newBuilding.title] isEqualToString:[prefs stringForKey:@"userName"]]) {
                        [newBuilding retrieveID];
                        [listOfAnn addObject:newBuilding];
                    }

                } else{

                    CLLocation *locA = [[CLLocation alloc] initWithLatitude:newCoord.latitude longitude:newCoord.longitude];

                    CLLocationDistance distance = [locA distanceFromLocation:locB];

                    BuildingViewController *newBuilding = [[BuildingViewController alloc] initBuildingWithName:[cells objectAtIndex:2]
                                                        coordinates:newCoord shortDescription:[cells objectAtIndex:4] image:(NSString*)[cells objectAtIndex:3]
                                                        inDistance: distance];

                    if ((int)round(distance) < 100 ||
                       [[prefs stringForKey:newBuilding.title] isEqualToString:[prefs stringForKey:@"userName"]]){
                          [newBuilding retrieveID];
                          [listOfAnn addObject:newBuilding];
                    }

                }

           }
           [self.mapView addAnnotations:listOfAnn];
      }
 }
4

1 に答える 1

3

ΓειασουΠαναγιώτη。

位置情報サービスに関する公式ドキュメントを読む必要があります

これは優れたガイドであり、すべてをカバーする必要があります。私はあなたのために簡単な要約を行い、私たちのアプリのコアロケーションサービスで広範囲に取り組んできたので、利用可能な各方法の長所と短所を説明します:

iOSでユーザーの位置を取得する方法は3つあります。

  1. 通常のGPS位置監視(長所:非常に正確で迅速に更新されます。短所:バッテリーの消耗が速すぎます)
  2. 重要な位置情報サービス(長所:非常にバッテリー効率が高く、地域に入ると終了した場合でも、バックグラウンドの位置情報監視タスクと許可を必要とせずに、バックグラウンドからアプリを起動できます。短所:場所の特定と場所の更新の受信の両方で非常に不正確です変更)
  3. リージョンモニタリング(長所:非常にバッテリー効率が高く、リージョンが入力された場合に終了した場合でも、バックグラウンドの位置監視タスクと許可を必要とせずにアプリをバックグラウンドから起動できます短所:入力されたリージョンに関する通知の取得が不正確で、最大20リージョンになる可能性がありますアプリで監視)

したがって、必要な精度に応じて、サービスを選択する必要があります。もちろん、コードで使用しているようにGPSを使用している場合は、更新を取得した後は常に位置の更新をオフにして、一定期間後にのみ位置を再度要求する必要があります。そうしないと、アプリが消耗します。ユーザーのバッテリー。

そしてもちろん、いつでもユーザーの位置情報の更新を再開できます。アプリの多くのViewControllerでロケーションの更新が必要な場合は、ロケーションマネージャー用のシングルトンクラスを作成することをお勧めします。

GPSモニタリングに関しては、CoreLocationデリゲートメソッドdidUpdateToLocationで、次の手順を実行します。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{

    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
    //prevent Location caching... (only accepts cached data 1 minute old)
    if( abs(howRecent) < 60.0) {
        [self.locationManager stopUpdatingLocation];
        //capture the location... (this is your code)

        //update location after 90 seconds again
        [self performSelector:@selector(startUpdatingLocation) withObject:nil afterDelay:90];
     }

}

そして、場所を再度更新するには:

- (void)startUpdatingLocation {
    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorized || [CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined) {
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [locationManager startUpdatingLocation];
    }
}

また、ユーザーがviewControllerを変更した場合に備えて、performSelectorをキャンセルしたことを確認するには、これを次の場所に追加します。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];    
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
}
于 2012-12-12T19:59:39.763 に答える