Простой вопрос: Как обеспечить успешную связь между приложением iOS и серверной частью?
Подробно: Для большей частиВызов API в нашем мобильном приложении, это может быть «ОК», если связь между приложением и сервером прерывается (по сетевой причине или по другой причине), мы можем просто отобразить сообщение пользователю с помощью кнопки повтора, чтобы перезагрузить его новости или сообщениянапример, feed.
Однако в некоторых случаях мы хотим быть по-настоящему уверены, что связь между приложением и серверной частью никогда не прекратится и данные этого обмена потенциально могут быть «потеряны».
Для этого давайте в качестве примера рассмотрим встроенные покупки (IAP):
- В моем приложении информация о IAP выглядит следующим образом:
struct InAppPurchase{
// The id of the purchase
let transactionId: String
// The id of the user who purchased
let userId: String
// The IAP product involved in the purchase (10 or 30 in-app coins for example)
let productId: String
}
- Каждый раз, когда пользователь совершает покупку, я хочу отправить эту информацию на сервер, чтобы сохранить историю покупок, сделанных в моем приложении.
- Я не хочупропустить любую из этих связей между приложением и сервером (если пользователь отправил мне отзыв о том, что он заплатил за какой-то элемент в моем приложении, я хочу убедиться, проверив историю, что он действительно совершил покупку)
- Если покупка прошла успешно, но звонок для отправки информации на сервер не выполнен (ошибка сети или другое), эта информация не может быть потеряна и должна быть отправлена как можно скорее.
Я былдумая об этом подходе:
- Создание массива ожидающих покупок с
UserDefault
или Keychain
, например,
var pendingPurchases = [InAppPurchase]()
Когда пользовательпокупает предмет, этот предмет хранится в массиве pendingPurchases
.
Приложение связывается с внутренним сервером, отправляя этот массив IAP
Если я получаю код ответа 200 SUCCESS
от сервера, я могу очистить массив pendingPurchases
.
Если я получу другой код для ОШИБКИ, я попытаюсьотправить этот вызов в другой раз (ограничено 3 подряд, если ониз-за плохой сети, возможно, в данный момент не нужно пытаться отправить запрос на неопределенный срок) до получения 200 SUCCESS
каждый раз, когда приложение открыто или переключается с фона на передний план,Я проверяю, пусто ли pendingPurchases
или нет.Если не пусто, я отправляю запрос на сервер.
Что вы думаете об этом подходе?Как вы управляете такими данными, которые вы не хотите, чтобы они были «потеряны»?