Swift 需要帮助从helper类实现应用内购买吗
我第一次尝试IAP,我需要一些连接点的帮助 我的应用程序有两个不同的非消耗性IAP,我在“产品”类中设置了这两个IAP,如果它自己是这样的:Swift 需要帮助从helper类实现应用内购买吗,swift,in-app-purchase,Swift,In App Purchase,我第一次尝试IAP,我需要一些连接点的帮助 我的应用程序有两个不同的非消耗性IAP,我在“产品”类中设置了这两个IAP,如果它自己是这样的: enum IAPProduct: String{ case tempoLevels = ".....TempoLevels" case timingLevels = ".....TimingLevels" } class IAPService: NSObject { private override init() {}
enum IAPProduct: String{
case tempoLevels = ".....TempoLevels"
case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject {
private override init() {}
static let shared = IAPService()
var products = [SKProduct]()
let paymentQueue = SKPaymentQueue.default()
func getProducts() {
let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]
let request = SKProductsRequest(productIdentifiers: products)
request.delegate = self
request.start()
paymentQueue.add(self)
}
func purchase(product: IAPProduct) {
guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
else {return}
let payment = SKPayment(product: productToPurchase)
paymentQueue.add(payment)
}
}
extension IAPService: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in response.products {
print(product.localizedTitle)
}
}
}
extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.transactionState.status(), transaction.payment.productIdentifier)
switch transaction.transactionState {
case .purchasing: break
default: queue.finishTransaction(transaction)
}
}
}
}
extension SKPaymentTransactionState {
func status() -> String{
switch self{
case .deferred: return "deferred"
case .failed: return "failed"
case .purchased: return "purchased"
case .purchasing: return "purchasing"
case .restored: return "restored"
@unknown default:
return("Something is wrong...")
}
}
}
func isPurchased() -> Bool {
let purchaseStatus = UserDefaults.standard.bool(forKey: ??)
if purchaseStatus == true {
print("Previously purchased!")
return true
}else{
print("Never purchased!")
return false
}
}
然后,我通过我找到的教程设置了一个帮助器类,如下所示:
enum IAPProduct: String{
case tempoLevels = ".....TempoLevels"
case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject {
private override init() {}
static let shared = IAPService()
var products = [SKProduct]()
let paymentQueue = SKPaymentQueue.default()
func getProducts() {
let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]
let request = SKProductsRequest(productIdentifiers: products)
request.delegate = self
request.start()
paymentQueue.add(self)
}
func purchase(product: IAPProduct) {
guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
else {return}
let payment = SKPayment(product: productToPurchase)
paymentQueue.add(payment)
}
}
extension IAPService: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in response.products {
print(product.localizedTitle)
}
}
}
extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.transactionState.status(), transaction.payment.productIdentifier)
switch transaction.transactionState {
case .purchasing: break
default: queue.finishTransaction(transaction)
}
}
}
}
extension SKPaymentTransactionState {
func status() -> String{
switch self{
case .deferred: return "deferred"
case .failed: return "failed"
case .purchased: return "purchased"
case .purchasing: return "purchasing"
case .restored: return "restored"
@unknown default:
return("Something is wrong...")
}
}
}
func isPurchased() -> Bool {
let purchaseStatus = UserDefaults.standard.bool(forKey: ??)
if purchaseStatus == true {
print("Previously purchased!")
return true
}else{
print("Never purchased!")
return false
}
}
我想在购买产品时在另一个视图控制器中触发一些功能。我该怎么做
我在其中一个视图控制器中设置了一个函数,用于检查其中一个视图控制器中的用户默认值,如下所示:
enum IAPProduct: String{
case tempoLevels = ".....TempoLevels"
case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject {
private override init() {}
static let shared = IAPService()
var products = [SKProduct]()
let paymentQueue = SKPaymentQueue.default()
func getProducts() {
let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]
let request = SKProductsRequest(productIdentifiers: products)
request.delegate = self
request.start()
paymentQueue.add(self)
}
func purchase(product: IAPProduct) {
guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
else {return}
let payment = SKPayment(product: productToPurchase)
paymentQueue.add(payment)
}
}
extension IAPService: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in response.products {
print(product.localizedTitle)
}
}
}
extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.transactionState.status(), transaction.payment.productIdentifier)
switch transaction.transactionState {
case .purchasing: break
default: queue.finishTransaction(transaction)
}
}
}
}
extension SKPaymentTransactionState {
func status() -> String{
switch self{
case .deferred: return "deferred"
case .failed: return "failed"
case .purchased: return "purchased"
case .purchasing: return "purchasing"
case .restored: return "restored"
@unknown default:
return("Something is wrong...")
}
}
}
func isPurchased() -> Bool {
let purchaseStatus = UserDefaults.standard.bool(forKey: ??)
if purchaseStatus == true {
print("Previously purchased!")
return true
}else{
print("Never purchased!")
return false
}
}
我不确定如何使用此功能,但如果我可以,我的应用程序中有代码,如果可能的话可以使用它。您可以直接使用
SKPaymentTransactionState
进行购买检查
如果想要Bool值,可以在创建事务后调用like thi
func isPurchased(transaction: SKPaymentTransaction) -> Bool {
return transaction.transactionState == .purchased
}
或者直接从KpaymentTransactionState扩展名中获取字符串值
func isPurchased(transaction: SKPaymentTransaction) -> String {
return transaction.status
}
同时,您不应该存储一个布尔值来检查用户是否在UserDefaults中购买了应用内购买。用户可以很容易地更改它(无需越狱)并免费获得您的商品您应该使用Keychain而不是UserDefaults。您可以直接使用
SKPaymentTransactionState
进行采购检查
如果想要Bool值,可以在创建事务后调用like thi
func isPurchased(transaction: SKPaymentTransaction) -> Bool {
return transaction.transactionState == .purchased
}
或者直接从KpaymentTransactionState扩展名中获取字符串值
func isPurchased(transaction: SKPaymentTransaction) -> String {
return transaction.status
}
同时,您不应该存储一个布尔值来检查用户是否在UserDefaults中购买了应用内购买。用户可以很容易地更改它(无需越狱)并免费获得您的商品您应该使用Keychain而不是UserDefaults。“用户可以很容易地更改它”用户将如何做到这一点?@matt iExplorer和iFunBox是两个软件示例,它们允许您在不越狱的情况下浏览iOS文件系统。我错了吗?他们真的允许你访问UserDefaults的内容吗?嗨,谢谢你的帮助。我尝试将这个返回bool的函数放在我正在使用的视图控制器中,但我得到一个错误,错误是:无法将类型为“SKPaymentTransactionState”的返回表达式转换为返回类型“bool”。是的,我找到了一个关于在键链中存储此信息的教程:“用户可以非常轻松地更改它”用户将如何做到这一点?@matt iExplorer和iFunBox是两个软件示例,它们允许您在不越狱的情况下浏览iOS文件系统。我错了吗?他们真的允许你访问UserDefaults的内容吗?嗨,谢谢你的帮助。我曾尝试将此函数放置在我正在使用的视图控制器中,该函数返回bool,但出现了一个错误,错误是:无法将类型为“SKPaymentTransactionState”的返回表达式转换为返回类型“bool”。是的,我找到了一个关于在钥匙链中存储此信息的教程: