Получение обратного вызова при завершении работы приложения (пользователем или ОС) - PullRequest
0 голосов
/ 14 февраля 2019

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

Что я хочу сделать, так это то, что когда приложение закрывается, я бы хотелотменить локальные уведомления и полагаться на push-уведомления, поскольку мой локальный контент уведомлений динамический, который обновляется с помощью тихих уведомлений, когда приложение находится на переднем или заднем плане.PS Локальные уведомления запускаются каждые 10 минут, поэтому нельзя полагаться на push-уведомления.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

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

Но есть подсказка, которая может вам помочь.Теперь предположим, что вы включили одну из возможностей фонового режима в Xcode, например Bluetooth.В этой ситуации (ваше приложение было прервано iOS раньше), если происходит связанное событие Bluetooth, iOS снова запускает ваше приложение и сообщает вашему приложению, что послужило причиной запуска вашего приложения операционной системой.эта информация хранится в lunchOptions этой функции:

application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil)

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

0 голосов
/ 14 февраля 2019

applicationWillTerminate вызывается, когда пользователь закрывает приложение, не переключая его в фоновый режим.Таким образом, пользователь должен дважды нажать кнопку «Домой» и выбросить приложение для выполнения этого действия applicationWillTerminate.

Спасибо, @Cristik за исправление.

Note:- applicationWillTerminate is not called when the user quits the app if the app supports background execution.

Вы можете проверить это:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        if UserDefaults.standard.bool(forKey: "terminated") {
            DispatchQueue.main.async {
                let alertView: UIAlertController = UIAlertController.init(title: "Prompt", message: "App was terminated earlier", preferredStyle: .alert)
                let alertAction = UIAlertAction(title: "Done", style: .cancel) { (action:UIAlertAction) in
                    UserDefaults.standard.removeObject(forKey: "terminated")
                    UserDefaults.standard.synchronize()
                }

                alertView.addAction(alertAction)

                self.window?.rootViewController?.present(alertView, animated: true, completion: nil)
            }
        }

        return true
}
func applicationWillTerminate(_ application: UIApplication) {
        UserDefaults.standard.set(true, forKey: "terminated")
        UserDefaults.standard.synchronize()
}
...