Это двойной вопрос
Этап 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 относительно того же самого, и они согласились, что это может быть вероятным решением:)
надеюсь, это поможет