Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Ios 应用程序终止时停止位置更新_Ios_Background_Gps_Location_Terminate - Fatal编程技术网

Ios 应用程序终止时停止位置更新

Ios 应用程序终止时停止位置更新,ios,background,gps,location,terminate,Ios,Background,Gps,Location,Terminate,我正在开发一个应用程序,当你在促销地点附近时,它会发送通知。 我的问题是,当我转到后台然后退出应用程序时,我不希望在应用程序不工作时位置服务工作(但我希望它们在后台工作) 我只看到3个应用程序在关闭gps时关闭gps,我想知道它们是如何做到的,Facebook、谷歌地图和苹果地图,不是Foursquare,也不是实地考察 谢谢大家。您可以为UIApplicationWillTerminateNotification添加一个观察者,从中启动locationManager,然后停止位置更新 [[NS

我正在开发一个应用程序,当你在促销地点附近时,它会发送通知。 我的问题是,当我转到后台然后退出应用程序时,我不希望在应用程序不工作时位置服务工作(但我希望它们在后台工作)

我只看到3个应用程序在关闭gps时关闭gps,我想知道它们是如何做到的,Facebook、谷歌地图和苹果地图,不是Foursquare,也不是实地考察


谢谢大家。

您可以为
UIApplicationWillTerminateNotification
添加一个观察者,从中启动locationManager,然后停止位置更新

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationWillTerminate:)
                                                 name:UIApplicationWillTerminateNotification
                                               object:nil];
方法在收到通知时执行

- (void)applicationWillTerminate:(NSNotification *)notification {
//stop location updates
}

@GuyS在本主题中提供的解决方案应该有效。如果应用程序位于后台,我将获得
UIApplicationWillTerminateNotification
,然后我通过滑动快照将其关闭。请检查您是否正确使用
NSNotificationCenter
(尤其是添加和删除通知)。另外,当应用程序处于后台时,请检查您在通知中订阅的对象是否处于活动状态

另一个类似的解决方案是将禁用GPS的代码放在
uiapplicationelegate
方法中相应的
AppDelegate
回调中

- (void)applicationWillTerminate:(UIApplication *)application {
//stop location updates
}

我找到了我问题的正确答案,因为@GuyS第二篇帖子:

将其添加到AppDelegate.m ApplicationIdentinterBackground中

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];
    if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) {
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            // Synchronize the cleanup call on the main thread in case
            // the task actually finishes at around the same time.
            dispatch_async(dispatch_get_main_queue(), ^{
                if (bgTask != UIBackgroundTaskInvalid)
                {
                    [app endBackgroundTask:bgTask];
                    bgTask = UIBackgroundTaskInvalid;
                }
            });
        }];
    } 
}
并声明该变量:

UIBackgroundTaskIdentifier bgTask;
在此之后,您只需停止applicationWillTerminate中的位置服务即可


感谢您的回复。

据我所知,您希望在应用程序退出时删除位置,但在后台运行位置。对于
application中的方法,将在
AppDelegate
中终止
方法。您需要添加
stopdatinglocation
stopmonitoringsignifictlocationchanges
,并将location对象设置为
nil
。也许对你有帮助。对不起,没那么容易。。。当您关闭应用程序并且您处于后台时,它不会触发应用程序将终止…哦,现在我可以理解您的问题了。:)我试过了,但不幸的是没那么容易。。。当你关闭应用程序而你处于后台时,它没有发送通知。@JavierPeigneux你是如何测试的?我看到当其他应用程序位于前台时,调用了
-(void)application willterminate:(UIApplication*)application
UIApplication willterminateNotification
,我们通过滑动快照来关闭我们的应用程序。@Alexeda问题是当应用程序位于后台时,然后您通过滑动快照来关闭它。。。我用日志、断点对它进行了测试,我有停止gps的代码,它在代码的其余部分工作,但它从来没有在那里工作过……我已经发布了这个主题的新答案。希望这会有帮助。祝你好运:)看看这篇文章:,OP问题的第二点是你正在描述的问题?如果是这样,接受的答案应该解决它。这应该是一个接受的答案,它解决了调用应用程序的问题。当应用程序在后台时,将终止。