Adding In-App Purchases To Your Project

This guide will demonstrate how to add in-app purchases to your exported hyperPad project. Please check all the requirements below before proceeding.

 

Requirements

  • You need to have a Mac computer to export your project and add in-app purchases to your exported project.
  • You need to have cocoapods installed on the mac. If you don't have cocoapods installed on your Mac, follow the instructions here.
  • You need to have the Terminal app installed on your Mac.
  • You need a text editor app installed on your Mac.

Procedure

  1. Add pod 'SwiftyStoreKit' to the list of pods in the Podfile file of your exported project using a text editor.
  2. In the terminal, run pod install. This might take a while, so hang on!
  3. Replace the contents of HPSwift.swift with the following file
//
//  HPSwift.swift
//  hyperPad-Project
//
//  Created by Hamed Saadat on 2019-08-07.
//

import Foundation
import SwiftyStoreKit

@objc class HPSwift: NSObject {
    fileprivate var _behaviours: HPBehaviours? = nil
    @objc var behaviours: HPBehaviours? {
        get {
            return _behaviours
        }
        
        set(behaviours) {
            _behaviours = behaviours
            
            SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
                for purchase in purchases {
                    switch purchase.transaction.transactionState {
                    case .purchased, .restored:
                        if purchase.needsFinishTransaction {
                            // Deliver content from server, then:
                            SwiftyStoreKit.finishTransaction(purchase.transaction)
                        }
                        // Unlock content
                        behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseComplete")
                        
                    case .failed, .purchasing, .deferred:
                        behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseError")
                        break // do nothing
                    @unknown default:
                        break
                    }
                }
            }
            
            behaviours?.addReceiveKey("restorePurchases", onReceive: { (receiveValue) in
                SwiftyStoreKit.restorePurchases(atomically: true) { results in
                    if results.restoreFailedPurchases.count > 0 {
                        behaviours?.broadcastValue("Restore Failed: \(results.restoreFailedPurchases)" as NSString, withKey: "purchaseError")
                    }
                    else if results.restoredPurchases.count > 0 {
                        results.restoredPurchases.forEach { (purchase) in
                            behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseComplete")
                        }
                    }
                    else {
                        print("Nothing to Restore")
                    }
                }
            })
            
            /*
             Add Behaviour functionality here
            */
            
            behaviours?.addReceiveKey("purchase", onReceive: { (recieveValue) in
                 // handle in app purchase logic! //
                    SwiftyStoreKit.purchaseProduct("INSERT_PURCHASE_IDENTIFIER_HERE_OR_USE_recieveValue", quantity: 1, atomically: true) { result in
                        switch result {
                        case .success(let purchase):
                            behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseComplete")
                        case .error(let error):
                            var message = ""
                            switch error.code {
                            case .unknown: message = "Unknown error. Please contact support"
                            case .clientInvalid: message = "Not allowed to make the payment"
                            case .paymentCancelled: break
                            case .paymentInvalid: message = "The purchase identifier was invalid"
                            case .paymentNotAllowed: message = "The device is not allowed to make the payment"
                            case .storeProductNotAvailable: message = "The product is not available in the current storefront"
                            case .cloudServicePermissionDenied: message = "Access to cloud service information is not allowed"
                            case .cloudServiceNetworkConnectionFailed: message = "Could not connect to the network"
                            case .cloudServiceRevoked: message = "User has revoked permission to use this cloud service"
                            default: message = ((error as NSError).localizedDescription)
                            }
                            behaviours?.broadcastValue(message as NSString, withKey: "purchaseFailed")
                        }
                    }
            })
        }
    }
    
}

 

Things to Note

behaviours?.addReceiveKey("restorePurchases", onReceive: { (receiveValue) in
                // add your code here
            })

This will get triggered when you trigger a broadcast behavior with the restorePurchases key.

behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseComplete")

 

Once the purchase is complete, it will trigger receive message behaviors with the purchaseComplete key. INSERT_PURCHASE_IDENTIFIER_HERE_OR_USE_recieveValue can be replaced with either the identifier of your purchase from AppStoreConnect OR the receiveValue parameter. If you use receiveValue make sure in your broadcast behavior, you're sending the identifier from App Store Connect.

0 Comments

Article is closed for comments.