An Expo native module for iOS that wraps PKPassLibrary.requestAutomaticPassPresentationSuppression to prevent Apple Wallet from appearing when near NFC readers.
npm install passkit-suppressionThen run:
npx expo prebuildThis module requires the com.apple.developer.passkit.pass-presentation-suppression entitlement from Apple. Without it, requests will return "denied".
Note: Returns "notSupported" on simulator - requires a physical iOS device for testing.
The pass presentation suppression entitlement is restricted and must be requested from Apple. Submit a request at:
https://developer.apple.com/contact/request/pass-presentation-suppression
Apple will review your use case and, if approved, enable the entitlement for your App ID in the Apple Developer Portal.
Add the entitlement to your app.json or app.config.js:
{
"expo": {
"ios": {
"entitlements": {
"com.apple.developer.passkit.pass-presentation-suppression": true
}
}
}
}Then regenerate your native project:
npx expo prebuild --cleanAfter running prebuild, you can verify the entitlement is set by opening the Xcode project and checking the .entitlements file in your app target. It should contain:
<key>com.apple.developer.passkit.pass-presentation-suppression</key>
<true/>If requestSuppression() returns "denied":
- Verify the entitlement has been approved by Apple for your App ID
- Ensure your provisioning profile includes the entitlement (regenerate it in the Apple Developer Portal if needed)
- Check that the entitlement is correctly set in
app.json - Run
npx expo prebuild --cleanto regenerate native files
import { useCallback } from "react";
import { useFocusEffect } from "@react-navigation/native";
import { requestSuppression, endSuppression } from "passkit-suppression";
function MyScreen() {
useFocusEffect(
useCallback(() => {
requestSuppression();
return () => {
endSuppression();
};
}, [])
);
return <View>{/* ... */}</View>;
}import {
requestSuppression,
endSuppression,
isSuppressing,
} from "passkit-suppression";
// Request suppression
const result = await requestSuppression();
if (result === "success") {
console.log("Is suppressing:", isSuppressing());
}
// End suppression when done
endSuppression();The result field is one of:
"success"- Suppression is active"notSupported"- Device/simulator doesn't support suppression"alreadyPresenting"- A pass is already being presented"denied"- Missing required entitlement"cancelled"- Request was cancelled
This module is iOS-only. The underlying PKPassLibrary API is not available on Android or web.
MIT