logo hyperPad Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Login

    In App Purchase Tutorial on Exported Projects

    Scheduled Pinned Locked Moved
    Help and Support
    1
    1
    118
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • HamedH
      Hamed Admin
      last edited by Hamed

      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 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 behaviour, you're sending the identifier from App Store Connect.

      1 Reply Last reply Reply Quote 1
      • First post
        Last post