我在 swift 的 IAP 訂閱處理中有一個問題。我在我的應用程式中使用 IAP 訂閱,邏輯運行良好,我沒有任何問題。我想檢查處理來自 paymentQueue 的交易。我注意到它正在回圈來自 paymentQueue 的所有交易,我必須驗證所有交易的收據。這是回圈和檢查所有交易的必要條件,還是我應該只關注最后一筆交易。最后一筆交易是否是最近一筆交易。以下是該部分代碼的代碼片段。
在輸出控制臺中,我得到以下行(最后三行回圈 140 次): Total Transaction Count - 140
開始重繪 收據...
內部決議收據....
購買的交易
問題:是否需要處理所有交易(本例中為 140) 這 140 是針對同一產品的。我可以通過任何方式避免這種回圈,從而改進處理。
提前致謝。
extension IAPManager: SKPaymentTransactionObserver {
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print(" Total Transaction Count - \(queue.transactions.count)")
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
notifyIsPurchased(transaction: transaction)
SKPaymentQueue.default().finishTransaction(transaction)
print ("Transaction Purchased")
break
case .failed:
SKPaymentQueue.default().finishTransaction(transaction)
self.failureBlock?(transaction.error)
cleanUp()
break
case .restored:
notifyIsPurchased(transaction: transaction)
SKPaymentQueue.default().finishTransaction(transaction)
print("restored")
break
case .deferred:
print("defered")
break
case .purchasing:
print("purchasing")
break
default:
break
}
}
}
private func notifyIsPurchased(transaction: SKPaymentTransaction) {
refreshSubscriptionsStatus(callback: {
self.successBlock?()
self.cleanUp()
}) { (error) in
// couldn't verify receipt
self.failureBlock?(error)
self.cleanUp()
}
}
func refreshSubscriptionsStatus(callback : @escaping SuccessBlock, failure : @escaping FailureBlock) {
print("Start refreshing reciept...")
self.refreshSubscriptionSuccessBlock = callback
self.refreshSubscriptionFailureBlock = failure
guard let receiptUrl = Bundle.main.appStoreReceiptURL else {
print("No reciept")
refreshReceipt()
return
}
let urlString = "https://sandbox.itunes.apple.com/verifyReceipt"
//let urlString = "https://buy.itunes.apple.com/verifyReceipt"
let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString()
let requestData = ["receipt-data" : receiptData ?? "", "password" : self.sharedSecret, "exclude-old-transactions" : true] as [String : Any]
var request = URLRequest(url: URL(string: urlString)!)
request.httpMethod = "POST"
request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: [])
request.httpBody = httpBody
URLSession.shared.dataTask(with: request) { (data, response, error) in
DispatchQueue.main.async {
if data != nil {
if let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments){
//print (json)
self.parseReceipt(json as! Dictionary<String, Any>)
return
}
} else {
print("error validating receipt: \(error?.localizedDescription ?? "")")
}
self.refreshSubscriptionFailureBlock?(error)
self.cleanUpRefeshReceiptBlocks()
}
}.resume()
}
private func parseReceipt(_ json : Dictionary<String, Any>) {
print("Inside Parsing Reciept....")
guard let receipts_array = json["latest_receipt_info"] as? [Dictionary<String, Any>] else {
self.refreshSubscriptionFailureBlock?(nil)
self.cleanUpRefeshReceiptBlocks()
return
}
process the receipt array and check if it is expired or valid...
}
uj5u.com熱心網友回復:
根據Apple 檔案,沒有 100% 保證您的最后一筆交易[SKPaymentTransaction]是您最近的一筆交易,其中寫有該 屬性:transactions
已更新的事務陣列。
transactions盡管陣列通常用于順序很重要的元素,但沒有明確說明是否已正確排序。但是,您可以通過訪問transactionDate屬性輕松地自己對交易進行排序。這是一個例子:
func paymentQueue(_ queue: SKPaymentQueue,
updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
let ascendingTransactions = transactions.filter({$0.transactionDate != nil})
.sorted(by: {$1.transactionDate! > $0.transactionDate!})
let latestTransaction = ascendingTransactions.last
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430146.html
