2011-12-21 4 views
6

ユーザーがランドマークを訪問したかどうかを監視するために監視領域を使用しようとしています。 は、ロケーションマネージャは、ビューコントローラのviewDidLoadでmapkitiphone CLLocationmanagerリージョン監視コールバックがトリガーされない

と一緒のViewControllerに初期化される:

if (self.locationManager == nil) 
{ 
    //  NSLog(@"creating location manager"); 
    self.locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
} 


NSSet* set=[locationManager monitoredRegions]; 

if ([CLLocationManager regionMonitoringAvailable] && [CLLocationManager regionMonitoringEnabled]) { 
    NSLog(@"region monitoring okay"); 
    NSLog(@"monitored regions: %@",set); 
} 

iが正しくすべての地域NSLogs「大丈夫監視領域」を得ます。地域の追加

はそう

double metres=20.0; 
CLLocationDistance dist=metres; 
CLLocationAccuracy acc=1.0; 

CLRegion *reg=[[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:dist identifier:landmarkObj.landmarkName]; 

[locationManager startMonitoringForRegion:reg desiredAccuracy:acc]; 

のように行われますが、コールバックがすべて

場所を更新
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Entered" 
                message:region.identifier 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil, nil]; 
    [alert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Exited" 
                message:region.identifier 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil, nil]; 
    [alert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region 
{ 
    NSLog(@"started monitring for region: %@",region); 
} 

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

を起動されませんが、正常に動作します。代わりに、領域を監視するために使用didUpdatToLocation:

[locationManager startUpdatingLocation]; 

が期待

更新としてコールバックdidUpdateToLocationをトリガします。 まだこれがうまくいかない理由を知りたい場合、地域監視で成功したことはほとんどないようです。

+0

この問題の解決方法を見つけましたか?私は同じ問題を抱えていて、didStartMonitoringForRegionは発砲していません。 – Das

+0

それは、私が必要とする正確さを私に与えることはできません。私は、すべてのdidUpdateToLocationコールバックの手動チェックを終了しました。これは、私が10地域しか追跡していなかったので、実現可能でした。 – tzl

答えて

3

リージョンのトラッキング情報は、細かい位置のトラッキングのためのもので、セルの位置の境界でトリガーされるため、セルの境界を越えないと領域を確認することはありません。私は同じ問題を持っていたし、これを研究し、さまざまなウェブサイトは、このリンゴのフォーラムを指摘し、これについてコメントしていた:

https://devforums.apple.com/message/251046#251046

あなたはすべてのコメントを読めば、これは働いていない理由を理解します。

トラッキングされたCLRegionsと占有されたCLRegionsを含む独自のNSSetsを定義し、次にlocationManagerを取得したときの作業を試しています。didUpdateToLocation:fromLocation:コールバック、トラッキングセット内のすべての領域をチェックしてinRegionsセットには含まれていませんでしたが、現在は追跡された地域(inRegionsに追加してenterRegionでコールバック)またはinRegionだったが、現在はそうではありません(inRegionsから削除してexitRegionでコールバック)。これは現在進行中の作業です。

+0

いいえ、これは当てはまりません。リージョンが1つではなく、他のエリアでは動作しない同じセルキャリア上に2つの異なるデバイスがあるため、 – uofc

+0

もそうです。それはおそらく他の問題が関わっているように、完全なケースではないかもしれませんが、セルタワーカバレッジとセルやそのようなものを変えてトリガすることを中心に展開しています。 GPSは高価であるため、通常はGPSを使用しません。多分それにニュアンスやエッジケースやwifiや関連するもののようなものがたくさんあります。上のリンゴのリンクを読んで、問題の理解を深める。 – chadbag

0

CLLocationManagerDelegateをViewControllerに設定しましたか?

@interface Maps : UIViewController <CLLocationManagerDelegate>{ 
... 
} 
+0

はいいいえ\t @interface TrailViewController:UIViewController tzl

+2

これは実際には無関係です。宣言にプロトコルを入れないことは、コンパイラの警告や内容にのみ影響しますが、実際のデリゲートコールはデリゲートに影響しません。 – chadbag

0

デバッグを使用してください - >所在地 - >フリーウェイドライブは、シミュレーションのために、私は似問題を抱えているが、私はいくつかの領域を作成し、didEnterRegionを超える1.000メートルでtriggedさ... Iドン私は設定しました:

locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
0

あなたのセンター座標は何ですか?その部分はあなたの例にはありません。私は他の例を見てきましたが、正確に十分な座標をそれが満たしていない場所を半径の半径と結びつけていません。半径20メートルでトリガーしたい場合は、かなり正確な座標を入力する必要があります(おそらく5または6小数)。

他のすべてはかなりよく見えます。

+0

私は6小数を使用しています。私が最も困惑しているのは、didStartMonitoringForRegionがトリガーされていないことです。S – tzl

+0

私は大きな半径を試してみて、それが役立つかどうかを確認します。すべてを私のAppDelegateに移しただけで、私は地域を動かすことができました。それから私は必要なすべてのコールバックを手に入れました。 –

0

あなたのplistにNSLocationAlwaysUsageDescriptionも必要です。アプリで[locationManager requestAlwayAuthorization]を呼び出す必要があります。 NSLocationWhenInUseUsageDescriptionは領域監視をオフにします。

関連する問題