Вызов облачной функции в applicationWillTerminate - PullRequest
0 голосов
/ 13 марта 2020

Я хочу удалить некоторые данные из моей базы данных в реальном времени, когда приложение будет закрыто.

Я определил функцию следующим образом (я добавлю к ней логи c позже):

exports.removeAllAssignedTeams = functions.https.onCall((data, context) => {
  const judgeId = data.judgeId;
  console.log("Will unassign all teams assigned to judge id: ", judgeId);
});

И я вызываю ее из моего делегата приложения:

func applicationWillTerminate(_ application: UIApplication) {
    print("Application will terminate")
    functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumber()]) { (_, _) in }
}

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

Ответы [ 2 ]

1 голос
/ 13 марта 2020

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

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

Я предлагаю протестировать ваш код вне applicationWillTerminate, чтобы увидеть, работает ли он так, как вы ожидаете. Если это произойдет, вы можете предположить, что до завершения процесса вызов времени не завершается вовремя.

Также имейте в виду, что вызов вызываемой функции является асинхронным, и call() вернет непосредственно перед получением результата. Поэтому ваша реализация немедленно возвращается, что, вероятно, сигнализирует iOS, что вы закончили с вашей работой. Даже если вам удастся сделать блок реализации до завершения вызова, он все равно может не завершиться sh до истечения ваших приблизительно 5 секунд.

0 голосов
/ 13 марта 2020

Если вы хотите удалить данные из базы данных реального времени при отключении пользователя, рассмотрите , используя обработчик onDisconnect . С таким обработчиком сервер удалит данные, когда обнаружит, что клиент ушел. Это может занять несколько минут (в зависимости от того, как приложение закрыто), но, как правило, будет более надежным, чем попытки выполнять какие-либо сетевые вызовы, когда приложение закрывается, поскольку инструкция о том, что делать, сразу отправляется на сервер, когда вы вызов onDisconnect.

Если вы используете обработчик onDisconnect, то, что вы можете сделать в applicationWillTerminate, - это активно сказать клиенту закрыть соединение, вызвав goOffline() метод . Хотя это также может не работать, в этом случае сервер все равно обнаружит, что клиент пропал через несколько минут, в то время как в случае, когда вызов на go offline делает это, обработчик onDisconnect будет выполняется сразу.

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

...