背景服务cordova离子app。 Backgroudn插件无法在ios 8.3

时间:2015-05-19 10:37:17

标签: android ios cordova ionic-framework

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

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

支持的平台

  1. iOS(包括iOS8)
  2. Android(SDK> = 11)
  3. WP8
  4. 我错过了什么吗?

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

    $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;
        });
    });
    

2 个答案:

答案 0 :(得分:3)

虽然我正在探索相同的东西,但基本上没有纯混合方式来实现背景位置跟踪。但是,如果您感兴趣,可以使用本机iOS实现来实现相同的功能。

在开始Apple背景位置跟踪之前,您必须了解可能的方法的一些细节。

苹果应用可以通过两种方式跟踪位置,具体如下:

enter image description here

StartUpdatingLocations是一种位置跟踪启动方法,它会导致每秒调用位置更改的回调,直到除非您的应用位于前台/后台。

无论位置是否发生变化,都会每秒调用一次回调,这取决于处理和决定位置变化的方法,实际上这是位置变化。

当应用程序处于暂停/终止状态时,StartUpdatingLocations将无效。这实际上意味着即使在应用程序启动时调用了StartUpdatingLocations,只要应用程序在后台移动,即使有任何位置更改,也不会再调用回调。

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

  1. StartMonitoringSignificantLocationChanges是一种位置跟踪启动方法,只要用户位置发生重大更改,就会调用位置更改回调。

  2. 此方法主动使用移动电话塔位置更改,并且据记录提供每500-1000米的位置更新。

  3. 即使应用处于后台/已终止/暂停,StartMonitoringSignificantLocationChange也可以继续更新位置。

  4. 此方法的位置更新不是非常可靠,个人使用情况表明位置更新有点随意,并且严重依赖于蜂窝位置更新。

  5. 现在你想要做的事情在Android中很容易,但它不在iOS中。

    我不会重新发明这个循环,但你可以探索完整的细节here

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

    [myLocationManager startUpdatingLocation];
    

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

    但是在终止/暂停应用程序时获取位置的情况下,您不能使用[myLocationManager startUpdatingLocation];使它工作的唯一方法是使用: -

    [anotherLocationManager startMonitoringSignificantLocationChanges];
    

    另一个重要的诀窍是,你必须知道如何在app委托“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];
        }
    

答案 1 :(得分:1)

我发现我必须在xcode中的资源下的projectname-Info.plist中添加后台模式,如下所示:

Info.plist

即使应用程序处于后台或设备已锁定,它也会发送地理位置。