Đây là phần từ tài liệu CLLocationManager mô tả hành vi của ứng dụng với startMo MonitoringSignificantLocationChanges :
Nếu bạn khởi động dịch vụ này và ứng dụng của bạn sau đó bị chấm dứt, hệ thống sẽ tự động khởi chạy lại ứng dụng ở chế độ nền nếu có sự kiện mới. Trong trường hợp như vậy, từ điển tùy chọn được chuyển đến ứng dụng: didFinishLaunchingWithOptions: phương thức đại biểu ứng dụng của bạn chứa khóa UIApplicationLaunchOptionsLocationKey để chỉ ra rằng ứng dụng của bạn đã được khởi chạy do một sự kiện vị trí. Sau khi khởi chạy lại, bạn vẫn phải định cấu hình đối tượng trình quản lý vị trí và gọi phương thức này để tiếp tục nhận các sự kiện vị trí. Khi bạn khởi động lại dịch vụ vị trí, sự kiện hiện tại sẽ được chuyển đến người đại diện của bạn ngay lập tức. Ngoài ra, thuộc tính vị trí của đối tượng trình quản lý vị trí của bạn được điền với đối tượng vị trí gần đây nhất ngay cả trước khi bạn bắt đầu dịch vụ vị trí.
Vì vậy, sự hiểu biết của tôi là nếu ứng dụng của bạn kết thúc (và tôi giả sử nếu bạn không gọi stopMo MonitoringSignificantLocationChanges từ applicationWillTermina ), bạn sẽ bị đánh thức với tham số UIApplicationLaunchOptionsLocationKey cho ứng dụng: didFinishLaunchingWithOptions . Tại thời điểm đó, bạn tạo CLLocationManager của mình , gọi startMo MonitoringSignificantLocationChanges và xử lý vị trí nền của bạn trong một khoảng thời gian giới hạn . Vì vậy, tôi ổn với chút này.
Đoạn trước chỉ nói về những gì sẽ xảy ra khi ứng dụng bị chấm dứt, nó không đề xuất bạn làm gì khi ứng dụng bị tạm ngưng. Tài liệu cho didFinishLaunchingWithOptions cho biết:
Ứng dụng theo dõi các cập nhật vị trí trong nền, đã bị xóa và hiện đã được khởi chạy lại. Trong trường hợp này, từ điển chứa một khóa cho biết rằng ứng dụng đã được khởi chạy lại do một sự kiện vị trí mới.
Đề xuất rằng bạn sẽ chỉ nhận được cuộc gọi này khi ứng dụng của bạn được khởi chạy (do thay đổi vị trí) sau khi bạn đã bị chấm dứt.
Tuy nhiên, đoạn về Dịch vụ Thay đổi Đáng kể trong Hướng dẫn Lập trình Nhận thức Vị trí có nội dung sau:
Nếu bạn để dịch vụ này chạy và ứng dụng của bạn sau đó bị tạm ngưng hoặc chấm dứt, dịch vụ sẽ tự động đánh thức ứng dụng của bạn khi dữ liệu vị trí mới đến. Vào thời điểm đánh thức, ứng dụng của bạn được đặt ở chế độ nền và có một khoảng thời gian nhỏ để xử lý dữ liệu vị trí. Bởi vì ứng dụng của bạn ở chế độ nền, nó sẽ thực hiện công việc tối thiểu và tránh bất kỳ tác vụ nào (chẳng hạn như truy vấn mạng) có thể ngăn ứng dụng trở lại trước khi hết thời gian được phân bổ. Nếu không, ứng dụng của bạn có thể bị chấm dứt.
Điều này cho thấy bạn được đánh thức với dữ liệu vị trí nếu ứng dụng của bạn đã bị tạm ngưng, nhưng không đề cập đến cách bạn được đánh thức:
- Liệu UIApplicationDelegate nhận được một cuộc gọi lại nói với tôi rằng tôi đang khôi phục từ trạng thái lơ lửng vào trạng thái nền?
- Trình quản lý vị trí (đã được làm khô khi ứng dụng bị tạm ngừng) có bắt đầu nhận các lệnh gọi lại locationManager: didUpdateToLocation: fromLocation không?
- Tôi có chỉ cần triển khai mã trong thông báo didUpdateToLocation của mình để kiểm tra trạng thái ứng dụng và thực hiện xử lý tối thiểu nếu ở chế độ nền không?
Trong quá trình viết ra điều này, tôi nghĩ rằng tôi có thể vừa trả lời câu hỏi của riêng mình, nhưng sẽ thật tuyệt nếu sự hiểu biết của tôi về điều này được xác nhận bởi một người hiểu biết hơn.