In App Purchase Tutorial on Exported Projects
-
In App purchase swift code for exported projects:
first add pod 'SwiftyStoreKit' to the list of pods in Podfile in a text editor.
Then in terminal, run pod install. If you don't have cocoapods installed on your mac, follow the instructions here: https://guides.cocoapods.org/using/getting-started.html
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") } } }) } } }
Some key points:
behaviours?.addReceiveKey("restorePurchases", onReceive: { (receiveValue) in // add your code here })
Will get triggered when you trigger a broadcast behaviour with the restorePurchases key
behaviours?.broadcastValue(purchase.productId as NSString, withKey: "purchaseComplete")
Will trigger a receive message behaviour with the
purchaseComplete
keyINSERT_PURCHASE_IDENTIFIER_HERE_OR_USE_recieveValue
can be replaced with either the identifier of your purchase from AppStoreConnect. OR thereceiveValue
parameter. If you use receiveValue make sure in your broadcast behaviour, you're sending the identifier from App Store Connect.