iOS 位置管理器在手机锁定约 10 分钟后停止

标签 ios objective-c iphone cllocationmanager

我正在尝试在我的应用程序处于后台时获取位置。当我使用我的应用程序时,一切都很好。我也可以切换到任何其他应用程序(甚至是主屏幕)并且位置仍然会出现。如果我正在使用我的手机但我的应用程序在后台,只要我的手机处于事件状态,位置更新似乎就可以正常使用(未锁定)。

但是,如果我锁定手机并在大约 10 分钟后返回,状态栏中的位置图标和我的应用程序将不再获取位置更新。

我已经检查了应用程序崩溃,但没有崩溃报告。我的应用程序也仍然出现在应用程序列表中,所以我认为它没有崩溃。

如果我请求“始终”许可,GPS 是否应该永远保持打开状态。还是在手机休眠一段时间后操作系统将其关闭?

这是我的 plist 中的条目:

<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

这是后台位置服务的屏幕截图:

enter image description here

这是我的自定义类,它是位置管理器委托(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

我可以尝试其他事件类型,看看是否会有所不同。但是,我依靠我的应用程序来处理步行和驾驶。

我想我遇到了同样的问题:

iPhone GPS in background never resumes after pause

最佳答案

不,它不一定继续在后台运行。默认情况下,pausesLocationUpdatesAutomatically 设置为 YES,这与 activityType(如果已设置)一起帮助操作系统确定何时可以安全地暂停位置更新以节省电量。您可以实现 locationManagerDidPauseLocationUpdates: 委托(delegate)来记录操作系统是否暂停了您的更新。

此外,需要说明的是,设置 requestAlwaysAuthorization 并不意味着 locationManager 会继续运行,它只是意味着您的应用可以从前台或后台或挂起模式启动 locationManager。

关于iOS 位置管理器在手机锁定约 10 分钟后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151923/

相关文章:

c++ - 在 iOS 应用程序中使用 C++ 代码

objective-c - 如何将 Swift 代码导入 Objective-C?

iphone - 什么时候可以使用glReadPixels?

iphone - #define 宏中的代码是否添加到构建中?

iphone - iPhone 应用程序中的 "Server certificate untrusted"错误

iphone - iOS:如何链接正在开发的App Store链接

ios - 如何在SimCity 5中实现建筑物移动时摇摆的物理效果?

android - iOS 是否像 Android 一样提供多个 'apk' 支持?

ios - 登录 FB 用户的相册

iphone - 当内存警告不足时,通过界面构建​​器添加的 View 会发生什么情况?