我想实现将地理位置发送到服务器的后台服务.因此,我使用了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提供最准确的位置更新.
> 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];
}