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

问题描述 投票:6回答:6

我正在制作一个提供每小时获取数据功能的应用。即使应用终止,它也会获取数据。如何实现此功能?

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

ios swift ios9 background-fetch
6个回答
12
投票

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

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

希望这会有所帮助:)


1
投票

不幸的是,当我在某个项目中工作时,同样需要找到任何解决方案。

[您可以在应用程序处于后台状态时运行任务(服务同样受限制),但是当应用程序终止时,苹果不允许运行任务

请通过链接。

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

这是用于后台运行。Sending Latitude and Longitude to Server when app is in background


1
投票

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


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

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


0
投票

您可以在位置发生明显变化(例如大约500米后,找到处于应用终止状态的位置)。这是工作示例

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

但是我遇到的问题是通过网络服务发布的位置。


-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];
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.