3

在我的应用程序中,我执行了下面列出的以下操作,并在应用程序获取例程中添加了计数器,以突出显示 iOS 8.1 调用 fetch 的次数。

  1. 打开后台模式并启用后台获取。
  2. 为“performFetchWithCompletionHandler”编写代码。NSLog 消息指示获取过程的开始和结束。计数器位于这些消息之间。
  3. 在“didFinishLaunchingWithOptions”中添加了代码。但是,我没有使用“setMinimumBackgroundFetchInterval”,而是使用 60 的两倍(假设秒数)。

当我通过设置“模拟后台获取”在调试中测试代码时,一切都按预期完美运行,绝对没有问题。计数器工作并显示预期值。

但是,当我在 iPhone 上直播时,启动应用程序,然后点击主页按钮进入后台,等待一两个小时或过夜。什么都没有发生,没有获取,没有下载,所有计数器都保持为零。

如果我不能让它工作,我将需要创建自己的后台线程并直接管理它,我不希望这样做。

任何意见或想法都深表感谢。

4

4 回答 4

2

从 iOS 8 开始,我的两个应用程序都出现了同样的问题。在 iOS 7 中,后台刷新触发相当可靠。在 iOS 8 中,它刚刚停止。如果我将任一应用程序从 xcode 启动到后台获取模式,一切都会正常运行。背景刷新自己刚刚停止在 iOS 中自行触发。我有一个充满希望的理论,我现在正在尝试。这是我的想法...

如果用户从多任务屏幕中强制将您的应用程序杀死,iOS 将从后台刷新中排除您的应用程序。Apple 是如何实现这种行为的?一种方法是将最小获取间隔设置为 UIApplicationBackgroundFetchIntervalNever。十分简单。让我们假设他们就是这样做的。您的应用程序是在每次启动时设置最小获取间隔,还是仅在初始启动时设置?

就我而言,我只是将最小获取间隔设置为我的应用程序初始设置的一部分。如果用户强行杀死了应用程序,而 iOS 实际上将最小获取间隔设置为 UIApplicationBackgroundFetchIntervalNever,那么我的应用程序就会卡在从不的状态。我在我的一个应用程序中做了一个小改动,以便在每次启动时设置最小获取间隔。到目前为止,一切都很好。

更新:

在我的后台获取土地上一切都很好。

我目前正在开发的应用程序和我在应用程序商店中的应用程序都再次可靠地触发后台获取。

执行此操作的代码可能非常简单......

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:minimumBackgroundFetchInterval];

每次启动应用程序时调用它都可以解决问题,但是,您需要考虑设置该值是否适合应用程序的当前状态。就我而言,我的一个应用程序是音乐会列表应用程序。如果用户还没有选择音乐会的地点,那么设置最小后台获取间隔是没有意义的。我有一个 NSUserDefault 来跟踪是否已设置位置。这是我用于设置获取间隔的代码的近似值...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([INCUserDefaults isLocationConfigured]) {
        [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:kSecondsIntervalForUpcomingShowsBackgroundFetch];
    }

    return YES;
}

在我发布错误修复之前,我只是将最小后台获取间隔设置为设置过程的一部分。现在我在设置过程中设置它,如果设置过程之前完成,则在应用程序启动时设置它。

于 2015-03-19T04:36:15.460 回答
1

Apple 使用秘密算法来确定 fetch 事件的频率。该算法可能基于应用程序使用模式(即:用户使用应用程序的频率和时间)。获取事件开始持续到达可能需要几天时间。

如果 fetch 事件在模拟器中有效,则证明一切设置正确。除了等待,你无能为力。

于 2019-07-29T22:56:15.280 回答
0

iOS 以某种方式进行后台获取。它会唤醒它认为用户经常使用的应用程序。唤醒手机几次后尝试打开应用程序。

于 2015-03-02T23:25:03.077 回答
0

正如 kkarayannis 所写,iOS 将了解调用应用程序的频率。我已经看到了与编写第一个背景提取相同的行为。我相信,您不仅应该手动打开您的应用程序,还应该触发手动刷新。IOS 将了解到用户想要定期加载数据,并将开始自行执行。

您是否也尝试过使用“setMinimumBackgroundFetchInterval”而不是 120 秒?也许它的间隔太短了。但是,您也可以通过您的代码以便更好地理解。

于 2015-03-11T12:04:12.203 回答