我正在使用NSTimer根据时间获取位置,无论位置是否更新,因为 didUpdateLocations 在后台工作正常,杀死应用后但需要根据时间定位,因为我的计时器工作正常在背景中很好,但在杀死或终止应用程序后它无法正常工作。
请在杀死我的应用程序后帮助我完成工作。
答案 0 :(得分:2)
计时器没有"运行"在你思考的方式。没有"倒计时。"计时器只是在运行循环中添加一个标记,以便在特定时间发送某个消息。每次runloop运行时,它会检查是否有任何定时器已过期(如果"现在"是否晚于他们的开火日期)。如果是这样,它以与调用drawRect:或处理触摸事件等相同的方式发送所请求的消息。它或多或少是一个巨大的while(true)循环,其中循环中的一个东西是" fire expired timers。"
那么所有这些意味着什么呢?这意味着定时器只有在给定的回路被泵送时才会触发" (处理)。通常这是主runloop,它只在您的应用程序处于活动状态时进行处理。如果您变为非活动状态(通常在用户导航到另一个应用程序时),则runloop不会处理。当您回来时,所有在您处于非活动状态时到期的计时器都会触发(这就是为什么您通常希望在进入后台之前使计时器无效的原因)。 (非主要的runloops有点复杂,但非常罕见。但它们仍然无法在后台无限期地运行,但是有更多的情况下它们无法运行。)
另一方面,如果你被终止(这可能会在你背后没有通知的情况下发生),那么你的runloops都会消失。重新启动时,您的计时器不会被实例化。如果你想要它,这就是你的工作。所以你不能依靠你的计时器开火。
由于您已加入repeats:YES
,系统会自动为您重新安排计时器。同样,这并不意味着它会倒计时#34;或者是#34;仍在运行"或类似的东西。它只是意味着当它触发时,它会自动安排另一个计时器事件。因此,如果用户只是坐在" OK"按钮足够长,计时器将再次启动(在iOS中;在Mac和"模式"在那里更重要的事情可能会有所不同。)
请注意,没有理由同时调用scheduledTimerWithTimeInterval:..
。还有addTimer:..."预定"方法的一部分意味着计时器已经添加到runloop。
答案 1 :(得分:1)
当应用在后台时,您可以这样做。但是,当用户故意终止应用程序,或者您的应用程序自行终止(3分钟不活动)时,您将失去所有的优势,而您的应用程序无法执行任何操作,只能听取取消错误(如果您未实施未定位)
如果您试图禁止应用程序终止,您可以让它在该背景中运行无声mp3,这样您的应用程序始终处于活动状态(耗尽电量)。
但是,如果用户双击主页按钮并向上滑动您的应用程序(终止它)。你无能为力!
希望这有帮助!
答案 2 :(得分:1)