大佬教程收集整理的这篇文章主要介绍了如何在iOS 11中处理应用内购买的应用商店付款?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
paymentQueue(_:shouldAddStorePayment:for:)
方法,以便我的应用程序可以直接从App Store处理IAP.
我正在使用itms-services:// url来测试它,就像它说的那样here.
问题是,我的SKPaymenttransactionObserver是一个特定的视图控制器,如果在打开itms-services://链接时它不可见,则不会调用委托方法.
我@R_616_10753@?我想我必须检测用户是否来自App Store推送正确的视图控制器,但我不知道如何.我现在能想到的唯一另一个选择是让App Delegate成为SKPaymenttransactionObserver,但这看起来真的很麻烦,当我尝试它时我无法让它工作.还有别的办法吗?
1-要初始化此类,只需从didFinishLaunchingWithOptions调用即可@H_301_13@StoreManager.shared.begin()然后添加付款观察员.
import Foundation import StoreKit class StoreManager: NSObject{ /** Initialize StoreManager and load subscriptions SKProducts from Store */ static let shared = StoreManager() func Begin(){ print("StoreManager initialized")) } override init() { super.init() // Add pyament observer to payment qu SKPaymentQueue.default().add(self) } func requestProductWithID(identifers:Set<String>){ if SKPaymentQueue.canMakePayments() { let request = SKProductsrequest(productIdentifiers: identifers) request.delegate = self request.start() } else { print("ERROR: Store Not Available") } } func buyProduct(product: SKProduct) { print("Buying \(product.productIdentifier)...") let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) } func restorePurchases(){ SKPaymentQueue.default().restoreCompletedtransactions() } /* Instance variables */ } // MARK: // MARK: SKProductsrequestDelegate //The delegate receives the product information that the request was interested in. extension StoreManager:SKProductsrequestDelegate{ func productsrequest(_ request: SKProductsrequest,didReceive response: SKProductsResponsE) { var products = response.products as [SKProduct] var buys = [SKProduct]() if (products.count > 0) { for i in 0 ..< products.count { let product = products[i] print("Product Found: ",product.localizedtitlE) } } else { print("No products found") } let productsInvalidIds = response.invalidProductIdentifiers for product in productsInvalidIds { print("Product not found: \(product)") } } func request(_ request: SKrequest,didFailWithError error: Error) { print("Something went wrong: \(error.localizedDescription)") } } // MARK: // MARK: SKtransactions extension StoreManager: SKPaymenttransactionObserver { public func paymentQueue(_ queue: SKPaymentQueue,updatedtransactions transactions: [SKPaymenttransaction]) { for transaction in transactions { switch (transaction.transactionStatE) { case .purchased: completetransaction(transaction: transaction) break case .Failed: Failedtransaction(transaction: transaction) break case .restored: restoretransaction(transaction: transaction) break case .deferred: // TODO show user that is waiTing for approval break case .purchasing: break } } } private func completetransaction(transaction: SKPaymenttransaction) { print("completetransaction...") deliverPurchaseForIdentifier(identifier: transaction.payment.productIdentifier) SKPaymentQueue.default().finishtransaction(transaction) } private func restoretransaction(transaction: SKPaymenttransaction) { guard let productIdentifier = transaction.original?.payment.productIdentifier else { return } print("restoretransaction... \(productIdentifier)") deliverPurchaseForIdentifier(identifier: productIdentifier) SKPaymentQueue.default().finishtransaction(transaction) } private func Failedtransaction(transaction: SKPaymenttransaction) { if let error = transaction.error as NSError? { if error.domain == SKErrorDomain { // handle all possible errors switch (error.codE) { case SKError.unkNown.rawValue: print("UnkNown error") case SKError.clienTinvalid.rawValue: print("client is not allowed to issue the request") case SKError.paymentCancelled.rawValue: print("user cancelled the request") case SKError.paymenTinvalid.rawValue: print("purchase identifier was invalid") case SKError.paymentNotAllowed.rawValue: print("this device is not allowed to make the payment") default: break; } } } SKPaymentQueue.default().finishtransaction(transaction) } private func deliverPurchaseForIdentifier(identifier: String?) { guard let identifier = identifier else { return } } } //in-app Purchases App Store extension StoreManager{ func paymentQueue(_ queue: SKPaymentQueue,shouldAddStorePayment payment: SKPayment,for product: SKProduct) -> Bool { return true //To hold //return false //and then to conTinue //SKPaymentQueue.default().add(savedPayment) } }
以上是大佬教程为你收集整理的如何在iOS 11中处理应用内购买的应用商店付款?全部内容,希望文章能够帮你解决如何在iOS 11中处理应用内购买的应用商店付款?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。