I’m trying to add more data to my users collection in Firebase Firestore but for whatever reason the payment method I have setup with passkit throws an exception when ran in the simulator.
Can anyone help with my issue?
Cart Manager:
import Foundation
import PassKit
class CartManager: ObservableObject {
@Published private(set) var products: [Products] = []
@Published private(set) var total: Int = 0
let paymentHandler = PaymentHandler()
@Published var paymentSuccess = false
func addToCart(product: Products) {
products.append(product)
total += product.price
}
func removeFromCart(product: Products) {
products = products.filter {$0.id != product.id}
total -= product.price
}
func pay() {
paymentHandler.startPayment(products: products, total: total) { success in
self.paymentSuccess = success
self.products = []
self.total = 0
}
}
}
Payment Handler
import Foundation
import PassKit
import Firebase
typealias PaymentCompletionHandler = (Bool) -> Void
class PaymentHandler: NSObject {
var paymentController: PKPaymentAuthorizationController?
var paymentSummaryItems = [PKPaymentSummaryItem]()
var paymentStatus = PKPaymentAuthorizationStatus.failure
var completionHandler: PaymentCompletionHandler?
@Published public var orderNumber = UUID()
static let supportedNetworks: [PKPaymentNetwork] = [.visa, .masterCard]
func startPayment(products: [Products], total: Int, completion: @escaping PaymentCompletionHandler) {
completionHandler = completion
paymentSummaryItems = []
products.forEach {
product in
let item = PKPaymentSummaryItem(label: product.name, amount: NSDecimalNumber(string: "(product.price).00"), type: .final)
paymentSummaryItems.append(item)
}
let total = PKPaymentSummaryItem(label: "Total", amount: NSDecimalNumber(string: "(total).00"), type: .final)
paymentSummaryItems.append(total)
let paymentRequest = PKPaymentRequest()
paymentRequest.paymentSummaryItems = paymentSummaryItems
paymentRequest.merchantIdentifier = "merchant.mikey.newbold.ToftwoodSocialClubApp"
paymentRequest.merchantCapabilities = .threeDSecure
paymentRequest.countryCode = "GB"
paymentRequest.currencyCode = "GBP"
paymentRequest.supportedNetworks = PaymentHandler.supportedNetworks
paymentRequest.requiredShippingContactFields = [.name]
paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
paymentController?.delegate = self
paymentController?.present(completion: { (presented: Bool) in
if presented {
debugPrint("Presented payment controller")
} else {
debugPrint("Failed to present controller")
}
})
}
}
extension PaymentHandler: PKPaymentAuthorizationControllerDelegate {
func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
let errors = [Error]()
let status = PKPaymentAuthorizationStatus.success
self.paymentStatus = status
completion(PKPaymentAuthorizationResult(status: status, errors: errors))
}
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
controller.dismiss {
DispatchQueue.main.async {
if self.paymentStatus == .success {
if let completionHandler = self.completionHandler{
completionHandler(true)
}
}
else {
if let completionHandler = self.completionHandler {
completionHandler(false)
}
}
}
}
}
}
I’ve attempted to print out a uuid which works fine but when I come to actually bind a piece of data to firebase, it won’t allow it
Recognized by Google Cloud Collective
2