我正在使用應用內購買在 SwiftUI 中制作應用。在這個應用程式中,用戶應該可以購買任意次數的積分,所以我使用了消耗品。但是當我再次嘗試購買它們時,我得到了“此應用內購買已被購買。它將免費恢復”的資訊。我已經在尋找如何做到這一點的方法,但沒有一個想法對我有用。
這是我的 StoreManager 類:
import Foundation
import StoreKit
import SwiftUI
class StoreManager : NSObject, ObservableObject, SKProductsRequestDelegate {
@EnvironmentObject var authViewModel: AuthViewModel
@Published var transactionState: SKPaymentTransactionState?
@Published var myProducts = [SKProduct]()
var request: SKProductsRequest!
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)")
}
}else{
print("it's empty")
}
}
func getProducts(productIDs: [String]) {
let request = SKProductsRequest(productIdentifiers: Set(productIDs))
request.delegate = self
request.start()
}
func request(_ request: SKRequest, didFailWithError error: Error) {
print("Request did fail: \(error)")
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
transactionState = .purchasing
break
case .purchased:
print("purchased")
queue.finishTransaction(transaction)
transactionState = .purchased
break
case .restored:
print("restored")
transactionState = .restored
queue.finishTransaction(transaction)
break
case .failed, .deferred:
queue.finishTransaction(transaction)
transactionState = .failed
break
default:
queue.finishTransaction(transaction)
break
}
}
}
func purchaseProduct(product: SKProduct) {
if SKPaymentQueue.canMakePayments() {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
} else {
print("User can't make payment.")
}
}
func restoreProducts() {
SKPaymentQueue.default().restoreCompletedTransactions()
}
}
我只是將 getProducts 與 onAppear 一起使用,并在按鈕操作時購買產品。
請幫助我,或者如果已經存在類似問題的答案,請向我發送指向該主題的鏈接。
uj5u.com熱心網友回復:
您的StoreManager類需要符合SKPaymentTransactionObserver- 您已經實作了該協議中的相關委托方法,但您尚未宣告符合性,或者最重要的是,將您的StoreManager實體添加為事務佇列觀察者。
由于您沒有觀察交易,因此您永遠不會致電finishTransaction- 當您第二次嘗試購買該消耗品時,Store Kit 會看到該物品的購買不完整,因此您會收到已購買該物品的訊息。
除了實際注冊為事務佇列觀察者之外,重要的是您的應用程式StoreManager在啟動后立即創建一個實體- 在didFinishLaunching或等效位置。
這樣可以將之前運行的任何未完成購買呈現給您的交易佇列觀察者。
你應該只有一個實體,StoreManager它的生命周期應該是你的應用程式的生命周期。
你需要類似的東西:
class StoreManager : NSObject, ObservableObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
init() {
SKPaymentQueue.default().add(self)
}
此外,看到@EnvironmentObject var authViewModel: AuthViewModel讓我認為您的設計中可能存在關注點分離問題。
uj5u.com熱心網友回復:
這是因為有兩種型別的應用內購買。消耗品和非消耗品。消耗性內購可以多次進行,非消耗性應用內購買只能進行一次。
https://developer.apple.com/in-app-purchase/
解決方案
在 App Store Connect 應用內購買部分查看您創建的應用內購買型別。如果是非消耗品,請洗掉現有的應用內購買并創建一個新的消耗品。
資源
在 iOS 應用程式中實施應用內購買 (IAP)
將應用內購買添加到 SwiftUI 應用
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/407091.html
標籤:
