如何解决iOS:在应用程序购买 Swift 成功后如何获取交易 ID 或收据数据 更新
我想知道如何在成功购买后获取交易 ID 或收据信息,以便我可以将其发送到我的服务器并用于购买验证。 同样在同一主题上,我想知道如果在我将购买信息发送到我的服务器之前由于某种原因连接中断,那么我将如何将通知链接到购买订阅的用户?
谢谢
所以我想在下面开关的 .purchased 部分进行处理
import Foundation
import StoreKit
class StoreManager: NSObject,ObservableObject,SKProductsRequestDelegate,SKPaymentTransactionObserver {
//FETCH PRODUCTS
var request: SKProductsRequest!
@Published var myProducts = [SKProduct]()
func getProducts(productIDs: [String]) {
print("Start requesting products ...")
let request = SKProductsRequest(productIdentifiers: Set(productIDs))
request.delegate = self
request.start()
}
func productsRequest(_ request: SKProductsRequest,didReceive response: SKProductsResponse) {
print("Did receive response")
if !response.products.isEmpty {
for fetchedProduct in response.products {
dispatchQueue.main.async {
self.myProducts.append(fetchedProduct)
}
}
}
for invalidIdentifier in response.invalidProductIdentifiers {
print("Invalid identifiers found: \(invalidIdentifier)")
}
}
func request(_ request: SKRequest,didFailWithError error: Error) {
print("Request did fail: \(error)")
}
//HANDLE TRANSACTIONS
@Published var transactionState: SKPaymentTransactionState?
func purchaseProduct(product: SKProduct) {
if SKPaymentQueue.canMakePayments() {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
} else {
print("User can't make payment.")
}
}
func paymentQueue(_ queue: SKPaymentQueue,updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
transactionState = .purchasing
case .purchased:
UserDefaults.standard.setValue(true,forKey: transaction.payment.productIdentifier)
queue.finishTransaction(transaction)
transactionState = .purchased
case .restored:
UserDefaults.standard.setValue(true,forKey: transaction.payment.productIdentifier)
queue.finishTransaction(transaction)
transactionState = .restored
case .Failed,.deferred:
print("Payment Queue Error: \(String(describing: transaction.error))")
queue.finishTransaction(transaction)
transactionState = .Failed
default:
queue.finishTransaction(transaction)
}
}
}
func restoreProducts() {
print("Restoring products ...")
SKPaymentQueue.default().restoreCompletedTransactions()
}
}
解决方法
你可以试试这个 -
if let url = Bundle.main.appStoreReceiptURL,let data = try? Data(contentsOf: url) {
let receiptBase64 = data.base64EncodedString()
// Send to server
}
更新
想知道如果在接收字符串发送到我的服务器之前连接中断并且由于某种原因用户在我可以处理它之前删除了应用程序或其他东西时,您会推荐什么。
- 在 UserDefaults 中为名为
true
的变量存储一个needsToSendPurchaseReceiptToServer
值。 - 在成功完成 API 调用后将其更新为
false
。 - 如果 api 调用失败,请勿更新 UserDefaults 值。
- 下次您的应用从后台
appDidBecomeActive
回调启动/恢复时,您检查此标志,如果它仍然是true
,请再次尝试将收据发送到服务器。 - 应该不需要向用户提供任何通知。
- 如果多次失败,用户仍然可以通过
Restore Purchase
选项手动触发。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。