即使应用程序已终止,如何在 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。
这是背景 运行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 米)之后。
这是工作示例
但我卡在的是 post 通过网络服务定位。
我正在制作一个提供每小时获取数据功能的应用程序。即使应用程序终止,它也会获取数据。我怎样才能实现这个功能?
经过大量搜索,我发现使用 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。
这是背景 运行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 米)之后。 这是工作示例
但我卡在的是 post 通过网络服务定位。