2012-11-28 25 views
6

Được rồi, mã của tôi ở dưới vì vậy tôi sẽ giải thích những gì tôi đang làm và những gì tôi nhận được cho kết quả.navigator.geolocation.watchPosition không hoạt động

Tôi đang cố gắng lấy vị trí của người dùng bằng navigator.geolocation.watchPosition. Tôi đã chỉ định cả gọi lại thành công và lỗi. Lần đầu tiên tôi nhận được vị trí, nó thường rất không chính xác nên tôi sử dụng watchPosition để tiếp tục nhận vị trí cho đến khi nó được thử 4 lần hoặc có vị trí chính xác trong vòng 500 mét.

Vấn đề tôi đang gặp khó:

  • Nó KHÔNG BAO GIỜ đi vào callback lỗi cho android (thử nghiệm trên HTC Sensation và Samsung Galaxy S3). Tuy nhiên, trên iPhone, có vẻ như nhập cuộc gọi lại lỗi trên 50% thời gian.

  • Nó cũng không bao giờ hết thời gian chờ. Nó chỉ tiếp tục tìm kiếm cho đến khi nó nhận được một vị trí .

  • Mất khoảng 0-60 giây để truy xuất vị trí. Đôi khi nó có nó trước khi trang được thực hiện tải, lần khác phải mất phần tốt hơn của một phút. Cũng không có mô hình rõ ràng nào về lý do tại sao nó lại nhanh chóng và tại sao không phải lúc khác.

Tôi đã tìm kiếm nhiều bài đăng trên diễn đàn và nhiều câu hỏi về stackoverflow cũng như thông số định vị địa lý và bất kỳ tài liệu nào khác ngoài đó. Không có nhiều thông tin về nó, hãy để một mình những vấn đề này. Tôi có làm gì sai không? Hay đây chỉ là bản chất của làm việc với địa điểm?

if(navigator.geolocation){ 
     var geo_count = 0; 

     var wpid = navigator.geolocation.watchPosition(success, error, { 
      enableHighAccuracy: true, 
      maximumAge: 0, 
      timeout: 10000 
     }); 

     function success(position){ 
      alert(position.coords.accuracy) 

      geo_count = geo_count + 1; 

      if(position.coords.latitude && position.coords.longitude && position.coords.accuracy < 500){ 
       navigator.geolocation.clearWatch(wpid); 

       alert('position obtained!');  
      } 
      else if(geo_count > 4){ 
       navigator.geolocation.clearWatch(wpid); 

       alert('inaccurate position obtained'); 
      } 
     } 

     function error(error){ 
      switch(error.code){ 
       case 1: 
        alert('permission denied'); 
        break; 
       case 2: 
        alert('position unavailable'); 
        break; 
       case 3: 
        alert('timeout'); 
        break; 
       default: 
        alert('unknown error'); 
        break; 
      } 
     } 
    } 

Trả lời

2

Tôi khuyên bạn nên kiểm tra sử dụng:

if (typeof navigator.geolocation === 'object' && typeof navigator.geolocation.watchPosition === 'function') { 
    ... 
} 

"Phương pháp Geolocation.watchPosition() được sử dụng để đăng ký một hàm điều khiển sẽ được gọi tự động mỗi lần vị trí của thiết bị thay đổi Bạn cũng có thể tùy ý chỉ định lỗi xử lý chức năng gọi lại. "

Maby nó không kích hoạt vì vị trí vẫn như cũ? ^^

Cố gắng để gỡ lỗi nó bằng cách sử Geolocation.getCurrentPosition() với một Interval hoặc WebWorker: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

Chúc may mắn