背景地理位置:Promise <any>

时间:2019-02-14 05:12:41

标签: angular ionic-framework ionic3 ionic4

您好,我的开发人员朋友们,我使用的是ionic 4,并试图从GPS获取用户位置,特别是每隔1小时。因此,这是一个每小时跟踪用户位置的应用。

我从那里的官方网站上使用过Ionic 4 Background location插件文档,并找到了此代码来安装此插件,该代码说明即使应用程序退出,该插件也可以运行,所以我希望这是我需要的。

我已使用以下代码将Background-Geolocation插件安装到Ionic 4应用程序:

ionic cordova plugin add cordova-plugin-mauron85-background-geolocation@alpha
npm install @ionic-native/background-mode

但是在我尝试对其进行测试之后,在我的app.component.ts主文件中,代码失败了!

this.platform.ready().then(() => { 

      this.statusBar.styleDefault();
      this.splashScreen.hide();

      //setting options for backgroun-geolocatuion
      const config: BackgroundGeolocationConfig = {
        desiredAccuracy: 10,
        stationaryRadius: 20,
        distanceFilter: 30,
        debug: true, 
        stopOnTerminate: false,  
     };



      this.backgroundGeolocation.configure(config)
      .subscribe((location: BackgroundGeolocationResponse) => {

      // ERROR comes here ==> *subscribe* does not exist on type Promise<any> ???  

        alert(location.longitude);  
      });

      this.backgroundGeolocation.start();

    });

它显示此错误:

 // ERROR comes here ==> Subscribe does not exist on type Promise<any>

由于此错误,我无法将返回的数据作为订阅数据。我需要每1小时间隔一次的用户位置数据(即使用户是否移动),但是此订阅显示了我上面所述的错误。 一件事,如果我将“ subscribe”更改为“ then”,那么它将一次返回数据,但也未定义。

我需要此代码与订阅一起运行,以便每小时获取定期跟踪的用户信息。

请帮助我,我需要为我的工作完成这个项目。我已经尝试了一切,但没有任何线索。

感谢进阶:)

P.S:我已经在代码上方和主模块文件中导入了所有提供程序和构造函数。

进口:

*app/app.component.ts*



import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { BackgroundGeolocation } from '@ionic-native/background-geolocation/ngx';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
  providers: [
    StatusBar,
    BackgroundGeolocation, 
    SplashScreen,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

6 个答案:

答案 0 :(得分:0)

this.backgroundGeoLocation.configure(config)仅用于地理定位的配置,它是表示配置成功或失败的承诺。

首先安装以下内容:

ionic cordova plugin add cordova-plugin-geolocation
npm install --save @ionic-native/geolocation
ionic cordova plugin add cordova-plugin-mauron85-background-geolocation
npm install --save @ionic-native/background-geolocation

现在将它们包括在您的提供商中

app.module.ts

import {LocationTrackerProvider} from '../providers/location.provider';
import { BackgroundGeolocation } from '@ionic-native/background-geolocation';
import { Geolocation } from '@ionic-native/geolocation';

创建location.provider.ts(已添加到app.module.ts中)

location.provider.ts

import { BackgroundGeolocation } from '@ionic-native/background-geolocation';
import { Geolocation, Geoposition } from '@ionic-native/geolocation';

constructor(private backgroundGeolocation: BackgroundGeolocation){}

initLocation(){

    let config = {
        ...
    };

    this.backgroundGeolocation.configure(config).subscribe((location) => {
      console.log('BackgroundGeolocation:  ' + location.latitude + ',' + location.longitude);

    }, (err) => {
      console.log(err);
    });

}

答案 1 :(得分:0)

这似乎是版本不匹配-到处都是许多版本和冲突的文档。经过多次尝试错误,

对于离子3 这对我有用...

$ ionic cordova plugin add cordova-plugin-mauron85-background-geolocation@2.2.5
$ npm install --save @ionic-native/background-geolocation@3

对于离子4 试试吧,它可能会对您有所帮助。

答案 2 :(得分:0)

Mayank的回答对我有所帮助,但是版本2.2.5生成的构建失败,并导致以下错误-

AAPT:错误:找不到资源android:attr / fontVariationSettings。

我会推荐-

$ ionic cordova插件添加cordova-plugin-mauron85-background-geolocation@2.3.5
$ npm install --save @ ionic-native / background-geolocation @ 3

链接:php callable

希望这对某人有帮助。

答案 3 :(得分:0)

在Ionic 4中,实现已更改,因为您可以看到Ionic 4的文档。 他们必须更新它以保证,所以我们现在不能订阅。承诺时再使用。

https://ionicframework.com/docs/native/background-geolocation/

适用于Ionic 4

下面是代码段解决了此问题

import { BackgroundGeolocation, BackgroundGeolocationConfig, BackgroundGeolocationResponse } from '@ionic-native/background-geolocation';

constructor(private backgroundGeolocation: BackgroundGeolocation) { }

...

const config: BackgroundGeolocationConfig = {
            desiredAccuracy: 10,
            stationaryRadius: 20,
            distanceFilter: 30,
            debug: true, //  enable this hear sounds for background-geolocation life-cycle.
            stopOnTerminate: false, // enable this to clear background location settings when the app terminates
    };

this.backgroundGeolocation.configure(config)
  .subscribe((location: BackgroundGeolocationResponse) => {

    console.log(location);

    // IMPORTANT:  You must execute the finish method here to inform the native plugin that you're finished,
    // and the background-task may be completed.  You must do this regardless if your HTTP request is successful or not.
    // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
    this.backgroundGeolocation.finish(); // FOR IOS ONLY

  });

// start recording location
this.backgroundGeolocation.start();

// If you wish to turn OFF background-tracking, call the #stop method.
this.backgroundGeolocation.stop();

对于Ionic 3,如果此错误发生在后台地理位置插件中。

// ERROR comes here ==> Subscribe does not exist on type Promise<any>

删除最新的插件,并将其替换为

npm rm --save @ionic-native/background-geolocation  
npm install --save @ionic-native/background-geolocation@5.0.0-beta.21 

答案 4 :(得分:0)

this.backgroundGeolocation.configure(config).then((location)=> {     this.backgroundGeolocation.on(BackgroundGeolocationEvents.location).subscribe((location:BackgroundGeolocationResponse)=> {         console.log('BackgroundGeolocationResponse',location);     },(err)=> {         console.log(err);     })

答案 5 :(得分:0)

我遇到了这个问题,发现文档不正确。

您需要从 def new_item(self, color): self.item = GraphicsPathItem(color) self.scene().addItem(self.item) self.path = QPainterPath() 而不是@ionic-native/background-geolocation/ngx导入。

这将允许订阅。