Сохранение данных на базе iPhone при блокировке телефона - PullRequest
0 голосов
/ 29 августа 2018

Я работаю с базой данных Firebase Realtime.

Для этого я использую angularfire2.

Я также использую плагин фоновой геолокации, который позволяет получать GPS, когда приложение находится в фоновом режиме или полностью закрыто. Он использует службу определения местоположения.

В приведенном ниже примере я сосредоточусь на событии activityChange.

Данные получены, как и должно быть.

Но у меня проблема с сохранением данных.

Я сохраняю это в базе данных огня (как я упоминал выше).

На переднем и заднем плане - все работает нормально (я не буду говорить, когда приложение полностью закрыто в данный момент).

Но когда телефон заблокирован (iPhone - iOS) - постоянство перестает работать.

Если я разблокирую телефон - персистентность все еще не работает.

Если я восстанавливаю приложение - тогда постоянство начинает работать, и все запросы, которые были инициированы, в то время как персистентность не работала, запускаются одновременно.

Как будто они ждали в очереди.

Я полагаю, что приложение похоже на паузу, и интернет не доступен приложению после блокировки телефона. И возвращается, когда приложение восстанавливается, например, в режиме энергосбережения.

В XCODE, который я имею в Совместимости, я включил Режимы фона:

  • Обновления местоположения
  • Фоновая выборка
  • Удаленные уведомления

, но, похоже, это не так.

Исходный код ниже:

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';

@Injectable()
export class GeolocationService {
  private bgGeo: any;

  changesCount = 0;

  constructor(
    private db: AngularFireDatabase,
  ) {
    console.log('GeolocationService:constructor');
    this.configureBackgroundGeolocation();
  }

  configureBackgroundGeolocation() {
    console.log('GeolocationService:configureBackgroundGeolocation');
    // 1. Get a reference to the plugin
    this.bgGeo = (<any>window).BackgroundGeolocation;
    console.log('bgGeo:');
    console.log(this.bgGeo);
    if (this.bgGeo) {
      // 2. Listen to events
      this.bgGeo.on('activitychange', this.onActivityChange.bind(this));
    }
  }

  onActivityChange(data) {
    console.log('GeolocationService:onActivityChange');
    console.log('data:', data);

    this.db
      .object('/changes_count')
      .update({
        chanesFromStart: ++this.changesCount
      })
      .then(success => {
        console.log('onActivityChange - Save succeeded');
        console.log(success);
      })
      .catch(error => {
        console.log('onActivityChange - Unable to save the position');
        console.log(error);
      });
  }
}
...