Điều đầu tiên cần nói là tạo ứng dụng Phonegap nhận bản cập nhật vị trí trong khi chạy ở chế độ nền là hoàn toàn có thể, nhưng không phải là tầm thường. Tôi đã tự thực hiện và phát hành ứng dụng trên cả nền tảng Android và iOS.
Nếu bạn cần cập nhật vị trí chính xác và thông thường, tôi khuyên bạn nên sử dụng bộ thu tín hiệu GPS trên các thiết bị đích. Trong Phonegap, bạn có thể làm điều này thiết lập cờ "highAccuracy" khi yêu cầu cập nhật vị trí. Các watchPosition() chức năng sẽ cung cấp thông tin vị trí mới và khi điện thoại nhận thông tin cập nhật từ các máy thu GPS, vì vậy bạn sử dụng nó một cái gì đó như thế này:
navigator.geolocation.watchPosition(successCallback, errorCallback, {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0
});
Xem Phonegap geolocation API documentation để biết thêm chi tiết (lưu ý các điều khoản được yêu cầu để thực hiện công việc này trên Android và iOS).
Để giữ cho ứng dụng của bạn chạy trong nền trên Android hoặc iOS, bạn sẽ cần thiết lập môi trường phát triển gốc tương ứng: Eclipse cho Android, XCode cho iOS. Bạn sẽ không thể sử dụng Phonegap Build vì cài đặt tùy chỉnh là cần thiết trong cả hai trường hợp để làm cho nó hoạt động. Xem Phonegap platform guides để biết cách thực hiện việc này.
Để giữ cho ứng dụng của bạn chạy trong nền trên Android, bạn cần phải viết dịch vụ Android tùy chỉnh hoặc bạn có thể làm những gì tôi đã làm và sử dụng plugin Phonegap để có được "một phần wakelock" (see here) để giữ ứng dụng đang chạy trong nền và nhận cập nhật vị trí trong khi màn hình tắt. Lưu ý rằng các original version của plugin này là lỗi thời và không hoạt động với các phiên bản gần đây của Phonegap, và cũng không hỗ trợ wakelocks một phần. Tuy nhiên, tôi đã cập nhật và mở rộng nó để sử dụng riêng của tôi: bạn có thể tìm thấy mã nguồn cho nó trong câu trả lời của tôi cho this question.
Để giữ cho ứng dụng của bạn chạy ở chế độ nền trên iOS, bạn cần thực hiện những việc hơi khác; bạn không cần plugin, chỉ cần thiết lập dự án.
Bạn có thể chỉnh sửa thủ công dự án .plist và thêm khóa "UIBackgroundModes" chính với giá trị "vị trí" hoặc, với dự án của bạn mở trong XCode, thêm khóa "Chế độ nền bắt buộc" với giá trị " Ứng dụng đăng ký cập nhật vị trí ". Điều này sẽ khiến iOS kích hoạt chức năng gọi lại JS mà bạn đã đăng ký với watchPosition() mỗi khi nhận được cập nhật vị trí. See here để biết thêm về khóa dự án iOS và background modes.
Hy vọng điều này sẽ hữu ích!
cảm ơn câu trả lời của bạn, tôi sẽ cần thiết bị cập nhật vị trí sau mỗi 5 phút, tôi có thể kiểm soát điều đó, đúng không? Nó sẽ hoạt động miễn là thiết bị có kết nối internet. – amarruffo
Nếu bạn muốn cập nhật vị trí trên một khoảng thời gian cố định, bạn có thể sử dụng thời gian chờ để gọi hàm getCurrentPosition(), ví dụ: 'setTimeout (function() {navigator.geolocation.getCurrentPosition (successCallback, errorCallback, {enableHighAccuracy: true})}, 5 * 60 * 1000)' Nếu thiết bị có bộ nhận GPS, bạn không cần kết nối internet để nhận vị trí cập nhật. – DaveAlden
điều gì xảy ra tôi cần vị trí được chèn vào cơ sở dữ liệu thông qua dịch vụ web, điều đó sẽ hoạt động từ nền? Tôi đã đọc ở đâu đó rằng dịch vụ web sẽ không được gọi, bất kỳ ý tưởng nào về điều này ?. Cảm ơn bạn đã giúp đỡ. – amarruffo