pil*_*man 4 in-app-purchase ios swift swiftui
我想知道成功购买后如何获取交易 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()
}
}
Run Code Online (Sandbox Code Playgroud)
你可以试试这个——
if let url = Bundle.main.appStoreReceiptURL,
let data = try? Data(contentsOf: url) {
let receiptBase64 = data.base64EncodedString()
// Send to server
}
Run Code Online (Sandbox Code Playgroud)
想知道如果例如在收据字符串发送到我的服务器之前连接中断,并且由于某种原因用户在我可以处理它之前删除了应用程序或其他内容,那么您会建议什么。
true在 UserDefaults 中为名为 的变量存储一个值needsToSendPurchaseReceiptToServer。false成功完成 API 调用后将此更新为。appDidBecomeActive回调恢复时,您检查此标志,如果它仍然是true,请尝试再次将收据发送到服务器。Restore Purchase选项手动触发此操作。| 归档时间: |
|
| 查看次数: |
3593 次 |
| 最近记录: |