在位置事件中适当地在后台启动iOS应用

时间:2018-10-04 16:29:14

标签: ios objective-c swift

(iOS 11,Swift 4.1)

我迅速编写了一个cordova插件来处理区域监视,但是当我的应用程序被暂停或终止时,它无法正常工作。这是我班上的相关功能:

class GeofenceManager : NSObject, CLLocationManagerDelegate {

  func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) {
      switch state {
          case .inside:
              log ("Did Enter Region: " + region.identifier)
              self.postGeofenceTransition(region: region, transitionType: 1)
              break
          case .unknown:
              log ("Unknown Transition for region: " + region.identifier)
              // self.postGeofenceTransition(region: region, transitionType: 1)
              break
          default:
              break
        }
    }

    func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
        log ("Did Exit Region: " + region.identifier)
        self.postGeofenceTransition(region: region, transitionType: 2)
    }

    func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
        log("Did start monitoring region: " + region.identifier)
        self.locationManager.requestState(for: region)
    }
}

(我这样做是为了处理我们开始监视时已经在该地区的人)

我还获得了“ didChangeAuthorizationStatus”,它可以获取并设置所有地理围栏,效果很好。

在我的AppDelegate(objc)中,如果尝试通过区域事件打开应用,我正在尝试启动位置服务,

if([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
    _locationManager = [[CLLocationManager alloc] init];
    [_locationManager setDelegate:self];
    [_locationManager setDistanceFilter:kCLHeadingFilterNone];
    //change the desired accuracy to kCLLocationAccuracyBest
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    //SOLUTION: set setPausesLocationUpdatesAutomatically to NO
    [_locationManager setPausesLocationUpdatesAutomatically:NO];
    [_locationManager startUpdatingLocation];
}

我的问题是,如果从某个事件(即“ didEnterRegion”)打开了我的应用程序,我会立即启动位置服务,但是我会再次点击“ didEnterRegion”委托吗?我在这里做错什么吗?

我认为我缺少对iOS应用程序状态的一些了解,已经深入研究了文档,但尚未点击。任何见解都非常感谢。

1 个答案:

答案 0 :(得分:2)

  

我的问题是,如果从某个事件(即“ didEnterRegion”)打开了我的应用程序,我会立即启动定位服务,但是我会再次点击“ didEnterRegion”委托吗?

如果您的应用已被暂停或终止,并且只是为了接收services: - postgresql before_script: - travis_wait 30 yarn install - psql -c 'create database myDiary;' -U postgres - travis_wait npm install - node build/models/database.js 而被唤醒或启动,则它会保留在后台。有时间只是为了处理这一事件,然后将其暂停。

此时您无法使用didEnterRegion开始位置更新。你在后台!即使您被授权进行后台更新,您也不能在后台开始获取更新。而且即使您可以,您的 代码也会失败,因为您从未设置startUpdatingLocation。而且即使您可以执行 操作,也不会收到任何事件,因为您没有allowsBackgroundLocationUpdates的实现。

正确的步骤是:什么也不做。只需处理didUpdateLocation并离开。如果用户再次进入该区域,您的didEnterRegion将被再次调用。区域监视将一直持续直到您将其停止(并确保您执行将其停止,否则可能会迫使用户删除您的应用程序)。

附录:如何在这样的后台响应从头开始?您可以在didEnterRegion中检测密钥并在那里进行处理并返回didFinishLaunchWithOptions,也可以忽略它并返回false并接收true。但是,无论哪种方式,您都必须立即创建一个位置管理器并任命其代表,否则您一无所获。这就是为什么您应该始终创建位置管理器,并在您的应用程序委托或根视图控制器中设置其委托的原因,总是存在并且以 early < / em>在应用程序的生命周期中尽快启动。