2013-07-11 43 views
15

Tôi muốn biết thời điểm người dùng đến hoặc rời khỏi vị trí nhất định. Tôi đã cố gắng để làm điều này bằng cách sử dụng mạng không dây (kiểm tra cho các thiết bị di động), nhưng tôi không thể vì nhiều lý do.Cách theo dõi thiết bị vị trí thiết bị (iOS và Android) bằng Phonegap

1) Tôi cần cập nhật thời gian thực hoặc cứ 1 - 5 phút thông tin về thiết bị nào được kết nối và thiết bị nào vừa bị ngắt kết nối.

2) Tôi đã ping rất cao từ máy tính đến iPhone trên cùng một mạng (vẫn không biết tại sao).

Bây giờ tôi muốn thực hiện việc này bằng cách sử dụng vị trí địa lý từ ứng dụng Phonegap (chạy ẩn) bị treo trên iOS hoặc chạy trong nền trong Android.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

24

Đ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!

+0

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

+1

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

+2

đ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