2011-12-21 23 views
6

Tôi đang cố gắng sử dụng các vùng theo dõi để theo dõi xem người dùng đã truy cập các mốc chưa. người quản lý vị trí được khởi tạo trong một viewController cùng với một mapkitiphone CLLocationmanager Khu vực giám sát callbacks không được kích hoạt

trong viewDidLoad của bộ điều khiển xem:

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); 
} 

tôi nhận được NSLogs "khu vực giám sát okay" và tất cả các vùng một cách chính xác.

thêm trong những khu vực được thực hiện như vậy

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]; 

nhưng callbacks đều không được kích hoạt

- (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); 
} 

cập nhật vị trí tuy nhiên, hoạt động tốt.

[locationManager startUpdatingLocation]; 

kích hoạt didUpdateToLocation callback như mong đợi

Cập nhật: sử dụng didUpdatToLocation để giám sát đối với các vùng để thay thế. vẫn muốn biết lý do tại sao điều này sẽ không hoạt động, có vẻ như ít người đã thành công với việc theo dõi vùng

+0

Bạn có tìm ra giải pháp cho vấn đề này không? Tôi gặp vấn đề tương tự và didStartMonitoringForRegion không kích hoạt. – Das

+0

nó chỉ ra rằng theo dõi khu vực chỉ không cho tôi độ chính xác tôi cần. Tôi đã kết thúc thực hiện kiểm tra thủ công cho mọi cuộc gọi lại doUpdateToLocation. Điều này là khả thi đối với tôi vì tôi đã theo dõi chỉ 10 vùng – tzl

Trả lời

3

Công cụ theo dõi vùng dành cho theo dõi vị trí chi tiết thấp và được kích hoạt trên ranh giới vị trí ô, vì vậy nếu bạn không vượt qua ranh giới ô, bạn sẽ không bao giờ kiểm tra vùng của mình. Tôi có vấn đề tương tự và nghiên cứu này và một trang web khác nhau có một lời nhận xét về vấn đề này mà chỉ vào diễn đàn táo này:

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

Nếu bạn đọc tất cả các ý kiến, bạn sẽ hiểu tại sao điều này không hoạt động.

Tôi đang thử một công việc xung quanh nơi tôi xác định NSSets của riêng mình để chứa CLRegions được theo dõi và CLRegions bị chiếm đóng và sau đó khi tôi nhận được một locationManager: didUpdateToLocation: fromLocation: callback, tôi kiểm tra tất cả các vùng trong bộ theo dõi của tôi đã không ở trong bộ inRegions nhưng bây giờ đang ở trong vùng được theo dõi (thêm vào inRegions và gọi lại với enterRegion) hoặc nếu tôi đã inRegion nhưng bây giờ không (loại bỏ khỏi inRegions và gọi lại với exitRegion). Đó là một công việc đang được tiến hành.

+0

không, đây không phải là trường hợp, vì tôi có hai thiết bị khác nhau trên cùng một mạng di động trong đó các vùng hoạt động trên một, nhưng không phải là khác – uofc

+0

tốt, vâng, đúng là như vậy. Nó có thể không phải là trường hợp hoàn chỉnh, vì có thể có những vấn đề khác liên quan, nhưng nó xoay quanh vùng phủ sóng của tháp di động và thay đổi các tế bào và những thứ như thế để kích hoạt. Nó không thường sử dụng GPS như GPS là tốn kém. Có lẽ rất nhiều sắc thái cho nó và các trường hợp cạnh và những thứ khác như wifi và các công cụ liên quan. Đọc liên kết táo ở trên để hiểu rõ hơn về vấn đề này. – chadbag

0

bạn đã đặt CLLocationManagerDelegate cho ViewController của mình?

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

có tôi đã làm \t @interface TrailViewController: UIViewController tzl

+2

Điều này thực sự không liên quan. Không đặt giao thức trong khai báo chỉ ảnh hưởng đến cảnh báo trình biên dịch và nội dung nhưng không ảnh hưởng đến cuộc gọi đại biểu thực sự gọi lại cho người được ủy quyền của bạn. – chadbag

0

Hãy thử sử dụng Debug -> Vị trí -> Freeway ổ cho mô phỏng, tôi có một vấn đề tương tự, nhưng tôi đã tạo ra một vài khu vực và didEnterRegion được trigged với hơn 1.000 mét ... Tôi don 't know Way .. Tôi đã đặt:

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

Bạn sắp đặt tọa độ trung tâm của mình? Phần đó bị thiếu trong ví dụ của bạn. Tôi đã thấy các ví dụ khác mà họ đang không điền nó với một tọa độ chính xác đủ kết hợp với bán kính của khu vực cho nó để bao giờ kích hoạt. Bạn phải có một tọa độ khá chính xác được nhập (có thể là 5 hoặc 6 số thập phân) nếu bạn muốn kích hoạt tại bán kính 20 mét.

Mọi thứ khác có vẻ khá tốt.

+0

tôi đang sử dụng 6 số thập phân. những gì câu đố tôi nhất là didStartMonitoringForRegion không được kích hoạt: S – tzl

+0

Tôi sẽ thử một bán kính lớn hơn để bắt đầu, xem nếu điều đó giúp. Tôi chỉ có thể nhận được các khu vực làm việc sau khi tôi chuyển tất cả mọi thứ vào AppDelegate của tôi. Sau đó, tôi nhận được tất cả các callbacks tôi cần. –

0

Bạn cũng cần NSLocationAlwaysUsageDescription trong plist của mình và cần gọi [locationManager requestAlwayAuthorization] trong ứng dụng của bạn. NSLocationWhenInUseUsageDescription sẽ tắt giám sát vùng.

Các vấn đề liên quan