Как получить original_application_version (номер первой купленной версии) из квитанции iOS в iOS 11?

У меня есть платное приложение для iOS.

Мне нужно получить original_application_version номер (первая версия, приобретенная пользователем) из квитанции Apple AppStore.

Чтобы получить квитанцию, когда мое приложение загружается, я использую checkReceiptFromAppStore() функция:

func checkReceiptFromAppStore() {
    let receipt = self.getReceipt()
    print("receipt Data is: \(receipt)") // prints this: receipt Data is: Optional(5141 bytes)       
}

getReceipt() Функция заключается в следующем:

func getReceipt() -> Data? {
    if Bundle.main.appStoreReceiptURL != nil {
        print("app receipt: \(Bundle.main.appStoreReceiptURL)")
        do {
            let receiptData = try Data(contentsOf: Bundle.main.appStoreReceiptURL!)

            return receiptData
        } catch {
            print("error converting receipt to Data: \(error.localizedDescription)")
        }
    }
    return nil
}

Я посмотрел видео расширенного StoreKit WWDC 2017 о покупках и проверке квитанций в приложении и видео WWDC 2013 об использовании квитанций, прочитал различные ресурсы, связанные с моей проблемой ( это, это, это, это, это, и это...), но я до сих пор не понимаю, что делать дальше, чтобы получить "original_application_version" из квитанции App Store. Мне нужно только это поле, и я не понимаю, почему так трудно его получить. Я тоже это читал: https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

Я думаю, что квитанция не равна нулю, когда я запускаю команду print("Данные квитанции: (квитанция)"), она печатает это:

Я могу предположить, что мне нужно разобрать квитанцию, чтобы получить это поле. Могу ли я сделать это с помощью Decodable? Есть ли самый простой способ получить это original_application_version поле? Возможно ли это сделать без подтверждения квитанции?

Мне нужно получить original_application_version поле только для определения номера первой версии, купленной пользователем. Если вы знаете какие-либо другие решения для получения первого купленного номера версии, я буду рад их услышать.

Я занимаюсь разработкой в ​​Xcode 9, Swift 4, iOS 11

Любые ответы приветствуются, спасибо.

1 ответ

Все поля квитанции в двоичном формате в квитанции заявки. Вы должны использовать любой вид декодера чеков приложения, чтобы получить original_application_version. Всегда полезно проверять получение приложения перед использованием его содержимого. Например, вы можете использовать каркас RMStore ( RMStore). Он содержит валидатор квитанций, а также декодер. Пример источника Obj-C:

RMAppReceipt *appReceipt = RMAppReceipt.bundleReceipt;

if (appReceipt != nil && 
    [appReceipt.originalAppVersion length] > 0 && 
    ![appReceipt.originalAppVersion isEqualToString:@"1.0"]) {
    //Process your original app version 
} else {
    //Probably it is sandbox mode or app install via Xcode
    //Or maybe you should force app receipt refresh
}
Другие вопросы по тегам