gpt4 book ai didi

ios - iOS 6 上的长期后台任务执行

转载 作者:行者123 更新时间:2023-11-28 22:14:33 25 4
gpt4 key购买 nike

我正在创建一个在线商店风格的应用程序,用户可以在其中浏览他们的 iPad 上的不同产品并订购这些产品。订购流程包括创建一个包含用户数据和他想要订购的相关产品的 xml 文件。但有时可能会出现这样的情况,即用户现在没有互联网连接,我想创建一些机制,每隔 x 分钟检查一次是否有事件的互联网连接,然后尝试传递 order-xml。它应该重复此步骤,直到它连接到网络,然后在发送完所有离线购物车后停止它。

我已经在网上搜索过,但只找到了在 iOS 7 上执行此操作的方法(使用 UIBackgroundModes - 获取)。但我不想使用 iOS 7,因为该应用程序已经完成,我不打算为 iOS 7 重新设计它(它是一个企业应用程序)。据我所知,iOS 6 上当前的后台执行时间限制在 15 分钟左右,对吗?

关于如何解决这个问题有什么想法吗?

谢谢。

编辑:我在 - (void)applicationDidEnterBackground:(UIApplication *)application

中尝试了以下内容
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperationWithBlock:^{
[[InstanceHolder getInstance] startNetworkTimer];
}];

接下来会发生什么:

- (void) startNetworkTimer{
if ([CommonCode getAllOfflineCartsForClient:nil].count > 0){
NSTimer *pauseTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(offlineCartLoop:) userInfo:nil repeats:YES];
}

}

- (void) offlineCartLoop:(id)sender{
if([CommonCode isInternetConnectionAvailable]){
[self sendOfflineCarts];
[sender invalidate];
}
}

startNetworkTimer 被调用了,但是它没有调用 offlineCartLoop 函数:-(

编辑 2:

我认为计时器是问题所在。我现在像这样调用 offlineCartLoop 函数:

self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperationWithBlock:^{
[[InstanceHolder getInstance] offlineCartLoop:nil];
}];

并将 offlineCartLoop 函数更改为:

- (void) offlineCartLoop:(id)sender{
if([CommonCode isInternetConnectionAvailable]){
[self sendOfflineCarts];
}else{
[NSThread sleepForTimeInterval:10.0];
[self offlineCartLoop:nil];
}
}

似乎可行,但这会永远运行吗?还有什么我需要注意的吗?

最佳答案

没有您想要的解决方案 - 没有能够在后台每隔 N 分钟定期检查这样的事情除非它在 beginBackgroundTaskWithExpirationHandler 授予的时间窗口内。但是对于 iOS6 和更早版本只允许 10 分钟的执行时间,或者对于 iOS7 大约 3 分钟。

如果您的应用不需要后台模式,您就不能作弊并尝试使用它,即使是后台模式也不允许您随时自由运行。即使是 iOS 7 中的新后台模式也不允许您按计划运行。

你最好的实际上是 iOS7,即使你不想迁移到 iOS7 - 后台获取是相关模式(即使你正在推送而不是获取)。使用该后台模式,您将有机会执行 不是在您决定时执行,而是仅在操作系统决定时执行 - 执行频率取决于用户如何使用您的应用程序。在 iOS6 中,您的选择受到的限制更少。

参见 iOS: Keep an app running like a service

基本上没有连续后台执行,也没有周期性后台执行,也没有应用决定何时在后台运行。

如果用户在他们使用您的应用程序下订单时没有互联网连接,那么无论如何您都应该通知他们(如果您不这样做,那么您的应用程序可能会被应用程序商店拒绝)并且也许告诉他们稍后再试。

如果他们处于飞行模式,用户将知道他们处于飞行模式,如果有临时中断(例如手机在电梯或隧道中),那么您的应用可以继续尝试,只要它是able - 在前台每分钟继续尝试,然后当你切换到后台时你知道你还有 10 分钟,继续尝试直到 10 分钟快到期然后向用户发布本地通知通知他们应用程序无法由于缺乏连接而下订单。如果用户点击通知并且您的应用启动,则该应用将有机会在此时重试。

如果您仍然无法建立连接,那就这样吧,但您将有机会再次启动重试算法。但至少您已通知用户他们的订单尚未完成。

关于ios - iOS 6 上的长期后台任务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22043384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com