2016-11-06 3 views
5

Я создаю приложение для своей школы, которое должно проверять каждые n минут, если на веб-сайте есть новая метка. Для этого при первом входе в систему пользователя номер фактической метки сохраняется в «UserDefaults». Когда приложение завершается, через n минут число баллов пересчитывается и сравнивается с предыдущим, и отправляет уведомление в случае изменения номера.Выполнение фоновых задач, когда приложение завершено

Что я хотел бы знать, есть ли способ выполнить эту задачу. Я попытался создать таймер в -applicationWillTerminate, но он запускается только один раз. Это то, что я пробовал:

func applicationWillTerminate(_ application: UIApplication) { 
    DispatchQueue.main.async { 
     self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.findMark), userInfo: nil, repeats: true) 
     self.timer.fire() 
    } 
} 

Selector findMark задача.

Заранее благодарен!

+0

Это невозможно сделать, когда приложение завершено. Пожалуйста, проверьте мой ответ. Не стесняйтесь задавать какие-либо сомнения :) – KrishnaCA

+0

Вы собираетесь запускать приложение в течение бесконечного времени в фоновом режиме или только когда приложение будет прекращено? –

+0

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

ответ

9

У вас есть два варианта

  1. фон App Обновить
  2. Тихого Push-уведомление

Самого простой из них фонового обновления. Потому что позже для отправки уведомления требуется сервер. Вы можете проверить следующее: API. В основном вы установили Фоновая выборка возможность по возможностям/фоновым режимам вашего приложения. Затем время от времени iOS пробуждает ваше приложение и вызывает делегат application(_:performFetchWithCompletionHandler:).У вас будет около 30-45 секунд, чтобы вызвать функцию и обработчик завершения вызова. Если вы не закончите это вовремя, iOS убьет ваше приложение. Если вы не подчиняетесь правилам, iOS даст вам меньше шансов проснуться. Для более подробного использования фоновых режимов вы можете проверить следующее: tutorial

+0

Я читал, что приложение (_: performFetchWithCompletionHandler :) не выполняет задачу каждые n минут .. правильно? –

+0

Да. iOS планирует этот вызов, и у вас нет способа узнать, когда он будет вызван. Однако чем больше приложений используется, тем больше iOS вызовет этот обработчик. Без push-уведомлений нет надежного способа пробуждения приложения за n минут. – Meanteacher

+0

В соответствии с вопросом, этот ответ не должен приниматься. – RamGrg

3

Невозможно выполнить задачи, описанные в вашем вопросе после прекращения действия приложения. Как описано в документации:

App Расторжение

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

Приостановленные приложения не получают уведомления при их прекращении; система убивает процесс и восстанавливает соответствующую память. Если приложение в настоящее время работает в фоновом режиме и не приостановлено, система вызывает applicationWillTerminate: своего делегата приложения до завершения. Эта система не вызывается при перезагрузке устройства.

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

Ссылка: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

Edit:

Вы не можете выполнить любую задачу после того, как приложение завершается. Что вы можете сделать, так это получить этот расчет с сервера и отправить Push Notification на устройство.

+0

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

+0

Это PushNotification или LocalNotification. Если это то, что необходимо, я добавлю это в ответ. Подождите .. – KrishnaCA

+0

да, вот что я имею в виду .. но когда приложение закрыто, задача, которая отправляет localNotification, вызывается только один раз –

Смежные вопросы