(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应用程序状态的一些了解,已经深入研究了文档,但尚未点击。任何见解都非常感谢。
答案 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>在应用程序的生命周期中尽快启动。