You might want to check if your cards are actually usable too. I encountered this issue when having three cards in my Wallet. Two debits (Interac-For Canada) and one Visa. I'd forgotten that the Visa in the wallet was expired, and that Interac is not yet supported for in-App Apple Pay, which forced Passkit to return a Nil PKPaymentAuthorizationControllerInstance. To solve this, i ran a check on the supported Payment Types within the iPhone's Wallet app like so:
func checkApplePayCapabilities() -> Dictionary<String, Any>? {
var mar = Array<String>()
var methods : Dictionary<String, String> = ["visa":"no","mastercard":"no","amex":"no","interac":"no","debit":"no"]
let payload = Dictionary<String, Any>()
guard PKPaymentAuthorizationViewController.canMakePayments() else {
return nil
}
guard #available(iOS 10, *) else {
return nil
}
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.amex]) {
print("can make amex")
methods["amex"] = "yes"
mar.insert("visa", at: mar.count)
}
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.visa]) {
print("can make visa")
methods["visa"] = "yes"
mar.insert("visa", at: mar.count)
}
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.masterCard]) {
print("can make mastercard")
methods["mastercard"] = "yes"
mar.insert("mastercard", at: mar.count)
}
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.interac]) {
print("can make interac")
methods["interac"] = "yes"
mar.insert("interac", at: mar.count)
}
guard mar.isEmpty else {
return payload
}
return nil
}
It should only return cards which are usable in-App. And of course you can add any other payment method, or make an array of the methods you want and run through it with a for loop too.