2016-12-02 21 views
10

Tôi đang sử dụng airbnb's map để phản ứng gốc trên ứng dụng của tôi. Câu hỏi này dành cho ứng dụng android vì tôi chưa nhận được ứng dụng iOS.Theo dõi vị trí của người dùng trên MapView của React Native AirBnb [Android]

Vấn đề của tôi:

navigator.geolocation hoạt động tốt trên giả lập, nhưng phải mất quá nhiều thời gian trên các thiết bị thực tế, đến mức đôi khi nó lần ra trên các thiết bị cũ.

Những gì tôi đã nhận thấy:

nếu showsUserLocation prop được thiết lập là true, tôi có thể thấy nguồn gốc "vị trí hiện tại" điểm đánh dấu trên con đường bản đồ trước khi getCurrentPosition giải quyết.

Những gì tôi muốn:

  1. Tôi muốn khu vực của tôi luôn được tập trung vào vị trí của người dùng.
  2. Tôi muốn một cách để truy cập api vị trí địa lý gốc (phải là nhanh hơn?) Hoặc có thể ai đó nói cho tôi biết tôi đang làm gì sai. Dưới đây là mẫu mã.
  3. Tôi muốn vẫn có thể phát hiện vị trí của người dùng ngay cả sau khi dịch vụ vị trí đã được bật/tắt. Đây là hành vi của showsUserLocation chống đỡ, nhưng có vẻ như một khi lỗi watchPostion, nó dừng hoàn toàn.

Dưới đây là những gì tôi có cho đến nay, nó rất đơn giản vì nó là:

componentDidMount() { 
    navigator.geolocation.getCurrentPosition(
     (position) => { 
     console.log("getCurrentPosition Success"); 
     this.setState({ 
      region: { 
      ...this.state.region, 
      latitude: position.coords.latitude, 
      longitude: position.coords.longitude, 
      } 
     }); 
     this.props.resetNotifications(); 
     this.watchPosition(); 
     }, 
     (error) => { 
     this.props.displayError("Error dectecting your location"); 
     alert(JSON.stringify(error)) 
     }, 
     {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000} 
    ); 
    } 

    watchPosition() { 
    this.watchID = navigator.geolocation.watchPosition(
     (position) => { 
     console.log("watchPosition Success"); 
     if(this.props.followUser){ 
      this.map.animateToRegion(this.newRegion(position.coords.latitude, position.coords.longitude)); 
     } 
     }, 
     (error) => { 
     this.props.displayError("Error dectecting your location"); 
     }, 
     {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000} 
    ); 
    } 
+0

Bạn nên ra khỏi văn phòng hoặc nhà riêng với thiết bị để kiểm tra vị trí của bạn. Phải là 'enableHighAccuracy: true' trong các thiết bị thực. Nó làm việc cho tôi hoàn hảo. –

+0

kiểm tra câu hỏi này http://stackoverflow.com/a/38125402/2955679 –

+0

@pedropeixoto Tôi đã làm chính xác tất cả những gì đã hỏi trong hướng dẫn cài đặt nhưng showsUserLocation không hoạt động đối với tôi. Bạn có thể giúp tôi không.? – HelpingHand

Trả lời

4

Tôi đã luôn luôn tìm thấy watchPosition iffy giữa các trình duyệt khác nhau, một điều đã làm việc cho tôi trước đây là thay thế bằng getCurrentPosition bên trong một setInterval để nó sẽ nhận được vị trí vài giây một lần và nếu nó không thành công khi nó sẽ truy xuất y khoảng thời gian tiếp theo, không giống như watchPosition sẽ ngừng xem nếu xảy ra lỗi.

Nói chung trình duyệt geolocation không phải là rất đáng tin cậy, bạn có thể kiểm tra chủ đề này cho một số vấn đề https://github.com/facebook/react-native/issues/7495

Một lựa chọn khác mà chắc chắn sẽ nhanh hơn và có lẽ đáng tin cậy hơn là sử dụng geolocation API bản địa. Kiểm tra câu hỏi này cho các thư viện hiển thị vị trí địa lý gốc cho phản ứng gốc React-native Android geolocation

+1

Có rất nhiều thông tin về các liên kết bạn đã gửi, nhưng nó sẽ giúp tôi tiếp tục đảm bảo. Tiền thưởng sắp kết thúc nên tôi sẽ trao cho bạn. Cảm ơn! – pedropeixoto

+1

Cảm ơn. Điểm mấu chốt là sử dụng plugin vị trí địa lý gốc để có độ tin cậy cao hơn. Chúc may mắn – Gaafar

0

Không chắc chắn nếu điều này sẽ giải quyết vấn đề của bạn, nhưng hãy thử này:

navigator.geolocation.getCurrentPosition(
    (position) => { 
    console.log("getCurrentPosition Success"); 
    this.setState({ 
     region: { 
     ...this.state.region, 
     latitude: position.coords.latitude, 
     longitude: position.coords.longitude, 
     } 
    },() => { 
     this.props.resetNotifications(); 
     this.watchPosition(); 
    }); 
    }, 
Các vấn đề liên quan