We have developed an app that communicates with an external reader using BLE, and the reader also supports NFC.
We are implementing a feature that uses PKPassLibrary.requestAutomaticPassPresentationSuppression to prevent the Wallet from appearing when unlocking a lock.
We have already completed the approval process for the entitlement required to enable Pass Presentation Suppression, referencing Apple’s documentation: https://developer.apple.com/documentation/passkit/pkpasslibrary/requestautomaticpasspresentationsuppression(responsehandler:)
In most cases, this works as expected and the Wallet popup does not appear. However, in some cases — particularly when the app is running in the foreground — the Wallet still appears for users.
We have verified that the app bundle includes the required entitlement, and the Info.plist correctly specifies the Pass Presentation Suppression key set to true.
Could you please help us understand under what conditions this behavior might still occur, or if any additional configuration is required?
Hi @Arasuvel, @Pannir_selvam38,
You wrote:
In most cases, this works as expected and the Wallet popup does not appear. However, in some cases — particularly when the app is running in the foreground — the Wallet still appears for users. [...] Could you please help us understand under what conditions this behavior might still occur, or if any additional configuration is required?
The most common reason for this reported behavior is the app process not retaining the memory of the PKSuppressionRequestToken returned by PKPassLibrary.requestAutomaticPassPresentationSuppression(responseHandler:)
For example:
// ❌ WRONG — token is released and deallocated when this function returns
func activate() {
PKPassLibrary.requestAutomaticPassPresentationSuppression { token, result in
// token is scoped to this closure and lost after
}
}
// ✅ CORRECT — token lives as long as the manager object
class MyNFCCoordinator {
private var suppressionToken: PKSuppressionRequestToken = 0
func activate() {
suppressionToken = PKPassLibrary.requestAutomaticPassPresentationSuppression { [weak self] result in
if result == .success {
// suppression is now active; token already stored
} else {
self?.suppressionToken = 0 // clear on failure
}
}
}
}
The second most common reason for this reported behavior is due to a subtle race condition in the async pass presentation suppression logic. For example, the method returns immediately with a token, but suppression isn't yet active until the .success callback is invoked. This timing gap is typically 50-300ms and is non-deterministic.
To mitigate this, invoke the suppression logic as early as possible in your session flow (e.g., at sceneDidBecomeActive or when the relevant screen appears), not reactively at the moment of expected NFC contact. You cannot eliminate this timing window entirely, but you can minimize it.
Lastly, it's good to know that the suppression behavior is foreground-only. The system revokes it automatically on app backgrounding, often before you can call endAutomaticPassPresentationSuppression(withRequestToken:).
If the above information does not resolve your issue, please submit a report via Feedback Assistant by following the steps in the post below:
Gathering Required Information for Troubleshooting Tap to Pay on iPhone
https://developer.apple.com/forums/thread/775784
Once submitted, reply here with the Feedback ID.
Cheers,
Paris X Pinkney | WWDR | DTS Engineer