Как получать данные в фоновом режиме каждый час в Swift, даже если приложение закрыто?

Я делаю приложение, которое обеспечивает функциональность для получения данных каждый час. Он извлекает данные, даже когда приложение завершает работу. Как я могу реализовать этот функционал?

После долгих поисков я нашел фоновую выборку с помощью PerformFetchWithCompletionHandler. Будет ли эта функция работать, даже если мое приложение завершится? Я имею в виду, что если мое приложение находится в закрытом или завершенном состоянии, могу ли я вызвать эту функцию автоматически?


person Jack.Right    schedule 19.05.2016    source источник
comment
Невозможно бесконечное время!!   -  person TheTiger    schedule 19.05.2016
comment
но фоновая выборка будет работать, если мое приложение будет закрыто? @TheTiger   -  person Jack.Right    schedule 19.05.2016
comment
Вы можете получить данные только один раз, когда состояние приложения меняется на фоновое, но не навсегда.   -  person TheTiger    schedule 19.05.2016
comment
@DearDownvoter: вопрос не подлежит отрицательному голосованию. Вопрос правильный и следует за часто задаваемыми вопросами SO. Поэтому, прежде чем голосовать против, укажите причину в комментарии.   -  person TheTiger    schedule 19.05.2016
comment
Спасибо, @TheTiger понял. не могли бы вы сказать мне, сколько максимальное время приложение остается в фоновом режиме?   -  person Jack.Right    schedule 19.05.2016
comment
Я хочу, чтобы в моем проекте было то же самое, я хочу вызывать API каждые 5 минут в фоновом режиме, и если результат, который API отправляет мне обратно, является тем, что я хочу, показать пользователю уведомление и больше не вызывать API. каким способом вы решили эту проблему?   -  person Mohammad Hadi    schedule 15.12.2016


Ответы (6)


Вы ничего не можете сделать, если ваше приложение находится в прекращенном состоянии. Apple не разрешает ничего (кроме получения уведомлений) в прекращенном или закрытом состоянии.

Вы также ограничены для фонового выполнения. Вы можете выполнять определенные задачи в фоновом режиме, например: Location update,Music playing, VOIP, finite length task, Newsstand downloads, etc. Дополнительную информацию можно найти в документации Apple. подробности о фоновом выполнении.

Надеюсь, это поможет :)

person Ketan Parmar    schedule 19.05.2016
comment
за исключением получения уведомления ‹-- Я думаю, что это неправильно. Вы можете выполнять все действия, которые запускают ваше приложение. на заднем фоне. - person Honey; 26.08.2017

Когда-то мне это понадобилось, когда я работал над каким-то проектом, но, к сожалению, я не нашел для него решения.

Вы можете запустить задачу, когда ваше приложение находится в фоновом состоянии (это тоже с ограниченными службами), но Apple не позволяет запускать задачу, когда приложение завершено

Пожалуйста, перейдите по ссылке.

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

и это для фонового запуска. Отправка широты и долготы на сервер, когда приложение находится в фон

person Santo    schedule 19.05.2016

Ваше приложение прекращает работу, как только оно не будет выполнять какие-либо задачи, связанные с ним. Apple не поддерживает это. Вы не можете вызывать функции, когда ваше приложение не запущено. Так что это невозможно из-за правил Apple. performFetchWithCompletionHandler работает только тогда, когда ваше приложение работает, если ваше приложение завершено, оно не будет выполнять никаких задач.

person Dhruv Khatri    schedule 19.05.2016

Из того, что я испытал:

Прежде всего, таймер остановится, когда приложение перейдет в фоновый режим, чтобы остановить быстрый разряд батареи и продлить срок службы батареи даже для экономии потребления квоты сетевых пакетов, когда вы не используете приложение активно.

Вы можете выполнять задачи фоновой загрузки, добавив в AppDelagate "как вы упомянули" следующее:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    //Do whatever you need
    //This will keep running for max 3 mins
}

Но то же самое относится и к задачам фоновой выборки. У вас есть максимум 3 минуты фоновой активности, за исключением служб определения местоположения, воспроизведения аудио, VOIP и некоторых других задач.

Я действительно не знаю, как использовать и функциональность приложения, и почему вам нужно получать данные с сервера каждый час, если приложение уже закрыто, и пользователь не беспокоится о просмотре обновленных данных.

Но если эти данные важно обновлять каждый час и нужно уведомлять пользователя об обновлениях, "например, проверка статуса определенного события на сервере, например создание приложения чата, и пользователь получил сообщение"< /эм>. Тогда лучше отправить удаленное push-уведомление пользователю с сервера при наступлении определенного события, и это заставит пользователя снова получить приложение на переднем плане, и приложение начнет получать обновленные данные "в моем случае здесь сообщение ".

person Kegham K.    schedule 12.05.2017

вы можете найти местоположение в закрытом состоянии приложения после значительного изменения местоположения, например, около 500 метров. вот рабочий пример

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

но то, на чем я застрял, - это размещение почты через веб-сервис.

person Rushi trivedi    schedule 26.08.2017

@Jack.Right, вы можете вызывать метод через каждый час, поэтому используйте 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];
    });
}
person Sanjeet verma    schedule 19.05.2016
comment
но дело в том, где я должен написать свой код, чтобы метод вызывался через каждый час? NSTimeinterval будет работать, если мое приложение будет завершено? - person Jack.Right; 19.05.2016
comment
@Jack.Right, если вы хотите вызвать метод после завершения работы приложения, используйте скрытое уведомление. - person Sanjeet verma; 19.05.2016
comment
Неправильный ответ. NSTimer не работает в фоновом режиме. - person TheTiger; 19.05.2016
comment
@уважаемый голосующий против, я думаю, вы не хотите получать ответ, просто вы знаете, как отклонить голосование. - person Sanjeet verma; 19.05.2016
comment
Используйте методы жизненного цикла ApplicationDelegate для его управления. application:didFinishLaunchingWithOptions: applicationDidBecomeActive: applicationWillResignActive: applicationDidEnterBackground: applicationWillEnterForeground: applicationWillTerminate: applicationDidFinishLaunching: - person Sanjeet verma; 19.05.2016
comment
@Sanjeetverma Не так! Вы пробовали свой код? Это сработает только один раз. Не в петле навсегда. И если пользователь закроет приложение, оно не сработает ни разу. - person TheTiger; 19.05.2016