我正在尝试在我的应用程序处于后台时获取位置。当我使用我的应用程序时,一切都很好。我也可以切换到任何其他应用程序(甚至是主屏幕)并且位置仍然会出现。如果我正在使用我的手机但我的应用程序在后台,只要我的手机处于事件状态,位置更新似乎就可以正常使用(未锁定)。
但是,如果我锁定手机并在大约 10 分钟后返回,状态栏中的位置图标和我的应用程序将不再获取位置更新。
我已经检查了应用程序崩溃,但没有崩溃报告。我的应用程序也仍然出现在应用程序列表中,所以我认为它没有崩溃。
如果我请求“始终”许可,GPS 是否应该永远保持打开状态。还是在手机休眠一段时间后操作系统将其关闭?
这是我的 plist 中的条目:
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
这是后台位置服务的屏幕截图:
这是我的自定义类,它是位置管理器委托(delegate):
@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
我可以尝试其他事件类型,看看是否会有所不同。但是,我依靠我的应用程序来处理步行和驾驶。
我想我遇到了同样的问题:
最佳答案
不,它不一定继续在后台运行。默认情况下,pausesLocationUpdatesAutomatically
设置为 YES,这与 activityType
(如果已设置)一起帮助操作系统确定何时可以安全地暂停位置更新以节省电量。您可以实现 locationManagerDidPauseLocationUpdates:
委托(delegate)来记录操作系统是否暂停了您的更新。
此外,需要说明的是,设置 requestAlwaysAuthorization
并不意味着 locationManager 会继续运行,它只是意味着您的应用可以从前台或后台或挂起模式启动 locationManager。
关于iOS 位置管理器在手机锁定约 10 分钟后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151923/