Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CLLocationManager有时会在应用程序处于后台时停止更新_Iphone_Ios_Ipad_Cllocationmanager_Cllocation - Fatal编程技术网

Iphone CLLocationManager有时会在应用程序处于后台时停止更新

Iphone CLLocationManager有时会在应用程序处于后台时停止更新,iphone,ios,ipad,cllocationmanager,cllocation,Iphone,Ios,Ipad,Cllocationmanager,Cllocation,我有一个应用程序,它使用CLLocationManager跟踪用户的路线,沿着所走的路径画点。应用程序在后台运行,使用所需的后台模式>应用程序注册位置更新 据我所知,在后台发生的任何事情都需要从locationManager:didUpdateToLocation:fromLocation调用,因为这是每次位置更新都会调用的方法 我遇到的问题是,有时这会停止被呼叫。当用户的位置在15分钟左右的时间内变化不大时,这种情况似乎就会发生。据我所知,对locationManager:didUpdateT

我有一个应用程序,它使用
CLLocationManager
跟踪用户的路线,沿着所走的路径画点。应用程序在后台运行,使用所需的后台模式>应用程序注册位置更新

据我所知,在后台发生的任何事情都需要从
locationManager:didUpdateToLocation:fromLocation
调用,因为这是每次位置更新都会调用的方法

我遇到的问题是,有时这会停止被呼叫。当用户的位置在15分钟左右的时间内变化不大时,这种情况似乎就会发生。据我所知,对locationManager:didUpdateToLocation:fromLocation的呼叫刚刚停止,大概是为了节省电池。不幸的是,当您重新开始工作时,它不会再次恢复

我认为没有办法覆盖这种行为,所以我想使用通知中心通知用户应用程序不再记录路线。问题是,应用程序如何知道发生了这种情况?如果未调用locationManager:didUpdateToLocation:fromLocation,则无法发出通知。如果正在调用,则不应触发通知

是否有某种系统通知说位置更新将停止


我发现调试这个非常困难,因为当我外出并在设备上测试位置时,我不能把我的Mac带到任何地方(在模拟器中你只能做这么多)。任何调试技巧也将不胜感激

有一个用于位置更新的代理失败

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
有几种类型的错误:
kCLErrorDenied
kCLErrorNetwork
在此处添加代码以在上面的委托方法中处理这些错误,而不是更新位置,可能是一个告诉用户的
UIAlertView

就我个人而言,我打电话给[locationManager StopUpdateLocation]

另外,请检查appDelegate中的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    [self saveContext];
    if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
        // Stop normal location updates and start significant location change updates for battery efficiency.
        [self.locationHandler.locationManager stopUpdatingLocation];
        [self.locationHandler.locationManager startMonitoringSignificantLocationChanges];
    }
    else {
        NSLog(@"Significant location change monitoring is not available.");
    }
}

最后再谈:测试。您可以通过在模拟器中更改位置移动来模拟某些位置错误。例如,从跑步到驾驶将导致错误。从运行到单个特定自定义位置将导致错误。它们都应该出现在上面locationManager的委托方法中。

我通过添加一个本地通知解决了这个问题,该通知在每次向路由添加新位置时都会以90秒的延迟触发。添加下一个位置时,将取消上一个通知并安排新的通知。这样,如果停止更新,用户将收到通知(尽管延迟90秒)。这并不理想,可能对电池寿命也不是很好,但这是一个解决方案,也是我目前所拥有的最好的解决方案。

如果你还没有找到答案,我认为这是因为
CLLocationManager
中添加了一个名为
pausesLocationUpdatesAutomatically
的新属性。该属性默认为
YES
,其行为与您描述的完全相同。尝试将其设置为“否”,我想它会解决您的问题。

@Ron,我遇到了与beev描述的相同的问题,我已经将PausesLocationUpdates自动设置为“否”。我想这是因为iOS会杀死一些在后台10分钟内未触发的应用程序。因此,添加本地通知目前可能是一个不错的选择。

从iOS9开始,确保在位置管理器上也设置了此属性:

[locationManager SetAllowsBackgroundLocationUpdate:是]


您测试的是哪个iOS版本?该应用程序支持iOS 5.1及以上版本。我的设备运行的是iOS 6,所以当我外出走动时,这就是正在使用的。有趣的是,这可能是一个iOS错误。您应该针对使用导航的应用程序进行测试,看看是否存在相同的问题。你确定你没有在任何地方停止代码中的位置更新吗?我有一个名为isRecording的BOOL,它必须是YES才能绘制点。这本书有可能被iOS发布吗?有可能。您可以在Xcode中本地测试它。让应用程序运行15分钟以上,然后手动停止代码并查看发生了什么。谢谢您的回答。我将进一步探索locationManager:DidFailWitheror,看看我是否能够实现这一点;[self.locationManager startUpdatingLocation];致locationManager:didFailWithError:我可以按照您描述的方式模拟错误,但它不会重现错误。为了重现这个bug,我必须在我的设备上运行这个应用程序,去某个地方,在同一个地方呆一段时间,然后去其他地方。今天,我在同一个地方呆了一段时间后,它停止了记录路线,但当我打开应用程序时,它又开始记录。仍在努力找出如何保持它的运行或通知用户记录已停止。考虑在AppDe委托中添加代码为“WurnActudiActudio”。类似于我在上面的“DidEnterBackground”中的内容。也许在这里加上你的起点和终点?谢谢。我会试试看。我找不到任何东西来说明更新没有发生的时间或原因。该应用程序在后台愉快地运行,但如果你在同一位置停留10分钟,它将停止更新,并且不会再次启动,除非你将该应用程序带到前台。我已经找到了一个解决方案,解决了如何通知用户正在发生这种情况的问题。请将您的代码作为答案发布在这里。我遇到了同样的问题