如何在每1小时后调用一次function?(斯威夫特)。 应用程序终止时后台获取工作?

我正在制作应用程序。 它提供每一小时后获取数据的function。 所以,即使我的应用程序终止,我怎么能调用该function?

经过太多的搜索后,我通过performFetchWithCompletionHandler找到了背景提取,但我想知道如果我的应用程序被终止,这个function会起作用吗?我的意思是如果我的应用程序处于关闭或终止状态,我怎么能自动调用函数?

如果您的应用处于终止状态,则无法执行任何操作。 Apple在终止或关闭状态下不允许任何内容(接收通知除外)。

您也受限于后台执行。 您可以在后台模式下执行特定类型的任务,如: Location update,Music playing, VOIP, finite length task, Newsstand downloads, etc 。 有关后台执行的更多详细信息,请参阅Apple文档 。

希望这会有所帮助:)

一旦我在处理某个项目时需要这样做,遗憾的是我没有找到任何解决方案。

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

请仔细阅读链接。

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

这是为了后台运行。 当app在后台时,将纬度和经度发送到服务器

一旦不执行任何与之相关的任务,您的应用就会终止。 Apple不支持它。 当您的应用未运行时,您无法调用函数。 所以这是不可能的由于苹果规则。 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分钟的后台活动。

我真的不知道应用程序的用途和function,如果应用程序已关闭且用户不关心查看更新的数据,为什么每1小时需要从服务器获取数据。

但是,如果每小时更新这些数据很重要并且需要通知用户更新“例如检查服务器上某个事件的状态,例如制作聊天应用程序并且用户收到消息” 。 然后最好在发生特定事件时从服务器向用户发送远程推送通知,这将使用户再次在前台获取应用程序,应用程序将开始获取更新的数据“在我的情况下这里消息“

您可以在应用终止状态找到位置,在大约500米的位置发生重大变化后。 这是工作的例子

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

但我坚持的是通过webservice发布位置。

@ 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]; }); }