I would like to tell how to create a simple application with in-app-purchases using Swift.
First of all you need to create product IDs in iTunes Connect for your application.
Lets create a class InAppPurchase. Inherited from the following protocols:
class InAppPurchase : NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver
InAppPurchase class will be singleton, for easy management of purchases.
class var sharedInstance : InAppPurchase {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: InAppPurchase? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = InAppPurchase()
}
return Static.instance!
}
Add some constants for notifications:
let kInAppProductPurchasedNotification = "InAppProductPurchasedNotification" let kInAppPurchaseFailedNotification = "InAppPurchaseFailedNotification" let kInAppProductRestoredNotification = "InAppProductRestoredNotification" let kInAppPurchasingErrorNotification = "InAppPurchasingErrorNotification"
And for product IDs:
let unlockTestInAppPurchase1ProductId = "com.testing.iap1" let unlockTestInAppPurchase2ProductId = "com.testing.iap2"
In the initialization of class, we need to add a observer:
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
For starting of making purchase, we need to run a product request:
if SKPaymentQueue.canMakePayments() {
let productID: NSSet = NSSet(object: productIdentifier)
let productsRequest: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set)
productsRequest.delegate = self
productsRequest.start()
}
else {
print(“Сan’t make purchases”)
}
After that if is it a success, will be called:
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var count: Int = response.products.count
if count > 0 {
let validProduct: SKProduct = response.products[0] as! SKProduct
buyProduct(validProduct)
}
else {
print(“No products”)
}
}
If error:
func request(request: SKRequest!, didFailWithError error: NSError!) {
print("Error %@ \(error)")
}
In the buyProduct method we need to add a payment to payment queue:
let payment = SKPayment(product: product) SKPaymentQueue.defaultQueue().addPayment(payment)
And after that will be called paymentQueue callback:
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
for transaction: AnyObject in transactions {
if let trans: SKPaymentTransaction = transaction as? SKPaymentTransaction {
switch trans.transactionState {
case .Purchased:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
break
case .Failed:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
break
case .Restored:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
break
default:
break
}
}
}
If you did everything right, you should see the similar:
For testing the app, please use sandbox accounts, which you can create in iTunes Connect.
For updating UI in your application in the example I use notifications, and for checking if already unlocked purchases or not, I use NSUserDefaults.
Please see the full sample in this repository, feel free to use and don’t forget to like the repository :) Thanks for attention.




