我有一个应用程序,用户可以通过gps跟踪他的活动。
所有功能都可以通过背景GPS更新实现,但是非常罕见的情况(1000个中的1个),当我的应用处于后台时,我只是没有收到来自CLLocationManager
的更新电话。不是立即,但过了一段时间。
我的应用程序开始接收更新,然后突然(可能是几分钟或几小时的跟踪)它不会再获得更多位置更新。只要应用程序再次处于活动状态,它就会继续报告位置。但当然那些遗失的地方很糟糕!
我没有弄清楚它何时以及为什么会发生,这就是为什么我想问其他人是否已经遇到过同样的问题?我可以说这不是一个电话或类似的东西正在打断。我也没有在didFail委托方法中获得回调。我再也没有得到任何东西...... 最大的问题是我没有关于如何调试它的IDEA,因为我不能故意重现它。
非常感谢任何帮助。
修改
以下是我设置位置管理器的方法
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = kMinimumDistanceFilter;
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
self.locationManager.activityType = CLActivityTypeFitness;
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
{
self.locationManager.allowsBackgroundLocationUpdates = YES;
}
然后在点击开始录制按钮时
[self.locationManager startUpdatingLocation];
编辑2:
如果您启动此服务并且您的应用已暂停,则系统会停止 交付事件,直到您的应用程序再次开始运行(在...中) 前景或背景)。如果您的应用程序被终止,则交付 新的位置事件完全停止。因此,如果您的应用需要 要在后台接收位置事件,它必须包括 其Info.plist中的UIBackgroundModes键(具有位置值) 文件。
我甚至不在后台startUpdatingLocation
......但似乎这就是我的应用程序发生的事情。如果应用程序被暂停,我怎么能开始跟踪?那是不可能的,不是吗?原因暂停意味着它没有执行代码?!?
答案 0 :(得分:1)
您allowsBackgroundLocationUpdates
中的YES
设置为Info.plist
吗?
来自文档:
默认情况下,对于链接到iOS 9.0或iOS的应用程序,这是NO 以后,无论最低部署目标如何。
将UIBackgroundModes设置为在Info.plist中包含“location” 每次调用时,还必须在运行时将此属性设置为YES -startUpdatingLocation,目的是在后台继续。
当UIBackgroundModes不包含时,将此属性设置为YES “位置”是一个致命的错误。
将此属性重置为NO等同于省略“location” 来自UIBackgroundModes值。访问位置仍然是 在应用程序运行时(即未暂停)允许,以及 有足够的授权(即它具有WhenInUse授权并且是 在使用中,或它具有始终授权)。但是,该应用程序仍然会 遵守通常的任务暂停规则。
请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization for 有关可能的授权值的更多详细信息。