I am looking for advice for debugging a wallet pass not updating for some customers after successfully posting an APNS notification (pass identifier as topic, no expiration, priority 10).
Is there an exhaustive list of reasons for a wallet pass not updating or a guide for making sure updates happen reliably? Are there are any guarantees made as to when the pass is updated? We noticed it is either never updating or the update happens much later for some customers. Usually toggling "Automatic Updates" in Pass Details updates the pass immediately for affected customers.
Can it be caused by an error in the implementation of the Wallet Passes Web Service? We generate passes on the fly as a response to /v1/passes/{passTypeIdentifier}/{serialNumber}. I noticed that we also sometimes receive HEAD requests to this endpoint despite the documentation only mentioning the GET method. I was previously returning a HTTP status code 405 (Method Not Allowed). I have now updated it to also respond with headers (Content-Type, Content-Disposition and Last-Modified) for the pass for HEAD requests, but I don't know if it makes a difference.
Here is a list of issues on the customer side I was thinking of:
No connection to the internet
Low power mode (does it prevent or throttle updates?)
What happens if there is an error? Does it keep trying or does it just fail silently? In the latter case it might make sense to keep sending APNS notifications until the pass is requested successfully.
I know that you can use the PassKit framework in iOS apps to update (replace) passes. Would this be more reliable than a stand-alone Wallet pass?
Wallet
RSS for tagOffer rewards cards boarding passes tickets gift cards and more using Wallet.
Posts under Wallet tag
128 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Hello All,
My team and I are developing a mobile application (offgrid) to help combat screen addiction. Our application will allow users through gamification, to challenge each other to stay off certain predetermined apps on their phone for a set amount of time and risk their own money. The money will act as a reinforcement to stay focused and off the application. Example: Jon challenges Jen to stay off Instagram for 1 hour for $5. If Jen accepts the challenge, she and Jon cannot go on Instagram. If Jen or Jon decides to click the Instagram app within the hour, the $5 automatically goes to the winner via Apple Pay or another service. If they complete the challenge and stay off Instagram then there is no exchange of money. I will also give the option for users to challenge each other and risk their money for a charity cause if someone loses.
My question is, will the exchange of money count as an in-app purchase, or will the winner receive the full amount? Also, if the money goes to charity, will that count as an in-app purchase?
Thanks!
Hi everyone,
I’m encountering a challenge while working with Apple's PKPass for boarding passes and would appreciate any guidance.
We are generating boarding passes for users and want them to automatically display on the lock screen as the boarding time approaches. To do this, we are utilizing the relevantDate property.
The issue arises because, when setting the relevantDate, the date and time are specified in Zulu time (UTC). However, iOS converts this to the device's local time zone (BST in my case), resulting in a one-hour shift.
For instance, in pass.json, I set "relevantDate": "2024-10-03T14:35:00+00:00" (or "relevantDate": "2024-10-03T14:35Z"). While iOS does display the pass on the lock screen as expected, the notification shows the time as "Today at 15:25" instead of the correct "14:25."
Expected behaviour: the notication text should display the exact time set in the relevantDate( i.e. Today at 14:25).
Any insights on how to resolve this would be greatly appreciated!
Thank you!
I have an Apple wallet and iPhone 16 pro max. Every time I restart the phone, which I need to do at least once every day to fix bugs, my wallet is not recognized
In the case of YellowFlow with In-App verification, I understand we have to configure the Launch URL (deep linking) in the PNO portal to open the app from Wallet and proceed with In-App Verification. How do we identify or retrieve information about the card the user tries to verify from the wallet when the app is opened through deep linking?
I understand we can query for all secure passes and get the pass activation state to see if any of the passes require activation,
How can I verify this is the card the user is trying to activate from the wallet app?
What information can I receive from the PassKit SDK that I can send to the backend to identify, resolve, and activate the card?
Hello,
I have existing application that was created 2 years ago and we wanted to start developing wallet, but in order to do that I need to create new Identifiers with In-App Provisioning but unfortunately it is missing. Any idea on how to solve that?
Hi there, I'm using a PHP library to generate a apple wallet card. In the end my code generates a .pkpass file, but for some reason iOS does not recognize it as a wallet object, instead just as a .pkpass file which in can save in my downloads/documents. Any idea?
Hi,
We have a bank app which can activate tokenized payment cards (in Requires Activation status) on Apple devices.
In my case some customers tried to activate their card token on their Apple Watch. Our card system gathered all the required card data with the PNO and sent them to our app. Our app called the PKPassLibrary.activate() method, but got back the Swedish localizedDescription "Oväntat fel" which means "Unexpected error" in English. We checked our card system logs and contacted our PNO, both found no issue and no explanation to the unexpected error. How can we identify the issue here? Can we somehow find a more detailed error log from Apple Server?
Best regards,
Adrian Lui
Hi there, I'm using php to create a qr code card for your apple wallet. Hereby I'm using this package: https://github.com/chiiya/laravel-passes Currently I got this far, that it creates a temporary directory filled with the needed files, including: icon.png, logo.png, manifest.json, pass.json and a signature file. After that temp directory gets created it creates a .pkpass file. Which will be downloaded to your system using an anchor tag button with controller method behind. For some reason on my iPhone I can only download it as file (the .pkpass file) and not as an actual wallet card. Any idea what is going wrong?
Error in iOS Wallet Order When Removing Deprecated status Property from Payment Object in order.json
I am encountering an issue related to the status property within the payment object of the order.json file when opening an order in the iOS Wallet.
According to the official documentation, the status property in the payment object is marked as deprecated. Based on this information, I removed the status property from the order.json. However, when I attempt to open the order in the iOS Wallet app, an error occurs, preventing the order from being opened.
This creates confusion, as the documentation implies that the status property in the payment object is no longer required. However, the iOS Wallet app seems to still rely on the presence of this property or encounters an error when it’s missing.
Tested on IOS 17.6.1 & IOS 18
I've implemented Push Provisioning, but am having trouble testing it.
When I try to add a payment pass with my activationData, encryptedPassData, and ephemeralPublicKey, I see the "Add Card to Apple Pay" screen, but then when I click "Add Card", I get a "Could Not Add Card" message.
When I inspect the error from didFinishAddingPaymentPass, it reads "The operation couldn’t be completed. (PKPassKitErrorDomain error 2.)".
Is this error PKPassKitError.Code.unsupportedVersionError? What does this error means?
Additional context:
We use cordova-apple-wallet to generate certificates and add payment pass.
I am developing In-App Provisioning functionality within an iOS application. When I try to perform the process, the process fails and the following is displayed on the screen: "Your issuer does not yet offer support for this card".
The PassbookUIService logs show:
https://nc-pod8-smp device.apple.com:443/broker/v4/devices/xxxxxxxxxxxxxx/cards 200 Time profile: 0.25497 seconds
{
auxiliaryCapabilities = {
};
eligibilityStatus = 0;
sanitizedPrimaryAccountPrefix = "";
}
ProvisioningStepEligibility: received eligibility status: 0
Showing eligibility issue with reason: 2
ProvisioningOperationComposer: Step 'eligibility' failed with error (null)
Would like to seek your help to investigate the problem. Thanks
Hello,
I’m encountering an issue with Apple Wallet orders. Every time I send an order file to my iPhone, I get the error message: “Error reading order file.”
Steps Taken:
1. Order File Structure:
• I created an order.json file with the minimal required fields, including:
• Order Type Identifier (created on the Apple Developer portal)
• Merchant Identifier: (created on the Apple Developer portal)
• Status: open
• Other necessary fields, such as authenticationToken, createdAt, updatedAt, and payment.
2. Manifest and Signature:
• A manifest.json file was generated with the SHA-256 hash for each file (e.g., order.json, images).
• The manifest was signed using my Apple developer certificates:
• Signer Certificate: signerCert.pem
• Signer Key: signerKey.pem
• WWDR Certificate: wwdr.pem
• Verification of the manifest and signature was done using OpenSSL:
• Command used: openssl smime -verify -in signature -inform DER -content manifest.json -noverify
• The verification was successful, but the iPhone still returns the error.
3. File Packaging:
• The final package includes the following files:
• order.json
• Images (e.g., gardenya_logo.png)
• manifest.json
• signature
• The files were packaged into a .order file (renamed from .zip).
4. Apple WWDR Certificate:
• I used Apple WWDR MP CA 1 - G1 for signing the package.
Issue:
Despite following all steps in the Apple documentation, the order file cannot be read by the iPhone, and the error message displayed is “Error reading order file.”
Additional Information:
• Manifest and Signature: Both files have been validated and match the package contents.
• Apple Developer Certificates: Used valid Apple Developer certificates.
• Order Schema: The order.json file follows Apple’s schema for orders.
Could you please provide guidance on resolving this issue? Any suggestions on what could be causing the error, or additional steps to check, would be greatly appreciated.
Thank you for your support!
We have a requirement to include Apple Pay In-App Provisioning in our Mobile Application and we have an API from Backend to get the tokenReferenceID for a given Card. I want to query the passes from Apple Wallet to see if there are any matches to the given tokenReferenceID before I can decide whether to show the “Add to Apple Wallet” button or not.
I went through all PassKit APIs but couldn’t find a way to query for passes with tokenReferenceID. We have primaryAccountIdentifier, deviceAccountIdentifier but which one should be used to match with tokenReferenceID?
Can someone please help me how to query the Wallet passes with tokenReferenceID using PassKit?
I am working on a transit app that offers a digital ticketing product that is powered by a QR code being scanned. We have been successful in preventing the Apple Pay takeover experience from happening when a user tries to use this product next to the tap to pay terminals by making a call to PKPassLibrary.requestAutomaticPassPresentationSuppression(...) before the QR code is presented. However, our transit agency is piloting Express Transit on these turnstiles and we are noticing that this experience overrides the old NFC suppression. Is there a similar method available to us to suppress the express transit experience for users who are using these mobile ticketing products?
Hi,
I’m encountering an issue in my app’s Wallet Extension, specifically within the Non-UI Extension, where we are unable to retrieve payment passes bound to a user’s account. The same code that successfully retrieves these bound cards in the main app does not work when used in the Non-UI Extension.
Case-ID: 8932090
Steps to Reproduce:
Set up In-App Provisioning:
Ensure that the app has the necessary In-App Provisioning permissions. This functionality works correctly in the main app, confirming that the permissions are properly configured.
Configure Wallet Extensions:
Follow the Wallet Extensions documentation to configure the app, including all required settings for the Non-UI Extension.
Add Code to Retrieve Payment Passes:
In the main app’s LoginView, implement the following code in the handleLogin() method to retrieve payment passes:
// Get the identifiers of payment passes that already exist in Apple Pay.
paymentPassLibrary = self.passLibrary.passes(of: .secureElement)
for pass in paymentPassLibrary {
if let identifier = pass.secureElementPass?.primaryAccountIdentifier {
if pass.isRemotePass && pass.deviceName.localizedCaseInsensitiveContains("Apple Watch") {
remotePassIdentifiers.insert(identifier)
} else if !pass.isRemotePass {
passIdentifiers.insert(identifier)
}
}
}
Verify Functionality in Main App:
Run the app and verify that the code successfully retrieves the payment passes bound to the user’s account.
Implement Code in Non-UI Extension:
Add the same code to the Non-UI Extension, specifically in the WNonUIExtHandler class within the override func status(completion: @escaping (PKIssuerProvisioningExtensionStatus) -> Void) method.
Test in Wallet Extension:
Run the Wallet Extension and observe that the payment passes are not retrieved when the code is executed in the Non-UI Extension.
Has anyone encountered a similar issue or can provide insight into why the code might not work in the Non-UI Extension compared to the main app?
Support Information:
iOS Version: 17.5.1
Development environment: Xcode 15.4 (15F31d), macOS 14.3 (23D56)
Any help or suggestions would be greatly appreciated. Thank you!
I have created wallet non UI extension for adding card through wallet. It's working perfect when I open wallet from iPhone. But when I open wallet from Watch app (Watch bridge app on iPhone not on physical apple watch) then my extension (issuer app) is not showing there. Any idea if I need to setup or configure anything to access extension through watch bridge app wallet?
I'm trying to add a pass to Apple Wallet, but it isn't being detected when I attempt to add it. I've created the .pkpass file, and it contains the following files:
en.lproj/
icon.png
icon@2x .png
manifest.json
pass.json
signature
{
"formatVersion": 1,
"passTypeIdentifier": "pass.com.yourdomain.com",
"serialNumber": "123456",
"teamIdentifier": "5ZXXXXXX",
"description": "This is an Event Pass",
"eventTicket": {
"primaryFields": [
{
"key": "event",
"label": "EVENT",
"value": "Concert"
}
],
"secondaryFields": [
{
"key": "location",
"label": "LOCATION",
"value": "Example Venue"
},
{
"key": "date",
"label": "DATE",
"value": "2024-08-15"
}
],
"auxiliaryFields": [
{
"key": "time",
"label": "TIME",
"value": "7:00 PM"
}
],
"backFields": [
{
"key": "terms",
"label": "TERMS & CONDITIONS",
"value": "Non-refundable. Please arrive 30 minutes early."
}
],
"barcode": {
"message": "1234567890",
"format": "PKBarcodeFormatQR",
"messageEncoding": "iso-8859-1"
}
},
"organizationName": "ORGANIZATION NAME",
"logoText": "Concert 2024",
"foregroundColor": "rgb(255, 255, 255)",
"backgroundColor": "rgb(0, 0, 0)",
"eventTicketStrip": {
"primaryFields": [
{
"key": "event",
"label": "Event",
"value": "Concert"
}
]
},
"relevantDate": "2024-08-15T19:00:00Z"
}
What I've Done So Far:
Validated the Manifest: The SHA-1 hashes in the manifest.json match the actual files in the package.
Checked the pass.json: It seems to be correctly formatted, and all fields are populated.
Verified Pass Structure: The .pkpass file structure appears to be correct.
Validate with PKpass Validator: It's seems like all points are valid I put screenshot over here.
My Questions:
What could be preventing Apple Wallet from detecting this pass?
How can I verify if the signature is correctly applied?
Are there any recommended online tools or methods to debug this pass and identify what might be wrong?
I've tried using a few online validators, but the issue persists. Any guidance on how to resolve this would be greatly appreciated!
Hi,
You're here because you've had issues with your implementation of Wallet Extensions for Apple Pay In-App Provisioning or In-App Verification. To prevent sending sensitive credentials in plain text, create a new report in Feedback Assistant to share the details requested below with the appropriate log profiles installed.
Gathering Required Information for Troubleshooting Apple Pay In-App Provisioning or In-App Verification Issues
While troubleshooting Apple Pay In-App Provisioning or In-App Verification, it is essential that the issuer is able to collect logs on their device and check those logs for error message. This is also essential when reporting issues to Apple. To gather the required data for your own debugging as well as reporting issues, please perform the following steps on the test device:
Install the Apple Pay and Wallet profiles on your iOS or watchOS device. If the issue occurs on Mac, continue to Step 2.
Reproduce the issue and make a note of the timestamp when the issue occurred, while optionally capturing screenshots or video.
Gather a sysdiagnose on the same iOS or watchOS device, or on macOS.
Create a Feedback Assistant report with the following information:
The bundle IDs
App bundle ID
Non-UI app extension bundle ID (if applicable)
UI app extension bundle ID (if applicable)
The serial number of the device.
For iOS and watchOS: Open Settings > General > About > Serial Number (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > Serial Number.
The SEID (Secure Element Identifier) of the device, represented as a HEX encoded string.
For iOS and watchOS: Open Settings > General > About > SEID (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > System Report > NVMExpress > Serial Number.
The sysdiagnose gathered after reproducing the issue.
The timestamp (including timezone) of when the issue was reproduced.
The type of provisioning failure (e.g., error at Terms & Conditions, error when adding a card, etc.)
The issuer/network/country of the provisioned card (e.g., Mastercard – US)
Last 4 digits of the FPAN
Last 4 digits of the DPAN (if available)
Was this test initiated from the Issuer App? (e.g., yes or no)
The type of environment (e.g., sandbox or production)
Screenshots or videos of errors and unexpected behaviors (optional).
Important: From the logs gathered above, you should be able to determine the cause of the failure from PassbookUIService, PassKit or PassKitCore, and by filtering for your SEID or bundle ID of your app or app extensions in the Console app.
Submitting your feedback
Before you submit to Feedback Assistant, please confirm the requested information above is included in your feedback. Failure to provide the requested information will only delay my investigation into the reported issue within your Apple Pay client.
After your submission to Feedback Assistant is complete, please respond in your existing Developer Forums post with the Feedback ID. Once received, I can begin my investigation and determine if this issue is caused by an error within your client, a configuration issue within your developer account, or an underlying system bug.
Cheers,
Paris X Pinkney | WWDR | DTS Engineer
I am implementing apple wallet extension. As part of it I have developed UI and Non-UI extension. I have implemented status , pass entries and remote pass entries method to return as per apple standard. My problem is pass entries is showing correct list of cards/passes as it is able to match against phone wallet. But remote pass entries method is not able to access watch app/watch wallet to match the existing passes. Any help is appreciated. When we print passlibrary count it displays the count matching phone wallet. But it ignores watch wallet passes which belongs to our app.