2026 System ServicesApp Services
WWDC26 · 16 min · System Services / App Services
What’s new in Wallet
Explore the newest design updates and developer tools for Apple Wallet passes. Refresh your passes with beautiful new styles for rich, vibrant designs. Discover new barcode formats and a flexible pass actions API. Meet Pass Designer and Pass Builder, powerful tools that simplify designing, personalizing, and distributing your passes at scale.
Watch at developer.apple.com ↗Chapters
Code shown on screen · 8 snippets
Adopting Poster Generic
// Adopting Poster Generic
"posterGeneric": {
"headerFields": [
{
"key": "memberID",
"label": "Guest No.",
"value": "102035"
}
],
"footerFields": [
{
"key": "membershipType",
"value": "Family Pass"
}
]
} Adopting Poster Generic with Generic fallback
// Adopting Poster Generic and supporting Generic on iOS 26 and earlier
"posterGeneric": {
"headerFields": [
{
"key": "memberID",
"label": "Guest No.",
"value": "102035"
}
],
"footerFields": [
{
"key": "membershipType",
"value": "Family Pass"
}
]
},
"generic": {
"headerFields": [
{
"key": "memberID",
"label": "Guest No.",
"value": "102035"
}
],
"footerFields": [
{
"key": "membershipType",
"value": "Family Pass"
}
]
} Barcodes: Add new types for iOS 27
// Adopting new barcode types
"barcodes": [
{
"format": "PKBarcodeFormatCodabar"
"message": "…"
"messageEncoding": "…"
}
] Barcodes: Supporting iOS 26 and earlier
// Adopting new barcode types and supporting iOS 26 and earlier.
"barcodes": [
{
"format": "PKBarcodeFormatCodabar"
"message": "123456789"
"messageEncoding": "iso-8859-1"
},
{
"format": "PKBarcodeFormatQR"
"message": "123456789"
"messageEncoding": "iso-8859-1"
}
] Featured actions
// Featured actions
"featuredActions": [
{
"identifier": "my-offer-id",
"type": "membershipBenefits",
"url": "www.example.com/offers"
}
] Package.swift
// Package.swift
import PackageDescription
let package = Package(
name: "MyServer",
products: [
.library(
name: "MyServer",
targets: ["MyServer"]
),
],
dependencies: [
.package(path: "./path/to/PassBuilder")
],
targets: [
.target(
name: "MyServer",
dependencies: [
.product(name: "PassBuilder", package: "PassBuilder")
]
),
…
] CreatePass.swift
// CreatePass.swift
import PassBuilder
func createPass(for doggo: MemeberModel) async throws -> URL {
var package = PassPackage(url: "template.pkpasstemplate")
package.pass.fields.setValue(doggo.name, forKey: "DOG_NAME")
package.pass.fields.setValue(doggo.favoriteToy, forKey: "LOVES")
package.pass.fields.setValue(doggo.id, forKey: "MEMBER_ID")
package.background = PassImage(url: doggo.photoURL)
package.pass.barcodes = [
Pass.Barcode(message: doggo.id, format: .pdf417)
]
package.featuredActions = [
Pass.Action(id: "action-1", type: "viewMembership", url: doggo.membershipURL)
]
…
} CreatePass.swift
// CreatePass.swift
import PassBuilder
func createPass(for doggo: MemeberModel) async throws -> URL {
var package = PassPackage(url: "template.pkpasstemplate")
package.pass.fields.setValue(doggo.name, forKey: "DOG_NAME")
package.pass.fields.setValue(doggo.favoriteToy, forKey: "LOVES")
package.pass.fields.setValue(doggo.id, forKey: "MEMBER_ID")
package.background = PassImage(url: doggo.photoURL)
package.pass.barcodes = [
Pass.Barcode(message: doggo.id, format: .pdf417)
]
package.featuredActions = [
Pass.Action(id: "action-1", type: "viewMembership", url: doggo.membershipURL)
]
let passCertificate = try PassCertificate(url: "pass.p12", password: "s3cr3t")
let wwdrCertificate = try PassCertificate(url: "wwdr.cer")
let signer = PassSigner(
passCertificate: passCertificate,
wwdrCertifiate: wwdrCertificate
)
let destinationURL = URL(string: "/www/passes/" + doggo.id)
try signer.signPass(package, writingTo: destinationURL)
return destinationURL
} Resources
Related sessions
-
21 min -
21 min -
18 min