我想实现一个后台服务,它将地理定位发送到服务器。因此我使用了来自https://github.com/katzer/cordova-plugin-background-mode的插件cordova-plugin-background-mode,它与android一起使用。
但是,如果我在iOS 8.3上运行应用程序并按下主页按钮,应用程序会停止将地理位置发送到服务器。在插件的文档中,它说:
支持的平台
我错过了什么吗?
编辑:这是我控制器的一些代码
$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;
});
});
答案 0 :(得分:3)
虽然我正在探索相同的东西,但基本上没有纯混合方式来实现背景位置跟踪。但是,如果您感兴趣,可以使用本机iOS实现来实现相同的功能。
在开始Apple背景位置跟踪之前,您必须了解可能的方法的一些细节。
苹果应用可以通过两种方式跟踪位置,具体如下:
StartUpdatingLocations是一种位置跟踪启动方法,它会导致每秒调用位置更改的回调,直到除非您的应用位于前台/后台。
无论位置是否发生变化,都会每秒调用一次回调,这取决于处理和决定位置变化的方法,实际上这是位置变化。
当应用程序处于暂停/终止状态时,StartUpdatingLocations将无效。这实际上意味着即使在应用程序启动时调用了StartUpdatingLocations,只要应用程序在后台移动,即使有任何位置更改,也不会再调用回调。
StartUpdatingLocations提供最准确的位置更新。
StartMonitoringSignificantLocationChanges是一种位置跟踪启动方法,只要用户位置发生重大更改,就会调用位置更改回调。
此方法主动使用移动电话塔位置更改,并且据记录提供每500-1000米的位置更新。
即使应用处于后台/已终止/暂停,StartMonitoringSignificantLocationChange也可以继续更新位置。
此方法的位置更新不是非常可靠,个人使用情况表明位置更新有点随意,并且严重依赖于蜂窝位置更新。
现在你想要做的事情在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中添加后台模式,如下所示:
即使应用程序处于后台或设备已锁定,它也会发送地理位置。