Является ли appStoreReceiptURL пользователя статическим в Swift?

Я просматриваю опрос статуса, чтобы в любой момент времени видеть статус подписки (автоматического продления) моих пользователей. Процесс прост: если у вас есть строка данных квитанции для пользователя, вы можете отправить ее в Apple (на стороне сервера), и они вернут расшифрованный JSON квитанции. Вот мой код для получения данных квитанции при покупке автоматически продлеваемой подписки:

if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
                    FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {

                    do {
                        let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
                        print(receiptData)

                        //Encrypted receipt data
                        let receiptString = receiptData.base64EncodedString(options: [])
}                    }

Когда я тестирую пользователя песочницы, покупающего разные подписки в моем приложении снова и снова, я вижу, что строка данных квитанции меняется, но неясно, дают ли старые строки актуальную историю транзакций при передаче на сервер Apple.

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

Мой вопрос: Нужно ли мне постоянно обновлять значение строки данных квитанции пользователя в моей базе данных, чтобы через несколько месяцев просмотреть статус его подписки? Как насчет другого устройства?


person Ludovico Verniani    schedule 06.05.2020    source источник


Ответы (1)


Лучший способ получить обновление статуса подписки — сохранить все квитанции в базе данных, а серверные службы должны подключаться к серверу Apple для получения последних обновлений.

Любые действия по подписке (отмена, продление, переход на более раннюю версию, обновление) должны выполняться из бэкэнда. Ниже приведены преимущества для этого

  1. Подписки будут предоставляться со ссылкой на уникальный идентификатор электронной почты.
  2. Если какой-либо пользователь меняет устройство, доступ к подписке обрабатывается в соответствии с уникальным идентификатором электронной почты.
  3. Это предотвращает мошенничество с доступом к подписке для нескольких пользователей.

В песочнице это позволяет вам часто покупать подписки, потому что процесс повторяющейся и отмены подписки занимает минуты/часы в зависимости от продолжительности, которую вы выбрали в «Покупке в приложении».

Исходные метаданные в квитанциях не меняются, пока клиент не отменит повторяющуюся подписку. Таким образом, вы можете сохранить и использовать эту квитанцию ​​для дальнейших обновлений.

person Daljeet Seera    schedule 06.05.2020
comment
Отлично, спасибо. Я собираюсь продолжить выполнять все проверки в своем бэкэнде, используя исходную строку квитанции о покупке, полученную с устройства. Проведя дополнительные испытания и исследования, я обнаружил, что Apple позаботится об отправке обновленной квитанции даже со старой строкой квитанции. Ваше здоровье - person Ludovico Verniani; 06.05.2020
comment
Здорово. Вы можете включить межсерверные уведомления для мониторинга подписок в режиме реального времени. developer.apple.com/documentation/appstoreservernotifications - person Daljeet Seera; 06.05.2020
comment
Это определенно вариант, но на данный момент моя подписка действует только на одной платформе: на родном устройстве. Поэтому каждый раз, когда пользователь открывает приложение, я проверяю его подписку, поэтому на данный момент я не вижу необходимости в уведомлениях между серверами. - person Ludovico Verniani; 06.05.2020
comment
То есть только для iOS. Это альтернатива получению последнего обновления для каждой квитанции, вы можете настроить уведомления от сервера к серверу, которые уведомляют вас всякий раз, когда происходит изменение со стороны клиента. - person Daljeet Seera; 06.05.2020