How to Build Custom Apple Wallet Passes Without PassKit Certificates in iOS 27

How to Build Custom Apple Wallet Passes Without PassKit Certificates in iOS 27

For over a decade, creating Apple Wallet passes required developers to obtain PassKit certificates, manage complex cryptographic signing, and maintain WWDR certificates—a significant barrier for small teams and indie developers. iOS 27 changes this entirely with a new Create a Pass feature that eliminates these friction points.

If you've been hesitant to add Wallet support to your iOS app because of PassKit's complexity, iOS 27's native pass creation flow is a game-changer. This guide covers the practical shift from server-side pass generation to client-side Wallet integration.

The Problem with Traditional PassKit Implementation

Traditionally, adding Wallet support meant:

  1. Enrolling in the Apple Developer Program ($99/year minimum)
  2. Requesting PassKit certificate permissions from Apple
  3. Managing signing certificates and bundle identifiers
  4. Building server infrastructure to generate cryptographically signed .pkpass files
  5. Handling certificate rotation and renewal cycles

This created a high entry barrier for developers who wanted to offer basic pass functionality like gym memberships, event tickets, or loyalty cards.

What's New in iOS 27

Bloomberg's reporting confirms iOS 27 introduces a native Create a Pass button directly in the Wallet app. Here's what changes:

Native Pass Creation Without Developer Accounts

Users can now:

  • Tap the + button in Wallet (existing card/pass addition UI)
  • Scan a QR code from physical tickets or membership cards
  • Build passes from scratch using three built-in templates
  • Save custom passes without the app developer managing certificates

For developers, this means:

  • No PassKit WWDR certificates required
  • No .pkpass file signing needed
  • No backend infrastructure for cryptographic operations
  • Direct Wallet integration via simple QR codes or deep links

Implementation Strategy: QR Code vs. Deep Links

Approach 1: QR Code-Based Pass Generation

This is the simplest path for most applications:

import PassKit
import Vision

// Scan QR code and extract pass data
func handleQRCodeScan(from qrString: String) {
    // QR code contains minimal pass data:
    // - Pass type (event, membership, discount)
    // - Identifier
    // - Brief description
    
    let passData = ParsedQRData(
        type: "membership",
        identifier: "gym-123-john",
        name: "Gold Gym Membership",
        description: "Valid through Dec 2026"
    )
    
    // iOS 27 automatically handles pass creation
    // No signing or certificate management needed
    presentPassCreationUI(with: passData)
}

Approach 2: Direct Wallet Deep Link Integration

For more control, use deep links to Wallet:

// Generate wallet://create?type=event&id=ticket123&name=Concert
let walletDeepLink = URL(string: "wallet://create")
var components = URLComponents(url: walletDeepLink!, resolvingAgainstBaseURL: false)
components?.queryItems = [
    URLQueryItem(name: "type", value: "event"),
    URLQueryItem(name: "identifier", value: "concert-2026-001"),
    URLQueryItem(name: "name", value: "WWDC 2026 Session"),
    URLQueryItem(name: "issuer", value: "Apple Inc.")
]

UIApplication.shared.open(components!.url!)

Migration Path: From Traditional PassKit to iOS 27 Native

If your app already uses traditional PassKit, you don't need to abandon it immediately. Here's a hybrid approach:

| Feature | Traditional PassKit | iOS 27 Native | Best For | |---------|-------------------|---------------|----------| | Server-side signing | Required | Not needed | Legacy apps | | Certificate management | Complex | None | New features | | User experience | App-mediated | Native Wallet UI | Frictionless flow | | QR code scanning | App responsibility | Wallet built-in | Mass adoption | | Offline support | Full | Limited | Connected users | | Custom styling | Extensive | Template-based | Branded passes |

Recommended migration strategy:

  1. Keep existing PassKit implementation for current users
  2. Add iOS 27 detection to offer native path for new signups
  3. Phase out server-side pass generation once iOS 27 adoption exceeds 60%

Practical Example: Fitness App Integration

Here's how a fitness app would implement this:

import UIKit
import PassKit

class MembershipPassViewController: UIViewController {
    
    // Detect iOS 27+ capability
    func supportsNativePassCreation() -> Bool {
        if #available(iOS 27, *) {
            return true
        }
        return false
    }
    
    func addMembershipToWallet(membership: FitnessMembership) {
        if supportsNativePassCreation() {
            // Use native iOS 27 flow
            addViaWalletNativeFlow(membership)
        } else {
            // Fall back to traditional PassKit
            addViaTraditionalPassKit(membership)
        }
    }
    
    private func addViaWalletNativeFlow(_ membership: FitnessMembership) {
        // Generate QR code containing pass essentials
        let qrContent = """
        PASS_TYPE:MEMBERSHIP
        ID:\(membership.id)
        NAME:\(membership.memberName)
        EXPIRES:\(membership.expirationDate)
        """
        
        // Let Wallet handle pass creation
        let qrImage = generateQRCode(from: qrContent)
        presentQRForWalletScan(qrImage)
    }
    
    private func addViaTraditionalPassKit(_ membership: FitnessMembership) {
        // Legacy: Server signs .pkpass file
        fetchSignedPassFile(for: membership.id) { passData in
            let pass = try PKPass(data: passData)
            let vc = PKAddPassesViewController(pass: pass)
            self.present(vc, animated: true)
        }
    }
}

Key Advantages for Developers

Reduced Operational Burden:

  • Eliminate certificate renewal workflows
  • No server-side cryptographic signing required
  • Simplified compliance with Apple's PassKit requirements

Better User Experience:

  • Fewer app-to-Wallet friction points
  • Native iOS Wallet UI is familiar to users
  • Faster adoption for casual users

Lower Development Costs:

  • Reduced backend infrastructure
  • Fewer security vulnerabilities in pass generation
  • Simplified testing and deployment

Limitations to Consider

While iOS 27's native pass creation is powerful, understand its constraints:

  • Three template types only (event, membership, discount)
  • Limited customization compared to full PassKit styling
  • QR/barcode data only for identity (no cryptographic signatures)
  • iOS 27+ requirement (older devices fall back to app-based storage)

Testing and Rollout Strategy

Before fully transitioning:

  1. Beta test on iOS 27 devices (expected early 2026 beta releases)
  2. Maintain dual code paths for at least two release cycles
  3. Monitor adoption metrics for native Wallet creation vs. traditional flow
  4. Gather user feedback on QR scanning experience
  5. Plan certificate deprecation after 80% of user base is iOS 27+

Conclusion

iOS 27's Create a Pass feature democratizes Wallet integration for developers who previously faced PassKit's complexity. The transition from certificate-based pass generation to QR code-driven native creation reduces operational overhead while improving user experience.

Start planning your migration now by adding iOS 27 compatibility checks to your codebase and preparing QR-based pass data structures. By 2026, this could become your primary Wallet integration path.