android-后台服务cordova ionic应用程序. Backgroudn插件在iOS 8.3上不起作用

我想实现将地理位置发送到服务器的后台服务.因此,我使用了https://github.com/katzer/cordova-plugin-background-mode的插件cordova-plugin-background-mode,可与android一起使用.

但是,如果我在iOS 8.3上运行该应用程序并按“主页”按钮,则该应用程序将停止将地理位置发送到服务器.在插件的文档中说:

支持平台

> iOS(包括iOS8)
>安卓(SDK> = 11)
> WP8

我想念什么吗?

编辑:这是我控制器的一些代码

$ionicPlatform.ready(function() {

  var watchOptions = {
    frequency : 1000,
    timeout : 5*60*1000,
    enableHighAccuracy: true 
  };

  var watch = $cordovaGeolocation.watchPosition(watchOptions);
  watch.then(
    null,
    function(err) {
      alert("WatchPosition failed: "+JSON.stringify(err));
    },
    function(position) {

      $scope.position = position;
    });
});

解决方法:

当我探索相同的东西时,基本上没有纯粹的混合方法来实现背景位置跟踪.但是,如果您有兴趣,可以使用本机iOS实现来实现相同的功能.

在继续进行Apple背景位置跟踪之前,您必须了解一些可能的方法的详细信息.

苹果应用程序可以通过两种方式跟踪位置,它们如下:

> startUpdatingLocations

StartUpdatingLocations是一种位置跟踪初始化方法,它将导致每秒调用一次位置更改回调,直到并且除非您的应用程序处于前台/后台.

无论位置是否已更改,回调都会每秒调用一次,这取决于处理和确定位置更改的方法,而实际上这是位置更改.

当应用处于暂停/终止状态时,StartUpdatingLocations将不起作用.这实质上意味着,即使在应用启动时调用了StartUpdatingLocations,只要应用在后台移动,即使位置发生了任何变化,回调也将不再被调用.

StartUpdatingLocations提供最准确的位置更新.

> startMonitoringSignificantLocationChanges

> StartMonitoringSignificantLocationChanges是一种位置跟踪初始化方法,当用户所在位置发生重大变化时,该方法将导致调用位置更改的回调.
>该方法主动使用蜂窝塔位置更改,并且如记录所示,每500-1000米提供一次位置更新.
> StartMonitoringSignificantLocationChanges可以继续更新位置,即使该应用处于后台/终止/挂起状态也是如此.
>这种方法的位置更新不是很可靠,个人使用情况表明位置更新有些杂乱无章,并且在很大程度上取决于蜂窝电话位置更新.

现在,您尝试做的事情在Android中非常容易,但是在iOS中却不然.

我不会重造周期,但是您可以探索完整的细节here

对于iOS 7和8,在后台连续获取位置的方法是使用“ startUpdatingLocation”方法

[myLocationManager startUpdatingLocation];

然后下一个技巧将放在委托方法“ didUpdateLocations”上.您将必须使用计时器并适当地处理后台任务.任何缺少的步骤和位置将不会连续更新.

但是,如果要在应用终止/挂起时获取位置,则不能使用[myLocationManager startUpdatingLocation];使它起作用的唯一方法是使用:-

[anotherLocationManager startMonitoringSignificantLocationChanges];

另一个重要的技巧是,您将必须知道如何处理应用程序委托“ didFinishLaunchingWithOptions”上的键“ UIApplicationLaunchOptionsLocationKey”.这是示例代码:-

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.shareModel = [LocationShareModel sharedModel];

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { 
      self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
      self.shareModel.anotherLocationManager.delegate = self;
      self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
      self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;

      if(IS_OS_8_OR_LATER) {
        [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
      }
     [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];   

    }    
        return YES;
    }

除了didFinishLaunchingWithOptions方法之外,您还必须在应用程序处于活动状态时创建locationManager实例.以下是一些代码示例:

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        [self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];

        if(IS_OS_8_OR_LATER) {
            [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
        }
        [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
    }

    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        if(self.shareModel.anotherLocationManager)
            [self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];

        self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
        self.shareModel.anotherLocationManager.delegate = self;
        self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
        self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;

        if(IS_OS_8_OR_LATER) {
            [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
        }
        [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
    }
上一篇:javascript-从外部(cordova)访问Ember应用程序实例


下一篇:Urban-Airship Facebook Cordova插件android-support-v4冲突