8

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

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

4

6 回答 6

11

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

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

希望这会有所帮助:)

于 2016-05-19T09:35:57.863 回答
1

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

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

请通过链接。

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

这是用于后台运行。 当应用程序在后台时向服务器发送纬度和经度

于 2016-05-19T11:07:07.070 回答
1

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

于 2016-05-19T12:45:37.073 回答
0

根据我的经历:

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

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 小时从服务器获取一次数据。

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

于 2017-05-12T13:05:17.800 回答
0

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

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

但我坚持的是通过网络服务发布位置。

于 2017-08-26T11:24:03.573 回答
-3

@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];
    });
}
于 2016-05-19T10:04:04.440 回答