5

目的地の近くにいるかどうかをユーザーに知らせるアプリを作成しています。と目的地の間の距離を計算してcurrentLocationいます。内で計算を行っていdidUpdateLocationsます。それは機能していますが、数学をしなくてもそれを処理できる方法があることを私は見ました。

地域を登録していCLLocationManagerます; ただし、メソッドdidExitRegiondidEnterRegionは呼び出されていないようです。

リージョンを登録するコードの部分は次のとおりです。

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [self.locationManager startUpdatingLocation];
    [self.mySearchBar resignFirstResponder];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

    self.distToRemind = 0;

    [worldMap removeAnnotations:[worldMap annotations]];
    NSLog(@"executou de primeira");

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder geocodeAddressString:[self.mySearchBar text] completionHandler:^(NSArray *placemarks, NSError *error)
         {
             CLPlacemark *placemark = [placemarks lastObject];

             //test
             //DefaultAnnotation *annot = [[DefaultAnnotation alloc] initWithCoordinate:placemark.location.coordinate andTitle:@""];
             CLRegion *newRegion = [[CLRegion alloc] initCircularRegionWithCenter:placemark.location.coordinate radius:10.0 identifier:@"RegionBoundary"];

             DefaultAnnotation *regionAnnotation = [[DefaultAnnotation alloc] initWithCoordinate:newRegion.center andTitle:@""];

             [self identifyPlacemark:placemark andSetAnnotation:regionAnnotation];

             MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(regionAnnotation.coordinate, 250, 250);


             [worldMap addAnnotation:regionAnnotation];
             [worldMap setRegion:region animated:YES];

             [self.locationManager startMonitoringForRegion:newRegion];

             if (self.boolPushButtonTapped) {
                  [self pushButtonTapped];
             }
         }
         ];
}

私はここで何か間違ったことをしていますか?

4

1 に答える 1

12

わかりました、iOS でリージョン監視機能を使用する際に留意すべき点がいくつかあります。

  • 初期半径を何に設定しても、領域はデフォルトで最小サイズになります。Apple のエンジニアは、GPS 対応デバイスの場合は 100M であると教えてくれました。リージョン モニタリングをサポートする Wi-Fi 専用デバイスの場合は 450M (iPad 3 および新しい iPod Touch)
  • モニターできる地域は限定商品です。1 台のデバイスで監視できる総数には制限があります。繰り返しになりますが、Apple のエンジニアは、約 100 の地域であると私に言いました。デリゲート メソッドを使用して、リージョンが追加されたかどうかを確認します。
  • 地域は非常に便利で、バッテリー寿命への影響は最小限です。また、ステータス バーに独自の場所アイコンが表示されます。(中空の紫色の場所の矢印)
  • それらは他のすべてのロケーション API と非常によく似た働きをします。発生しているアクションを解釈するには、デリゲート メソッドに正しく応答する必要があります。

あなたのコードは良さそうに見えますが、あなたの を取り巻くロジックが欠けていますCLLocationManagerDelegate。コールバックを処理するための適切なデリゲートがないと、コールバックが失われる可能性があります ( -didExitRegion/-didEnterRegion)。

私の経験では、すべてのロケーション マネージャーのデリゲート メソッドを処理するシングルトン クラスを作成します。必ずサインアップして、彼らの話を聞いてください。これらのデリゲート呼び出しに関するコードを追加していただければ、さらにお役に立てれば幸いです。それらを正しく設定する方法を文書化する必要があるチュートリアルがたくさんあります。幸運を。

*注: 今年の WWDC のロケーション エンジニアと、リージョンの最小サイズとリージョン数に関する不明な点について話しました。最小領域サイズは 100 で確認できますが、領域の最大数は確認できません。私はまだ必要がありませんでした。

于 2012-10-04T21:25:25.673 に答える