Я пытаюсь создать приложение для отслеживания местоположения iOS с помощью плагина Ionic 5 Framework, Angular и Cordova Geolocation.

Я имел обыкновение получать изменения местоположения пользователя с помощью функции watchPosition (), и она отлично работала на устройствах Android. Тем не менее, он не работает на устройствах iOS.

Мой новый подход заключается в том, чтобы получить текущее местоположение с помощью функции getCurrentPosition () в сочетании с setInterval (). Чтобы получить обновленное местоположение каждые одну или две секунды.

К сожалению, сейчас я получаю следующую ошибку:

Ошибка типа: this.watchLocationUpdates.subscribe не является функцией

Кто-нибудь идея, как это исправить?

  watchLocation() {
    const options = {
      maximumAge: 3600000,
      timeout: 5000,
      enableHighAccuracy: true,
    };
    this.isWatching = true;
    this.trackingId =  '-' + Math.random().toString(36).substr(2, 28);

    // Please find relevant setInterval() part below
    this.watchLocationUpdates = setInterval(() => { this.geolocation.getCurrentPosition(options); }, 1000);
    this.watchLocationUpdatesSub = this.watchLocationUpdates.subscribe((resp) => {
      this.geoLocations = resp.coords;
      this.geoLatitude = resp.coords.latitude;
      this.geoLongitude = resp.coords.longitude;
      this.geoAccuracy = Math.trunc(resp.coords.accuracy);
      this.timeStamp = resp.timestamp;

      const position = new google.maps.LatLng(resp.coords.latitude, resp.coords.longitude);
      this.map.setCenter(position);
      this.map.setZoom(16);

      this.markers.map(marker => marker.setMap(null));
      this.markers = [];
        const latLng = new google.maps.LatLng(resp.coords.latitude, resp.coords.longitude);
        const marker = new google.maps.Marker({
          map: this.map,
          icon: {
            path: google.maps.SymbolPath.CIRCLE,
            scale: 13,
            fillColor: '#1AA0EC',
            fillOpacity: 1,
            strokeColor: 'white',
            strokeWeight: 2
        },
          position: latLng
        });
        this.markers.push(marker);

      console.table('watchLocation function called', {
        trackingId: this.trackingId,
        latitude: this.geoLatitude,
        longitude: this.geoLongitude,
        accuracy: this.geoAccuracy,
        timeStamp: this.timeStamp,
        uId: this.uId
        });
      this.geolocationService.insertUserGeolocation({
        trackingId: this.trackingId,
        latitude: this.geoLatitude,
        longitude: this.geoLongitude,
        accuracy: this.geoAccuracy,
        timeStamp: this.timeStamp,
        uId: this.uId
        })
        .subscribe((response) => {
          localStorage.setItem('lastLocation', JSON.stringify({
            trackingId: this.trackingId,
            latitude: this.geoLatitude,
            longitude: this.geoLongitude,
            accuracy: this.geoAccuracy,
            timeStamp: this.timeStamp,
            uId: this.uId
            }));
          console.log(`user location data inserted in FB`, {
            trackingId: this.trackingId,
            latitude: this.geoLatitude,
            longitude: this.geoLongitude,
            accuracy: this.geoAccuracy,
            timeStamp: this.timeStamp,
            uId: this.uId
            });
        });
      });
  }```
-1
HansiFLK 31 Дек 2019 в 17:37
1
setInterval не возвращает Observable или Обещаю в этом отношении. Он возвращает идентификатор интервала, который однозначно определяет интервал. Вы не можете подписаться на него.
 – 
R. Richards
31 Дек 2019 в 17:42
Спасибо за Ваш ответ. Я не опытный программист. Вы знаете, как это исправить?
 – 
Valentino
31 Дек 2019 в 17:43
2
interval - наблюдаемая альтернатива setInterval().
 – 
rveerd
31 Дек 2019 в 17:47

1 ответ

Вы можете использовать interval() из RxJS:

// RxJS v6+
import { interval } from 'rxjs';

const source = interval(1000);

source.subscribe(/* your logic here */);
0
Elias Soares 31 Дек 2019 в 17:48
Большое спасибо. К сожалению, я не могу найти способ реализовать это в моей существующей логике. Вы знаете, как это решить?
 – 
Valentino
31 Дек 2019 в 17:56