即使应用程序已终止,如何在 Swift 中每小时在后台获取数据?

How to fetch data in background every hour in Swift even the app is terminated?

我正在制作一个提供每小时获取数据功能的应用程序。即使应用程序终止,它也会获取数据。我怎样才能实现这个功能?

经过大量搜索,我发现使用 performFetchWithCompletionHandler 进行后台获取。即使我的应用程序终止,此功能也能正常工作吗?我的意思是,如果我的应用程序处于关闭或终止状态,我可以自动调用此功能吗?

如果您的应用程序处于终止状态,您将无法执行任何操作。 Apple 不允许任何东西(接收通知除外)处于终止或关闭状态。

您也被限制在后台执行。 您可以在后台模式下执行特定类型的任务,例如:Location update,Music playing, VOIP, finite length task, Newsstand downloads, etc。您可以参考 apple documentation 了解更多有关后台执行的详细信息。

希望这会有所帮助:)

@Jack.Right 您可以每 1 小时调用一次该方法,所以使用 NSTimeinterval 会很有帮助!!

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];

    //create new uiBackgroundTask
    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    //and create new timer with async call: 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //run function methodRunAfterBackground
        NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(methodRunAfterBackground) userInfo:nil repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });
}

有一次我在做某个项目时需要这个,不幸的是我没有 找到任何解决方案。

您可以 运行 当您的应用程序处于后台状态时执行任务(服务有限)但苹果不允许 运行 当应用程序终止时执行任务

请通过link。

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

这是背景 运行ning。

一旦您的应用程序不再执行任何与之相关的任务,它就会被终止。 苹果不支持。 当您的应用不是 运行 时,您无法调用 Functions。 因此,由于苹果规则,这是不可能的。 performFetchWithCompletionHandler 仅当您的应用程序处于 运行 时才有效。如果您的应用程序被终止,它将不会执行任何类型的任务。

根据我的经历:

首先,当应用程序进入后台时,计时器将停止,以停止快速电池耗尽并延长电池寿命,甚至可以在您不积极使用该应用程序时节省网络捆绑配额消耗。

您可以通过在 AppDelagate "as you mentioned" 中添加以下内容来执行后台提取任务:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    //Do whatever you need
    //This will keep running for max 3 mins
}

但后台获取任务也是如此。除了位置服务、音频播放、VOIP 和其他一些任务外,您最多有 3 分钟的后台 activity。

我真的不知道应用程序的用途和功能,如果应用程序已经关闭并且用户不关心看到更新的数据,为什么你需要每 1 小时从服务器抓取一次数据。

但是如果这个数据很重要,每小时更新一次,需要通知用户更新"for instance checking the status of a certain event on the server, like making a chat app and the user received a message"。 然后最好在发生某个事件时从服务器向用户发送远程推送通知,这将使用户再次在前台获取应用程序,应用程序将开始获取更新的数据"in my case here the message".

您可以在应用程序终止状态下找到位置,在位置发生显着变化(例如大约 500 米)之后。 这是工作示例

http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

但我卡在的是 post 通过网络服务定位。