Убедитесь, что связь между приложением iOS и серверной частью прошла успешно - PullRequest
0 голосов
/ 17 декабря 2018

Простой вопрос: Как обеспечить успешную связь между приложением 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 или нет.Если не пусто, я отправляю запрос на сервер.


Что вы думаете об этом подходе?Как вы управляете такими данными, которые вы не хотите, чтобы они были «потеряны»?

1 Ответ

0 голосов
/ 18 декабря 2018

То, что вы хотите сделать, это подождать, чтобы «завершить транзакцию», пока вы не получите 200 ответ от вашего сервера.Если вы не завершите транзакцию, Apple сохранит ее в очереди платежей и будет отправлять вам при каждом запуске приложения.Это даст вам возможность обрабатывать любые повторные попытки на вашем сервере, если это необходимо.

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

Выполните все следующие действия, прежде чем завершить транзакцию:

  • Сохраните покупку.
  • Загрузка связанного содержимого.
  • Обновите пользовательский интерфейс вашего приложения, чтобы предоставить пользователю доступ к продукту.

Чтобы завершить транзакцию, вызовите метод finishTransaction: дляОчередь платежей.

SKPaymentTransaction *transaction = <# The current payment #>;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Подробнее о завершении транзакций вы можете прочитать в документе Apple ниже: https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html

...