BS
BleepingSwift
Published on
6 min read
Intermediate

> Creating a Poster Generic Pass for Apple Wallet in iOS 27

Share:

Poster event tickets have been the nicest-looking passes in Wallet for a while now, with full-bleed artwork, big type, and a clean barcode. With iOS 27 and watchOS 27 out today, the same treatment is available for everything else. The new poster generic style covers membership cards, loyalty programs, gift cards, coupons, and any other pass that doesn't fit a more specific category.

The good news is that you don't need new tools or a new signing flow. It's another style dictionary in pass.json, and you can ship it alongside your current style so older devices keep working. Apple's guide is Creating a Poster Generic Pass. Here's what you need to adopt it.

How the Poster Layout Differs

The classic generic pass puts a single primary field at the top, leaves room for a thumbnail, and lines up secondary and auxiliary fields beneath it. The poster version is built around a large background image instead. On the front it shows one header field, up to four primary fields, and two footer fields, along with a square QR code. Back fields and additional info fields work the way they always have.

Wallet also fills in some content for you. When a pass uses the poster generic style, Wallet automatically shows details like business information, the barcode, terms and conditions, and store locations, so the front of the pass stays focused on what matters.

Adding the posterGeneric Style

The pass style is a top-level key in pass.json, and for this layout the key is posterGeneric. Its value holds the same kind of field arrays you already use. Here's a membership card for a climbing gym:

JSON
{
  "formatVersion": 1,
  "passTypeIdentifier": "pass.com.example.boulderhall.membership",
  "serialNumber": "BH-2026-004817",
  "teamIdentifier": "A1B2C3D4E5",
  "organizationName": "Boulder Hall",
  "description": "Boulder Hall climbing membership",
  "foregroundColor": "rgb(255, 255, 255)",
  "backgroundColor": "rgb(28, 38, 52)",
  "expirationDate": "2027-09-30T23:59-07:00",
  "barcodes": [
    {
      "format": "PKBarcodeFormatQR",
      "message": "BH-2026-004817",
      "messageEncoding": "iso-8859-1",
      "altText": "Member 004817"
    }
  ],
  "posterGeneric": {
    "headerFields": [{ "key": "tier", "label": "Tier", "value": "Unlimited" }],
    "primaryFields": [
      { "key": "member", "label": "Member", "value": "Jordan Alvarez" },
      { "key": "homeGym", "label": "Home Gym", "value": "Eastside" }
    ],
    "additionalInfoFields": [{ "key": "guestPasses", "label": "Guest Passes Left", "value": 3 }],
    "backFields": [
      { "key": "support", "label": "Member Services", "value": "(555) 010-2233" },
      {
        "key": "terms",
        "label": "Terms",
        "value": "Memberships renew monthly and can be paused at the front desk."
      }
    ]
  }
}

A few details in there are easy to miss. barcodes is an array, and Wallet uses the first entry it can display. The poster layout shows a square code, so QR is the natural choice. Apple's guide also points out that generic passes don't expire on their own based on when you signed them, so set expirationDate if the membership has an end date. The same guide asks you to include contact details for the organization that signed the pass on the back.

Keeping Older Devices Working

A device running iOS 26 or earlier has never heard of posterGeneric. The fix is to include a second style dictionary on the same pass. Wallet prefers posterGeneric when it understands it, and older systems fall back to the style they recognize, such as generic or storeCard.

Since the classic generic layout has different slots, map your fields to it instead of copying them over. Alongside posterGeneric, the membership pass above would also carry something like this:

JSON
{
  "generic": {
    "primaryFields": [{ "key": "member", "label": "Member", "value": "Jordan Alvarez" }],
    "secondaryFields": [
      { "key": "tier", "label": "Tier", "value": "Unlimited" },
      { "key": "homeGym", "label": "Home Gym", "value": "Eastside" }
    ],
    "auxiliaryFields": [{ "key": "guestPasses", "label": "Guest Passes Left", "value": 3 }],
    "backFields": [{ "key": "support", "label": "Member Services", "value": "(555) 010-2233" }]
  }
}

Reusing the same key values in both dictionaries makes the two layouts easier to keep in sync on your server.

Artwork and Logos

The background artwork is what makes the style work, so plan it first. According to the Wallet section of the Human Interface Guidelines, poster generic passes and poster event tickets share an artwork.png image at 358 by 448 points. A material strip covers the bottom edge of that image, and the barcode needs room too, so keep anything important inside the safe area.

The top-leading logo for poster passes is primaryLogo.png, 30 points tall and between 30 and 126 points wide. As with every pass image, include 2x and 3x versions. Remember that an Apple Watch doesn't show strip images, thumbnails, or the back of the pass, so the front needs to make sense on its own.

Poster generic passes can carry up to two Featured Actions. They show up as cards when someone views the pass in Wallet and link to things like directions, your store, or a booking page. Each one pairs an SF Symbol with a short call to action. Apple recommends circular, filled symbols that make the action obvious at a glance.

The actions come from a predefined list. Apple's guide to defining pass metadata lists them along with an identifier for each, and several fit membership passes well: membershipBenefits, viewOffersRewards, bookAppointment, shop, and place for directions. The Pass reference doesn't show where those identifiers go in pass.json yet, so check it again before you wire them up.

For notifications, use the relevance keys you may already know. relevantDates and locations tell Wallet when and where your pass matters, so it can surface the pass at the right time. The Showing a Pass on the Lock Screen guide covers both.

Designing and Debugging

If you'd rather not hand-tune JSON, Apple's Pass Designer app for the Mac includes a poster generic template. You can lay out fields and images with a live preview, then save a .pkpasstemplate bundle. From there, Apple's Pass Builder package can build and sign it on your server, or you can unpack the template and sign it yourself. Creating a pass with Pass Designer walks through the whole workflow.

When a pass refuses to open, the cause is almost always a malformed pass.json, a misspelled key, a pass type identifier that doesn't match your certificate, or a signature missing Apple's WWDR intermediate certificate. You can drag a .pkpass file onto Simulator to test it, then read the logs in the Console app on your Mac.

Wrapping Up

For most issuers, adopting the poster style means adding one dictionary, producing one new piece of artwork, and moving a few fields around. Keep your existing style as the fallback, validate the JSON before you sign, and your members on iOS 27 get the new design without anyone else losing their pass.

subscribe.sh

// Stay Updated

Get notified when I publish new tutorials on Swift, SwiftUI, and iOS development. No spam, unsubscribe anytime.

>

By subscribing, you agree to our Privacy Policy.