Skip to content

Expo/react-native module that suppresses Passkit/Apple wallet presentation when near a NFC device

License

Notifications You must be signed in to change notification settings

js/passkit-suppression

Repository files navigation

PassKit Suppression

An Expo native module for iOS that wraps PKPassLibrary.requestAutomaticPassPresentationSuppression to prevent Apple Wallet from appearing when near NFC readers.

Installation

npm install passkit-suppression

Then run:

npx expo prebuild

Requirements

This 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.

Entitlement Setup

1. Request the entitlement from Apple

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.

2. Configure in your Expo app

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 --clean

3. Verify in Xcode (optional)

After 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/>

Troubleshooting

If requestSuppression() returns "denied":

  1. Verify the entitlement has been approved by Apple for your App ID
  2. Ensure your provisioning profile includes the entitlement (regenerate it in the Apple Developer Portal if needed)
  3. Check that the entitlement is correctly set in app.json
  4. Run npx expo prebuild --clean to regenerate native files

Usage

With useFocusEffect

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>;
}

Basic Usage

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();

Result Values

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

Platform Support

This module is iOS-only. The underlying PKPassLibrary API is not available on Android or web.

License

MIT

About

Expo/react-native module that suppresses Passkit/Apple wallet presentation when near a NFC device

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published