2014-09-22 16 views
5

Tôi muốn cập nhật lý tưởng vị trí của người dùng cứ 5 phút một lần nếu ứng dụng ở trong trạng thái nền hoặc ở trạng thái nền trước. Đây là một ứng dụng rất nhạy cảm với vị trí, vì vậy việc biết vị trí mọi lúc đều rất quan trọng.cập nhật vị trí ở chế độ nền trên bộ hẹn giờ/định kỳ trong iOS 8

Đã có nhiều câu trả lời liên quan đến câu hỏi này trên SO, nhưng rất nhiều trong số họ đối phó với iOS 6 trở về trước. Sau iOS 7, rất nhiều tác vụ nền đã thay đổi và tôi gặp khó khăn trong việc tìm cách triển khai cập nhật vị trí định kỳ trong nền.

Trả lời

2

Bạn sẽ muốn sử dụng ủy quyền của CoreLocation. Ngay khi bạn nhận được một tọa độ, hãy dừng CoreLocation, thiết lập bộ hẹn giờ để khởi động lại trong 5 phút.

Với iOS 8, bạn cần đặt mục nhập plist cho NSLocationWhenInUseUsageDescription và/hoặc NSLocationAlwaysInUseDescription.

Tài liệu của Apple rất rõ ràng về cách thực hiện tất cả điều này.

-(void)startUpdating{ 
    self.locationManager = [[CLLocationManager alloc]init]; 
    self.locationManager.delegate = self; 
    [self.locationManager requestWhenInUseAuthorization]; 
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [self.locationManager startUpdatingLocation]; 

} 

-(void)timerFired{ 
    [self.timer invalidate]; 
    _timer = nil; 
    [self.locationManager startUpdatingLocation]; 
} 

// CLLocationDelegate 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray *)locations{ 
    if(locations.count){ 
     // Optional: check error for desired accuracy 
     self.location = locations[0]; 
     [self.locationManager stopUpdatingLocation]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:60 * 5 target:self selector:@selector(timerFired) userInfo:nil repeats:NO]; 
    } 
} 
+0

Điều này có tiếp tục hoạt động khi ứng dụng đã nhập vào nền không? – initWithQuestion

+0

Một số chế độ có. Đọc tài liệu. – VaporwareWolf

+0

Tôi nhận thấy rằng '' [self.locationManager stopUpdatingLocation] '' là đặc trưng hai lần, nên phương thức timerFired là '' [self.locationManager startUpdatingLocation] ''? Tôi tin rằng '' self.location = [locations lastObject] '' là thích hợp hơn vì đối tượng cuối cùng luôn luôn là gần đây nhất. Cuối cùng, bạn có thể giải thích lý do tại sao logic vô hiệu hóa bộ hẹn giờ được gọi? – initWithQuestion

0

Có khá nhiều thông tin liên quan đến điều này trên apple documentation.

Ngoài ra, còn có một số câu trả lời bổ sung herehere với các câu trả lời trước đó từ stackoverflow. Dường như có đủ thông tin trong đó sẽ có thể giúp bạn!

+0

Cả hai câu trả lời đều nằm trước iOS 8 và một số phương pháp đó đã không được chấp nhận. – initWithQuestion

+1

Chúng có ý định giúp bạn đi đúng hướng. Khi bạn có câu hỏi, tài liệu cần có để giúp cung cấp cho bạn bất kỳ thông tin nào bạn cần. Có rất nhiều thông tin về tài liệu của Apple về các ứng dụng chạy ẩn mà bạn nên đọc. – sdoowhsoj

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