【问题标题】:Background Fetch at Specific Time在特定时间后台获取
【发布时间】:2018-08-28 08:45:10
【问题描述】:

我正在寻找在后台模式下获取数据的解决方案,即使应用程序被终止。 这个问题有很多教程和答案,但我的问题与其他问题不同。我在stackoverflow上没有找到任何合适的解决方案,所以发布了这个问题。

我有可以解释的场景。我正在使用存储事件日期、名称、时间、地址等的领域数据库。现在的问题是,我想编写一个在后台执行的代码,在此代码中我想获取所有事件数据并比较它们的日期与今天的日期。并根据这些天之间的剩余天数触发本地通知,以提醒用户特定事件还剩多少天。

我想在当地时间每天早上 8 点准确地调用这个后台获取方法。

由于与后台获取和实现混淆,我没有编写任何代码。有人知道如何实现吗?

我们将不胜感激。

【问题讨论】:

  • 在一个非常简单的术语中,您不能在 iOS 中安排任何任务在特定时间下载数据,您可以做的最好的就是选择后台功能,但没有人可以保证您的应用程序获得有机会在特定时间下载数据。您也可以选择静默通知,但即使这样也和其他人一样不可靠:)
  • 感谢您的帮助。当您考虑下载数据时,它不是正确的。我有本地领域数据库的数据。
  • 实现静默推送通知
  • 静默通知严重不可靠。在调试我的应用程序时,我让它们可靠地工作,但在发布版本中,静默推送之间需要几个小时。我与 Apple 的技术支持人员进行了交谈,他们的回答是无法保证何时会发送静默推送,或者是否会发送。
  • @PaulMarshal 您需要以不同的方式思考您的问题。要么在服务器上执行比较,然后通过提醒(考虑用户的时区)向用户发送正常推送,要么使用后台获取,并在运行时安排 8 点钟的本地通知。每次提取运行时,如果您有更多/新数据,您可以更新待处理的通知。

标签: ios swift xcode9.2 background-fetch


【解决方案1】:

我有解决问题的方法。正如我所说,

我想编写一个在后台执行的代码,在这段代码中我 想要获取所有事件数据并将它们的日期与今天的日期进行比较。 并根据这几天之间剩余的天数触发本地通知 提醒用户特定活动还剩多少天。

因此,当我从 API 获得响应时,我正在为具有唯一 ID 的所有事件创建本地通知,这些事件在每天特定时间触发并重复,在那里我显示事件时间和事件的剩余天数。

【讨论】:

  • 在某些情况下,该解决方案无法正常工作。想一想,如果您在晚上 10 点从您的 API 收到一个事件,并在下一个上午 8 点安排通知说您的事件将在同一天上午 11 点发生,但是您的事件可以在晚上 10 点之间的任何时间更改(您获得来自您的 API 的响应)和上午 8 点(您发送通知的时间),您将向用户显示错误的通知。
  • @RomuloBM,按照显示事件通知的方式,您是对的。但我担心的是从 5 天之前到上午 8 点的活动日期显示提醒,这样就可以了。
【解决方案2】:

Apple 文档声明无法保证何时执行后台提取。由系统决定。

系统会等待网络和电源状况良好,因此您应该能够快速检索足够数量的数据。

唤醒您的应用的保证方法是在上午 8 点从服务器发送 VoIP 推送通知。保证应用程序在收到推送时会被唤醒,并且您将能够执行您需要的作业。更多详情,https://medium.com/ios-expert-series-or-interview-series/voip-push-notifications-using-ios-pushkit-5bc4a8f4d587

【讨论】:

  • 我已经阅读了这篇文章。我不需要 VOIP 推送通知
【解决方案3】:

除了推送通知(因为此服务器必须发送推送通知)之外,在 iOS 中无法将应用从挂起模式唤醒。

【讨论】:

    【解决方案4】:

    这是任何地方都没有记录的东西。恕我直言和 iOS 经验,Apple 必须记录自 iOS 时代开始以来的用户活动。 ScreenTime 是 Apple 能够创建和可视化数据以呈现面向用户的应用程序的那些记录的产物,该应用程序非常精美地限制、管理和显示您的活动。在 WWDC 2018 中,甚至有人引用苹果甚至会检测到,如果用户在每天晚上 9 点睡觉前打开您的应用程序,iOS 将允许该应用程序的所有可能资源(电池、互联网、处理时间等)在晚上 9 点。但是在执行此操作之前,您需要了解您的用户活动。我们举个例子:

    新闻应用: 大多数用户会在早上查看新闻(如果他们不是 Instagram 上瘾者)。这时候即使是苹果也应该偏向于使用后台抓取来打开你的应用程序。除非当然有太多的资源紧缩

    一个游戏:许多游戏允许在用户玩下一轮之前通过称之为“充电”或“重新填充”角色的能量来提供限制时间。这样做是为了让上瘾的人购买宝石以消除这种限制,从而将这个想法货币化。但是,如果您知道充值过程在早上 8:00 之前完成,或者用户每天早上 8:00 玩您的游戏,请相应地配置后台提取。

    后台提取适用于间隔而不是特定时间。

    // Fetch data once an hour.
       UIApplication.shared.setMinimumBackgroundFetchInterval(3600)
    

    最后你为什么不试试silent push notifications?根据您的问题,我认为静默通知足以在服务器推送通知后唤醒您的应用,下载一些数据并进行计算并提供本地通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多