◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 26 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 26 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/App Dev
◇ App Dev/2026-06-16Advanced

Adding an Apple Wallet Stamp Card to a Rork Max App — Signing and Updates

You want a shop stamp card in Apple Wallet. When you issue a PassKit pass from a Swift app generated by Rork Max, the hard parts are not design — they are signing and remote updates. Here are the implementation essentials.

Rork Max235PassKitApple WalletSwift48Loyalty

✦ Premium Article

A Stamp Card as an "Image" Is Useless

It began when someone asked me to replace a paper stamp card with one in Apple Wallet. Simply showing an image of the card face is easy. But that way, stamps added per visit are not reflected, and the user ends up opening the app to check anyway. The point of putting it in Wallet is that it appears on the lock screen and the balance or stamp count stays current automatically.

Issuing a PassKit pass from a native Swift app generated by Rork Max taught me that the hard parts are not design — they are "signing" and "remote updates." Clear those two, or a Wallet pass is no better than a still image. Even as an indie developer who has shipped plenty of apps, this was a fresh stumble for me. Here are the essentials I confirmed.

A pkpass Is a Signed ZIP

An Apple Wallet pass (.pkpass) is a ZIP archive of several files, signed together. Its contents fall into roughly three parts.

First is pass.json: the pass type (store card, coupon, boarding pass, etc.), the fields to display, colors, and the barcode. Second is the images (icon.png, logo.png, and so on). Third is manifest.json and signature — the heart of signing.

manifest.json is a list of SHA-1 hashes for each file. signature is a PKCS#7 binary signing that manifest with your Pass Type ID certificate. In other words, tamper with even one file and the hash no longer matches, so Wallet rejects the pass. That is why "just swap the image" does not work.

A minimal pass.json:

{
  "formatVersion": 1,
  "passTypeIdentifier": "pass.com.example.stamp",
  "serialNumber": "user-00123",
  "teamIdentifier": "YOUR_TEAM_ID",
  "organizationName": "Sample Coffee",
  "description": "Stamp Card",
  "storeCard": {
    "primaryFields": [
      { "key": "stamps", "label": "Stamps", "value": "3 / 10" }
    ]
  },
  "barcode": {
    "format": "PKBarcodeFormatQR",
    "message": "user-00123",
    "messageEncoding": "iso-8859-1"
  },
  "webServiceURL": "https://example.com/passes/",
  "authenticationToken": "REPLACE_WITH_PER_USER_TOKEN"
}

webServiceURL and authenticationToken are the entry point for the remote updates described below. The signing itself happens on the server (or at build time). You must not bundle the private key in the app, so generating and signing the pass should be the backend's responsibility.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦Understand the structure of a pkpass (pass.json, manifest, signature) and where signing actually matters
✦Learn the PKAddPassesViewController code to add a pass to Wallet from your app
✦Reproduce the push-update flow that bumps the stamp count on each visit, and the server-side web service requirements
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⬡ Dev Tools2026-04-05
Rork Max × WidgetKit & Live Activities in Practice — From Home Screen to Dynamic Island
A complete guide to implementing iOS Widgets, Lock Screen widgets, and Dynamic Island Live Activities with Rork Max. Covers WidgetKit fundamentals, Timeline update strategies, App Intents integration, and monetization.
◇ App Dev2026-10-31
When EAS Build Stops at "Project archive is too big", Count What Gets Uploaded, Largest First
EAS Build warns at 150 MiB and fails at 2 GiB. Here is how to list what will be uploaded before you send it, find the culprit, and decide what goes into .easignore.
◇ App Dev2026-10-29
An Image Requested Once Before Its Upload Stayed a 404 at the Edge. I Split the Retention Rules by Status Code and Made Upload and Purge a Single Step
A new wallpaper stayed missing in some regions because the CDN kept a 404, fetched once before the upload, as long as it kept the image itself. Per-status retention, a two-request diagnosis, and pairing upload with purge, tested in Node.