Issue with Wallet Popup Despite Pass Presentation Suppression

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?

Answered by DTS Engineer in 893461022

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

We are also facing similar issue randomly on our app with required pass suppression entitlement in place, particularly after installing an app update - the Wallet popup unexpectedly appears on tapping NFC reader even when the app is in the foreground. After some time, it starts working correctly again (i.e., the Wallet no longer appears)

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

Issue with Wallet Popup Despite Pass Presentation Suppression
 
 
Q