使用单一产品在Swift中进行应用内购买
是否有一个简单的方法来实现一个单一的产品快速的应用程序内购买?
我想要一个触发应用程序内购买的button,如[ad-removal]或[unlock-premium-content]
我无法理解它的完整逻辑。
我试图从[Techotopia] http://www.techotopia.com/index.php/An_iOS_7_In-App_Purchase_Tutorial中关注和翻译本教程
但这是我第一次使用StoreKit框架,也使用Swift。
我只是想知道与Swift StoreKit框架的应用内购买交易的逻辑。
谢谢!
步骤0:在您的iTunes Connect帐户中,创build一个应用内购买。
对于单笔购买,请使用此方法:
- import
import StoreKit
- 符合StoreKit代表
class YOURViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
- 使用用户默认值来跟踪交易
let defaults = NSUserDefaults.standardUserDefaults()
- 产品编号 这个和你在iTunes Connect中的应用购买一样
var product_id: NSString? override func viewDidLoad() { product_id = "YOUR_PRODUCT_ID" super.viewDidLoad() SKPaymentQueue.defaultQueue().addTransactionObserver(self) //Check if product is purchased if (defaults.boolForKey("purchased")){ // Hide a view or show content depends on your requirement overlayView.hidden = true } else if (!defaults.boolForKey("stonerPurchased")) { print("false") } }
- 解锁内容。 这是初始化购买的button动作
@IBAction func unlockAction(sender: AnyObject) { print("About to fetch the products") // We check that we are allow to make the purchase. if (SKPaymentQueue.canMakePayments()) { var productID:NSSet = NSSet(object: self.product_id!); var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID); productsRequest.delegate = self; productsRequest.start(); println("Fetching Products"); } else { print("can't make purchases"); } }
- 帮手方法
func buyProduct(product: SKProduct) { println("Sending the Payment Request to Apple"); var payment = SKPayment(product: product) SKPaymentQueue.defaultQueue().addPayment(payment); }
- 为IAP委派方法
func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { var count : Int = response.products.count if (count>0) { var validProducts = response.products var validProduct: SKProduct = response.products[0] as SKProduct if (validProduct.productIdentifier == self.product_id) { print(validProduct.localizedTitle) print(validProduct.localizedDescription) print(validProduct.price) buyProduct(validProduct); } else { print(validProduct.productIdentifier) } } else { print("nothing") } } func request(request: SKRequest!, didFailWithError error: NSError!) { print("Error Fetching product information"); } func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) { print("Received Payment Transaction Response from Apple"); for transaction:AnyObject in transactions { if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{ switch trans.transactionState { case .Purchased: print("Product Purchased"); SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction) defaults.setBool(true , forKey: "purchased") overlayView.hidden = true break; case .Failed: print("Purchased Failed"); SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction) break; case .Restored: print("Already Purchased"); SKPaymentQueue.defaultQueue().restoreCompletedTransactions() default: break; } } } }
Swift> 3.0
import StoreKit class YOURVIEWController:UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver { let product_id: NSString = "com.some.inappid" // <!-- Change it to your inapp id
在你的viewDidLoad
添加
override func viewDidLoad() { super.viewDidLoad() SKPaymentQueue.default().add(self)
在你的购买button行动
@IBAction func buyNowAction(_ sender: UIButton) { if (SKPaymentQueue.canMakePayments()) { let productID:NSSet = NSSet(array: [self.product_id as NSString]); let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>); productsRequest.delegate = self; productsRequest.start(); print("Fetching Products"); } else { print("can't make purchases"); } }
在您的恢复button操作
// MARK: - Restore In App Purchase @IBAction func restoreAction(_ sender: UIButton) { if (SKPaymentQueue.canMakePayments()) { SKPaymentQueue.default().add(self) SKPaymentQueue.default().restoreCompletedTransactions() } else { // show error } }
添加代表:
// SKProductRequest Delegate func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { print(response.products) let count : Int = response.products.count if (count>0) { let validProduct: SKProduct = response.products[0] as SKProduct if (validProduct.productIdentifier == self.product_id as String) { print(validProduct.localizedTitle) print(validProduct.localizedDescription) print(validProduct.price) self.buyProduct(product: validProduct) } else { print(validProduct.productIdentifier) } } else { print("nothing") } } func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction:AnyObject in transactions { if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{ self.dismissPurchaseBtn.isEnabled = true self.restorePurchaseBtn.isEnabled = true self.buyNowBtn.isEnabled = true switch trans.transactionState { case .purchased: print("Product Purchased") //Do unlocking etc stuff here in case of new purchase SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) break; case .failed: print("Purchased Failed"); SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) break; case .restored: print("Already Purchased") //Do unlocking etc stuff here in case of restor SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) default: break; } } } } //If an error occurs, the code will go to this function func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { // Show some alert }
在应用程序采购委托方法:
func buyInApp() { if (SKPaymentQueue.canMakePayments()) { let productID:NSSet = NSSet(object: "com.valueedge.plane_post"); let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>); productsRequest.delegate = self; productsRequest.start(); } else { MBProgressHUD.hideHUDForView(self.view, animated: true) } } func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { let count : Int = response.products.count if (count>0) { let validProduct: SKProduct = response.products[0] as SKProduct if (validProduct.productIdentifier == "com.valueedge.plane_post") { buyProduct(validProduct); } else { MBProgressHUD.hideHUDForView(self.view, animated: true) } } else { MBProgressHUD.hideHUDForView(self.view, animated: true) } } func buyProduct(product: SKProduct) { let payment = SKPayment(product: product) SKPaymentQueue.defaultQueue().addPayment(payment) SKPaymentQueue.defaultQueue().addTransactionObserver(self) } func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction:AnyObject in transactions { if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction { switch trans.transactionState { case .Purchased: self.PaymentSuccess("Apple", details: "Apple(In-App)") print("In App Payment Success") SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) MBProgressHUD.hideHUDForView(self.view, animated: true) break case .Failed: MBProgressHUD.hideHUDForView(self.view, animated: true) SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) let alert = UIAlertController(title: "Planes Only", message: "Payment failed", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {(action:UIAlertAction!) in })) self.presentViewController(alert, animated: true, completion: nil) break case .Restored : SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) MBProgressHUD.hideHUDForView(self.view, animated: true) break default: MBProgressHUD.hideHUDForView(self.view, animated: true) break } } } } func restore() { SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().restoreCompletedTransactions() MBProgressHUD.showHUDAddedTo(self.view, animated: true) } func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { for transact:SKPaymentTransaction in queue.transactions { if transact.transactionState == SKPaymentTransactionState.Restored { //let t: SKPaymentTransaction = transact as SKPaymentTransaction //let prodID = t.payment.productIdentifier as String //restore prodID SKPaymentQueue .defaultQueue().finishTransaction(transact) MBProgressHUD.hideHUDForView(self.view, animated: true) } } } func paymentQueue(queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: NSError) { for transaction:SKPaymentTransaction in queue.transactions { if transaction.transactionState == SKPaymentTransactionState.Restored { SKPaymentQueue.defaultQueue().finishTransaction(transaction) MBProgressHUD.hideHUDForView(self.view, animated: true) break } } MBProgressHUD.hideHUDForView(self.view, animated: true) } func request(request: SKRequest, didFailWithError error: NSError) { MBProgressHUD.hideHUDForView(self.view, animated: true) }
在应用程序button点击事件:
@IBAction func In_App_Payment_Clicked(sender: AnyObject) { MBProgressHUD.showHUDAddedTo(self.view, animated: true) self.buyInApp() }