Swift: запускать определенный код, когда приложение убито?

У меня есть фреймворк, который возвращает ViewController моему приложению по запросу. Этот контроллер представления содержит QR-код, который подлежит изменению через определенный период времени, например, через 3 дня.

Я хотел бы вызвать метод, содержащийся внутри фреймворка, через 3 дня, чтобы измененный/обновленный QR был легко доступен, даже если пользователь не использует приложение активно. Когда пользователь открывает приложение - там обновленный QR!

Для этого я использовал ниже в моем ViewController внутри фреймворка - (из ссылка на учебник)

//MARK:- Add Timer to run QR Logic after 5 seconds
            let date = Date().addingTimeInterval(5)

            let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(QrUIViewController.performQrFetchLogic), userInfo: nil, repeats: true)

            RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

Этот фрагмент кода отлично работает, когда приложение активно/в фоновом режиме. Возможно ли это и как этого добиться, даже если приложение убито?

PS: я читал, что Jobscheduler и AlarmManager будут работать на Android — есть ли что-то подобное в iOS?


person Lohith Korupolu    schedule 21.09.2017    source источник
comment
В iOS вы можете запускать код приложения в фоновом режиме по определенным причинам (например, обновление местоположения, voip и т. д.). См. здесь: raywenderlich.com/143128/).   -  person Bence Pattogato    schedule 21.09.2017
comment
Для энергосбережения устройства очень плохо запускать таймер каждые 5 секунд для события, которое произойдет только через 3 дня. При создании объекта Date вы можете указать интервал с этого момента. let threeDaysInterval: TimeInterval = (3600*24)*3 let threeDaysFromNow = Date(timeIntervalSinceNow: threeDaysInterval) let timer = Timer(fireAt: threeDaysFromNow, interval: 0, target: self, selector: #selector(updateQrCode), userInfo: nil, повторяется: ложь)   -  person ekscrypto    schedule 21.09.2017
comment
@ekscrypto - это всего лишь образец. Я сделаю это через 3 дня, и как только мой обновленный QR будет получен, я аннулирую таймер.   -  person Lohith Korupolu    schedule 21.09.2017
comment
Как заставить это работать, когда приложение убито   -  person Lohith Korupolu    schedule 21.09.2017


Ответы (1)


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

Вы планируете локальное уведомление на какое-то время в будущем, а затем реагируете на него. Это касается как активного, так и фонового или неактивного приложения.

Помните, что уведомления не срабатывают, если пользователь убивает ваше приложение.

person SpacyRicochet    schedule 21.09.2017
comment
Вы не знаете. Apple считает, что пользователи убивают ваше приложение как признак того, что они каким-то образом достигли состояния, когда приложение не работает и, следовательно, не заслуживает доверия. iOS немедленно аннулирует любые фоновые привилегии таких приложений. Обратите внимание, что это не то же самое, что iOS убивает ваше приложение. Если iOS нормально убивает ваше приложение, фоновые задачи по-прежнему разрешены. - person SpacyRicochet; 21.09.2017
comment
это хороший улов! ясно для меня ... и, может быть, глупый вопрос - убить приложение и завершить приложение - это одно и то же - это правильно? - person Lohith Korupolu; 21.09.2017
comment
Слова используются взаимозаменяемо. Так что да, в основном правильно. Раздражает, что мы не знаем слово, которое Apple использует навскидку. Так было бы понятнее. - person SpacyRicochet; 21.09.2017
comment
Локальные уведомления поддерживаются начиная с ios10+. мое приложение поддерживает ios8+ :-( - person Lohith Korupolu; 21.09.2017
comment
Вы думаете о структуре UserNotification. То есть iOS 10 и выше. Также есть UILocalNotifications из очень старой версии iOS. Вы можете поддержать обоих. - person SpacyRicochet; 21.09.2017
comment
Давайте продолжим обсуждение в чате. - person SpacyRicochet; 21.09.2017