Если я что-то покупаю и проверяю квитанцию ​​о покупке, я могу получить закодированное значение следующим образом:

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

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

                let receiptString = receiptData.base64EncodedString(options: [])
                print("receiptString \(receiptString)")
                // Read receiptData
            }
            catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
        }

Но если я что-то куплю, то удалю приложение и переустановлю его снова и проверю чек, я ничего не могу получить с верхним кодом. Это просто получить appStoreReceiptURL и перейти сразу, не вводя do {} catch. Как я могу получить квитанцию ​​в этом случае?

1
Tulon 26 Янв 2022 в 12:44
Вы должны предоставить кнопку «Восстановить покупки»
 – 
Paulw11
26 Янв 2022 в 12:51
Если я использую восстановление покупки, то пользователь получит обратно сумму за свою последнюю покупку, верно? Но здесь я хочу проверить, действителен ли его срок оплаты или нет. Если это действительно так, я позволю ему войти в мое приложение, если нет, то он останется. Как я могу это сделать?
 – 
Tulon
26 Янв 2022 в 13:02

1 ответ

Лучший ответ

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

В руководствах по обзору App Store четко указано, что

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

Это означает, что вы все равно должны предоставить какой-то механизм (например, кнопку «Восстановить покупку»), независимо от сценария, когда пользователь удаляет приложение. В вашем случае вы можете предоставить кнопку «Восстановить» прямо на экране входа в систему. Ознакомьтесь с информацией о кнопке «Восстановить покупку» в разделе рекомендации Apple Human Interface.

Если вы хотите восстановить покупку непосредственно с помощью Apple API после того, как пользователь нажмет кнопку «Восстановить покупку», вы можете использовать:

SKPaymentQueue.default().restoreCompletedTransactions()

, который запускает серверы Apple, проверяет Apple ID пользователей и получает все покупки приложений, которые они сделали ранее, и возвращает вам транзакцию, которую вы наблюдаете с помощью SKPaymentTransactionObserver, с помощью этого кода:

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        if transaction.transactionState == .restored {
            //here is your restored transaction
        }
    }
}

Однако, если вы хотите получить новый чек со всеми данными чека, включая предыдущие покупки, я рекомендую не использовать Apple API напрямую, а использовать библиотеку SwiftyStoreKit: ссылка на github. Пример кода ниже:

    func restoreYourPurchases( completion: @escaping (Result<Bool,Error>) -> Void) {
    SwiftyStoreKit.restorePurchases(atomically: true) { results in
        var restoreSuccessfull = false
        if results.restoreFailedPurchases.count > 0 {
            print("Restore Failed: \(results.restoreFailedPurchases)")
        }
        else if results.restoredPurchases.count > 0 {
            print("Restore Success: \(results.restoredPurchases)")
            for purchase in results.restoredPurchases {
                if purchase.productId == "yourID" {
                    let timeOfPurchase = purchase.originalPurchaseDate
                }
            }
        }
        else {
            print("Nothing to Restore")
            completion(.success(false))
        }
    }
}
1
Mr.SwiftOak 26 Янв 2022 в 13:38
Большое спасибо за такое хорошее объяснение. Меня смутила функциональность «Кнопки восстановления». Я думал, что он используется для возврата денег пользователям, но на самом деле он просто гарантирует, что пользователь приобретет услугу ранее, если я правильно вас понимаю.
 – 
Tulon
26 Янв 2022 в 13:48
Говоря о SwiftyStoreKit, я видел много сообщений об отклонении приложений на их вкладке обсуждения Girhub. Как вы думаете, я должен использовать эту третью сторону?
 – 
Tulon
26 Янв 2022 в 13:49
1
Что ж, я сам внедрил SwiftyStoreKit около 6 месяцев назад и не столкнулся с проблемами при отправке в App Store, однако все могло измениться. Вы все еще можете использовать базовый StoreKit, если хотите. Или используйте некоторую комбинацию -> StoreKit для покупок (довольно просто) и SwiftyStoreKit для восстановления и получения исходных данных о покупках.
 – 
Mr.SwiftOak
26 Янв 2022 в 14:31