Tôi hiện đang thử nghiệm chế độ vị trí nền trong iOS 13, vì tôi muốn theo dõi vị trí và chuyển động của người dùng (sử dụng CMMotionManager) trong nền. Do đó, tôi có lớp (singleton) riêng xử lý theo dõi vị trí. Tôi khởi tạo CLLocationManager theo cách sau:
func initializeLocationManager() -> CLLocationManager {
let manager = locationManager ?? CLLocationManager()
manager.delegate = self
manager.requestAlwaysAuthorization()
manager.allowsBackgroundLocationUpdates = true
manager.pausesLocationUpdatesAutomatically = false
manager.distanceFilter = kCLDistanceFilterNone
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.activityType = .other
return manager
}
Sau đó, tôi bắt đầu các dịch vụ sau:
func startLocationServices() {
// ...
locationManager.startUpdatingLocation()
locationManager.startMonitoringVisits()
locationManager.startMonitoringSignificantLocationChanges()
// ...
}
Ngoài ra, tôi đã triển khai các phương thức CLLocationManagerDelegate didChangeAuthorization (), didUpdateLocation ().
Trong tập tin info.plist tôi đã thêm các mục sau:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Trong ViewContoder của tôi, tôi gọi startLocationService. Hiện tại, tôi đặt quyền của ứng dụng để theo dõi dữ liệu vị trí thành ". Trái phép"
Các cập nhật vị trí dừng lại sau khoảng 60 - 130 phút.
Để giải quyết vấn đề, tôi đã thêm chức năng didFinishLaunchingWithOptions, kích hoạt lại cập nhật vị trí:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let launchOptions = launchOptions,
let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
isLocationKey {
restartServices()
}
return true
}
Khi ứng dụng bị đánh thức bằng chức năng này, tôi đã quản lý để có được dữ liệu liên tục trong một số thử nghiệm, nhưng đôi khi ứng dụng bị treo lại sau vài phút.
Cuối cùng, tôi cũng đã thử một bộ đếm thời gian khởi động lại theo dõi vị trí cứ sau 5 phút, nhưng điều này dường như không ảnh hưởng đến thời lượng cập nhật.
Vì vậy, câu hỏi của tôi là nếu có một cách liên tục nhận được các bản cập nhật vị trí trong nền, hoặc có một số tùy chọn tôi đang thiếu?
Cảm ơn trước.
Chỉnh sửa: Tôi đã thử nghiệm ứng dụng trên iOS 12 và nó được cập nhật liên tục trong 5/5 thử nghiệm. Vì vậy, tôi đoán vấn đề có liên quan đến iOS 13.