我正在尝试在我的应用处于后台时获取位置。当我使用我的应用程序时,一切都很好。我也可以切换到任何其他应用程序(甚至是主屏幕)并且位置仍然存在。如果我正在使用我的手机但我的应用程序位于后台位置,只要我的手机处于活动状态,更新似乎就会很好(没有锁定)。
但是,如果我锁定手机并在大约10分钟后回来,状态栏中的位置图标和我的应用程序将不再获取位置更新。
我检查了应用程序崩溃,但没有崩溃报告。我的应用程序仍然出现在应用程序列表中,所以我不认为它崩溃了。
如果我要求“永远”,GPS应该永远保持开启状态。允许。或者在手机睡了一段时间后,操作系统会将其关闭吗?
以下是我的plist中的条目:
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
以下是背景位置服务的屏幕截图:
这是我的自定义类,即位置管理器委托:
@interface LocationDelegate ()
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
@implementation LocationDelegate
+ (instancetype) singleton {
static LocationDelegate *delegate = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
delegate = [[self alloc] init];
});
return delegate;
}
- (id) init {
if (self = [super init]) {
// for now filter and accuracy are based on the same preference
_locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
_locationManager.delegate = self;
// Check for iOS 8
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_locationManager requestAlwaysAuthorization];
}
return self;
}
请注意,它是一个单身人士。那有关系吗?在我的应用程序在后台暂停一段时间或暂停后,此类是否已清理干净?从我所看到的,我不认为这样的单身人士得到了清理,因为他们是强有力的参考,所以我不认为这是问题...但我真的不知道为什么我停止获取位置一段时间。
修改
似乎我的位置管理员在一段时间后暂停了位置更新。我没有收到简历的大问题。
我将activityType设置为默认值
CLActivityTypeOther
我可以尝试其他的活动类型,看看是否会产生影响。但是我依靠我的应用程序来行走和开车。
我想我遇到了同样的问题:
答案 0 :(得分:3)
不,它不一定继续在后台运行。默认情况下,pausesLocationUpdatesAutomatically
设置为YES,结合activityType
(如果设置)帮助操作系统确定何时可以安全地暂停位置更新以节省电量。如果操作系统暂停了您的更新,您可以实施locationManagerDidPauseLocationUpdates:
委托来记录。
另外,为了清楚起见,设置requestAlwaysAuthorization
并不意味着locationManager将继续运行,这只意味着您的应用可以从前台或后台或暂停模式启动locationManager。
答案 1 :(得分:0)
是的,只要您在BackgroundModes中允许它,它就应该保持开启状态,请求NSLocationAlwaysUsageDescription
并添加NSLocationAlwaysUsageDescription
。但是,Amount
必须有描述,您的XML看起来就像没有。显然,您还需要调用startUpdatingLocation。
如果您认为您的单身人士可能是问题的一部分,请尝试将代码移至appDelegate。
答案 2 :(得分:0)
暂停后重启会产生与不让它暂停相同的效果。是的,这是一个电池命中,但我唯一的选择,如果我想让它在用户再次开始移动时运行。