【问题标题】:Working with UILocalNotifications, Remote Notifications with completion handler and Background Fetch使用 UILocalNotifications、带有完成处理程序的远程通知和后台获取
【发布时间】:2014-05-07 03:32:38
【问题描述】:

在 iOS7 中,可以使用completionHandler 进行远程通知。是否可以对 UILocalNotifications 做同样的事情?

基本上,我希望网络服务以 30 秒的固定时间间隔发布我的一些数据,即使应用程序处于后台也是如此。为此,我考虑了 3 个选项,但没有得到任何帮助:

  1. Background Fetch :这将在后台工作,但我不能使用它,因为 iOS 并非必须始终以我想要的时间间隔调用此后台 fetch。

  2. 远程通知:这非常有效。但是每 30 秒我必须发布一个远程推送通知,这根本不实用。如果能在本地处理就好了。

  3. UILocalNotifications:没有完成处理程序。用户必须打开应用程序。所以这不是很好!

还有其他选择吗?或者即使使用iOS7,仍然无法在后台进行本地操作?

请帮忙。谢谢!

【问题讨论】:

  • 如果用户甚至没有查看您的应用程序,为什么您需要如此频繁地向服务器发送信息?
  • @Rivera 这是用户将开始录制的内容,即使应用程序在后台,它也应该继续。只有当用户停止它时它才会停止。奇怪的要求,我知道!但这就是我需要构建的!
  • 录制什么?也许你可以在本地录制? Apple 会检查你的 App 消耗了多少,并调整它调用你的后台方法的频率,所以你最好不要将数据发送到服务器,以保持“生态”。

标签: ios iphone objective-c ios7 uilocalnotification


【解决方案1】:

您涵盖了所有选项,如您所见,这不受支持。出于充分的理由,大多数情况下,因为在后台唤醒应用程序是一项昂贵的操作(在 iOS7 中,在应用程序完成后台工作后拍摄快照),每 30 秒执行一次将对电池寿命造成毁灭性影响。

由于您没有提及需要发布哪些数据,因此在大多数情况下,我建议您重新设计您的应用,以便对用户的电池友好。如果您需要位置报告,请考虑收听重大的位置变化,而不是每 30 秒记录一次。

可能会滥用推送通知(请注意,静默远程通知受 Apple 的速率限制),但请考虑您的用户将获得的体验。

如果您认为该功能应该存在但缺少,您应该向 Apple 提出增强请求并在此处发布雷达编号,以便人们可以复制它。

【讨论】:

    【解决方案2】:

    后台获取是您问题的直接答案。每当 iOS 可以定期执行任务时,后台 fetch 都会启动您的 fetch 处理程序。您需要做的就是在

    中发起您的 NSURLSession 请求
    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
    

    NSURLConnection 不再是服务调用的有效 API,也不支持后台任务。 NSURLSession 显然是 NSURLConnection 的替代 API,具有 iOS 7 的高级优势。在下面添加来自 Apple 的 iOS 文档的文档

     NSURLSession is a replacement API for NSURLConnection.  It provides
     options that affect the policy of, and various aspects of the
     mechanism by which NSURLRequest objects are retrieved from the
     network.
    

    后台获取间隔可以设置来定义后台获取的重复频率,但它也考虑了操作系统资源和挂起操作的因素

    - (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval;
    

    iOS 7 显然提供了一种更新应用程序内容的更好方法,但它像 iOS 通常那样尊重设备资源和用户优先级。希望这能回答您的问题。

    【讨论】:

      【解决方案3】:

      实际上,看起来您无法从后台定期与 webservice 进行通信。

      UILocalNotifications 或 Remote Notifications 需要用户的操作来唤醒应用程序(如果它是后台的)。 已编辑:从 iOS 7.0 开始,远程通知可以唤醒应用,但这不是一个灵活的解决方案

      iOS 允许使用指定 UIBackgroundModes 之一的应用程序在后台进行更多活动,请参阅“表 3-4 应用程序的后台模式”:

      Here is a link to related Apple docs

      如果您的应用程序没有直接定位为 bg 模式之一,我同意 Anil Kumar(上面的帖子)的观点,即后台获取是这里最有用的东西。但是,它并不能完全满足您的需求。 [UIApplication setMinimumBackgroundFetchInterval:] 这并不意味着任何严格的时间。它仅表示最小间隔(或所需时间)。这里有更多信息:

      performFetchWithCompletionHandler never gets fired

      谢谢

      【讨论】:

      • 关于远程通知,我不正确。如果用户没有在任务管理器中使用滑动特别杀死应用程序,则可以使用远程通知在后台唤醒应用程序,前提是推送有效负载以正确的时间间隔到达。但这是个坏主意。
      • @LeoNatan 同意,从 iOS 7.0 开始远程通知可以唤醒应用。感谢您的澄清。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多