【问题标题】:How to trigger a method every hour irrespective to app active, background or terminated无论应用程序处于活动状态、后台还是终止状态,如何每小时触发一次方法
【发布时间】:2016-08-18 09:06:07
【问题描述】:

无论应用程序是活动的、后台的还是终止的,如何每小时触发一个方法。 该方法应该每小时触发一次。

   NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60*60 target:self selector:@selector(callYourMethod:) userInfo:nil repeats:YES];

听说 NSTimer 10 分钟后就不能工作了。

谁能建议我如何在 iOS Objecitve-C 中激活一个每隔一小时触发一个方法的方法

【问题讨论】:

  • 没有万无一失的方法可以做到这一点。谁告诉你计时器有时间限制是错误的,或者你缺少上下文。如果应用程序被终止,您必须使用外部触发器(例如推送工具包通知)再次启动它。当它在后台时几乎相同,但你有更多的选择来唤醒它。没有一个是 100% 可靠的,尽管 PK 最接近。当然,您的应用必须是 VoIP 应用才能使用它。
  • 你真的需要每小时做点什么吗?因为这对于移动应用程序来说是一个糟糕的设计。这样你会耗尽电池。如果用户杀死了你的应用程序,任务没有完成怎么办。如果需要,您最好在服务器端使用推送通知将其推送到您的应用程序。此外,只有 VOIP、音频、位置和附件应用程序可以在后台运行。滥用其中之一让您的应用在后台运行会导致您的应用被拒绝。
  • 定时器在主线程上工作。当应用程序进入后台时,它的计时器变得无效。因此,当应用程序进入后台时,您不能这样做。

标签: ios objective-c iphone nstimer


【解决方案1】:

在本地管理此类任务是个坏主意。您无法负担 NSTimer 或 GCD,因为它们被设计为在应用程序处于前台状态时使用。

当您处于后台时,应用程序可以在几分钟后使计时器或调度方法无效,并且 - 无论如何 - 由 iOS 自行决定。如果系统需要为其他应用释放内存或优化电池消耗,它会将应用置于 Suspended 状态。

您只能通过使用带有PushKit Framework 的 VoIP 通知(在 iOS 8 中引入)来强制将应用从关闭或挂起状态唤醒。请注意,只有在实现 VoIP 服务的情况下才应使用此类通知在你的应用程序中。这个框架的文档记录很差,首先是由 Apple 编写的,但也出现在 StackOverflow 等其他站点上。我建议您关注this tutorial by Pierre-Marc Airoldi,它会一步一步指导您构建一个使用 VoIP 服务的应用程序的功能齐全的演示。 请注意,当您收到标准通知时,它们不会做任何事情:AppDelegate 中的方法只有在您单击通知时才会被触发。如果您不想向用户显示通知,请在不发送消息的情况下发送;它不会显示在屏幕上,但也会被接收。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多