Могу ли я сделать вызов API, когда пользователь завершает приложение? - PullRequest
3 голосов
/ 19 марта 2019

Мне нужно сделать вызов API, когда пользователь завершает работу приложения (принудительное закрытие). Я выполнил прямую реализацию, как показано ниже.

В приложении-делегате я добавил следующий код.

func applicationWillTerminate(_ application: UIApplication) {
    print("________TERMINATED___________")
    testAPICall()
}

func testAPICall(){
    let url = getURL()
    let contentHeader = ["Content-Type": "application/json"]
    Alamofire.request(url,
                  method: .put,
                  parameters: ["username": "abc@xyz.com"],
                  encoding: JSONEncoding.default,
                  headers: contentHeader).responseJSON { (response) -> Void in
                    print("-----")
                  }
}

Однако звонок не выполняется. И, изучив документацию , я обнаружил, что у меня есть всего 5 секунд для выполнения задачи в этом методе, и, прежде всего, вызов api здесь не является задачей. Поэтому мне интересно, как бы это сделать.

1 Ответ

3 голосов
/ 19 марта 2019

Это двойной вопрос

Этап 1. Обеспечение запуска API-вызова каждый раз, когда пользователь завершает работу приложения / до того, как оно станет активным

Вы всегда можете использовать expiration handler фоновый режим iOS application В вашем приложении легально

объявить var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0);

и в вашем приложении легальная информация

 func applicationDidEnterBackground(_ application: UIApplication) {

    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
        // Do something to stop our background task or the app will be killed
        application.endBackgroundTask(self.bgTask)
        self.bgTask = UIBackgroundTaskIdentifier.invalid
    })

    DispatchQueue.global(qos: .background).async {
        //make your API call here
    }
    // Perform your background task here
    print("The task has started")
}

Фоновый обработчик истечения срока действия гарантирует, что у вас будет достаточно времени для запуска вызова API каждый раз, когда вы ставите приложение неактивным или прекращаете работу

Этап 2. Обеспечение успешного завершения вызова API-интерфейса

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

Единственный способ убедиться в успешности вызова API после запуска - убедиться, что используется правильная конфигурация для URLSession

Согласно документации

Фоновые сеансы позволяют выполнять загрузки и выгрузки контента. в фоновом режиме, пока ваше приложение не работает.

ссылка: https://developer.apple.com/documentation/foundation/nsurlsession?language=objc

Так что используйте фоновый сеанс и используйте задачу загрузки. Вместо того, чтобы иметь простой API get / post, к которому вы будете обращаться с каким-либо параметром, попросите вашего бэкэнд-разработчика принять файл и поместить все ваши параметры в этот файл (если есть) и запустить задачу загрузки с фоновым сеансом.

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

Это, я полагаю, самое близкое, что вы можете получить, чтобы обеспечить запуск вызова API и его завершение после того, как приложение станет неактивным / завершенным. У меня вроде была дискуссия с разработчиком Apple относительно того же самого, и они согласились, что это может быть вероятным решением:)

надеюсь, это поможет

...