我正在制作一个提供每小时获取数据功能的应用程序。即使应用程序终止,它也会获取数据。我怎样才能实现这个功能?
经过大量搜索后,我发现使用 performFetchWithCompletionHandler 进行后台获取。即使我的应用程序终止,此功能也会起作用吗?我的意思是如果我的应用程序处于关闭或终止状态,我可以自动调用这个函数吗?
我正在制作一个提供每小时获取数据功能的应用程序。即使应用程序终止,它也会获取数据。我怎样才能实现这个功能?
经过大量搜索后,我发现使用 performFetchWithCompletionHandler 进行后台获取。即使我的应用程序终止,此功能也会起作用吗?我的意思是如果我的应用程序处于关闭或终止状态,我可以自动调用这个函数吗?
如果您的应用程序处于终止状态,您将无法执行任何操作。苹果不允许任何东西(除了接收通知)处于终止或关闭状态。
您也受限于后台执行。您可以在后台模式下执行特定类型的任务,例如:Location update,Music playing, VOIP, finite length task, Newsstand downloads, etc
。您可以参考苹果文档以获取有关后台执行的更多详细信息。
希望这会有所帮助:)
一旦我在做某个项目时也需要这个,不幸的是我没有找到任何解决方案。
您可以在应用程序处于后台状态时运行任务(服务也有限),但苹果不允许在应用程序终止时运行任务
请通过链接。
这是用于后台运行。 当应用程序在后台时向服务器发送纬度和经度
一旦您的应用程序不会执行任何与其相关的任务,您的应用程序就会终止。苹果不支持。当您的应用程序未运行时,您无法调用函数。因此,由于苹果规则,这是不可能的。
performFetchWithCompletionHandler
仅当您的应用程序正在运行时才有效,如果您的应用程序终止,它将不会执行任何类型的任务。
根据我的经历:
首先,当应用程序进入后台时计时器将停止,以停止快速耗尽电池并延长电池寿命,甚至在您不积极使用应用程序时节省网络捆绑配额消耗。
AppDelagate
您可以通过在“如您所述”中添加以下内容来执行后台获取任务:
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
//Do whatever you need
//This will keep running for max 3 mins
}
但后台获取任务也是如此。除了位置服务、音频播放、VOIP 和其他一些任务外,您最多可以进行 3 分钟的后台活动。
我真的不知道应用程序的用途和功能,如果应用程序已经关闭并且用户不关心看到更新的数据,为什么你需要每 1 小时从服务器获取一次数据。
但是如果这些数据很重要,需要每小时更新一次,并且需要用更新通知用户“例如检查服务器上某个事件的状态,比如制作一个聊天应用程序并且用户收到了一条消息”。然后最好在发生某个事件时从服务器向用户发送远程推送通知,这将使用户再次在前台获取应用程序,并且应用程序将开始获取更新的数据“在我的情况下,这里是消息”。
在大约 500 米的位置发生显着变化后,您可以在应用程序终止状态下找到位置。这是工作示例
但我坚持的是通过网络服务发布位置。
@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];
});
}