WWDC Quick Look 💓 By SwiftGGTeam
Walletの新機能

Walletの新機能

元の動画を見る

ハイライト

iOS 27はWallet PassにPoster Genericという新しいスタイル、4種類の新しいバーコード形式、Featured Actions APIをもたらします。さらにAppleは、Mac用のビジュアルデザインツールであるPass Designerと、Swift on Serverの署名ライブラリであるPass Builderを提供します。これにより、Passのデザイン、パーソナライズ、配布のためにJSONを手書きしたり、サードパーティの署名スクリプトに頼ったりする必要がなくなります。

主要内容

Passデザインの苦痛がようやく終わる

以前Wallet Passを作る流れはこうでした。テキストエディタを開き、pass.jsonを手書きし、各フィールドのキー名、階層、形式をドキュメントで確認する。画像をbundleに入れても最終結果は見えないため、何度もパッケージ化し、iPhoneへ送り、Walletを更新して検証する。署名はさらに面倒で、証明書を自分で扱い、manifestを生成し、PKCS#7署名を作り、.pkpassへ圧縮する必要があり、多くのチームが長年メンテされていないオープンソーススクリプトに依存していました。

WWDC26では公式の解決策が示されました。AppleはPass DesignerとPass Builderという2つのツールを発表しました。

Pass DesignerはMac上のWYSIWYGエディタです(06:03)。左サイドバーでスタイル、画像、バーコード、フィールドを構成し、右側ではiOS実機と同じPassプレビューがリアルタイムに表示されます。デザイナーは画像をドラッグし、色を調整し、スタイルを切り替え、.pkpasstemplateテンプレートファイルとして書き出せます。

Pass BuilderはSwift on Serverパッケージです(06:26)。MacとLinuxで動作し、型安全なSwift APIとbuildpassコマンドラインツールを提供します。テンプレートのパーソナライズ、署名、.pkpassへのパッケージ化を担当し、manifest生成、PKCS#7署名、圧縮といった面倒な処理をすべて自動化します。

Poster Generic: 大きな画像を主役にする

iOS 27にはPoster GenericというPassスタイルが追加されました(00:36)。会員カード、ポイントカード、プリペイドカードのように視覚的なインパクトが必要な場面に向いています。Passの表面は、背景画像、メインロゴ、headerフィールド、primaryフィールド、単一のfooterフィールド、バーコードで構成されます。背景画像が主な視覚領域を占め、フィールド情報は画像の上に重ねて表示されます。

使い方は、pass.jsonのトップレベルでposterGenericキーを宣言します(01:41)。

{
  "posterGeneric": {
    "headerFields": [
      {
        "key": "memberID",
        "label": "Guest No.",
        "value": "102035"
      }
    ],
    "footerFields": [
      {
        "key": "membershipType",
        "value": "Family Pass"
      }
    ]
  }
}

注意すべき制限が2つあります。

  • Poster Genericがサポートするfooterフィールドは1つだけです。複数書いても最初の1つだけが表示されます(01:58)。
  • iOS 27が必要です。古いデバイスとの互換性のため、genericキーも同時に残すことが推奨されます(02:12)。
{
  "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" }
    ]
  }
}

このようにしておけば、iOS 26以前ではgenericスタイルへフォールバックし、iOS 27ではPoster Genericが表示されます。

4種類の新しいバーコード。ただしfallbackを忘れない

iOS 27では、EAN-13、Code 39、Codabar、ITFという4種類のバーコード形式がサポートされます(02:33)。pass.jsonbarcodes配列で形式を指定します。

{
  "barcodes": [
    {
      "format": "PKBarcodeFormatCodabar",
      "message": "123456789",
      "messageEncoding": "iso-8859-1"
    }
  ]
}

古いiOSバージョンはこれらの新形式をサポートしていません。新しいバーコードを1種類だけ提供すると、iOS 26以前のデバイスではPassにバーコードがまったく表示されません03:28)。

推奨される書き方は、優先順位順に複数のバーコードを提供し、デバイスがレンダリングできる形式をシステムに選ばせることです(03:37)。

{
  "barcodes": [
    {
      "format": "PKBarcodeFormatCodabar",
      "message": "123456789",
      "messageEncoding": "iso-8859-1"
    },
    {
      "format": "PKBarcodeFormatQR",
      "message": "123456789",
      "messageEncoding": "iso-8859-1"
    }
  ]
}

どうしても1種類のバーコードしかサポートできない場合、Appleは認証IDをheaderFieldまたはprimaryFieldに置き、現場スタッフが手入力できるようにすることを勧めています(03:58)。

iOS 18の第2世代イベントチケットでは、セマンティックURLによってPassの下に操作ボタン(たとえばイベントスケジュールの表示)を表示できるようになりました。iOS 27では、この機能がすべてのPassスタイルへ開放されます(04:42)。

pass.jsonのトップレベルでfeaturedActions配列を定義します。

{
  "featuredActions": [
    {
      "identifier": "my-offer-id",
      "type": "membershipBenefits",
      "url": "www.example.com/offers"
    }
  ]
}

各actionには一意のID、タイプ、値(通常はURL)が含まれます。WalletはPassの下に、色付きアイコンとローカライズされた行動喚起文言を備えたボタンを表示します(05:15)。

1つのPassがサポートするfeatured actionsは最大2つです。優先順位順に並べ、最も意味のある操作だけを置くことが推奨されます(05:24)。

詳細

Pass Designerでテンプレートを設計する

Pass Designerのワークフローは直感的です(06:58)。

  1. Poster GenericなどのPassスタイルを選ぶ
  2. Images領域へ画像をドラッグし、背景画像とメインロゴを設定する
  3. サイドバーでheader、primary、footerフィールドを追加する
  4. バーコードタイプとメッセージを構成する
  5. Label Colorや背景色などの色を調整する
  6. .pkpasstemplateファイルとして保存する

実用的なコツとして、Poster Genericの最初のprimary fieldでlabelを省略すると、フィールド値が太字の大見出しとして表示されます(08:26)。会員名やポイント残高などの中核情報に向いています。

Pass Builderでサーバー側から一括生成する

Pass BuilderはSwift Packageです。Package.swiftで依存関係を追加します(10:56)。

// 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")
            ]
        ),
    ]
)

Passを生成するコード(11:05)。

import PassBuilder

func createPass(for doggo: MemberModel) async throws -> URL {
    // Pass Designer から書き出したテンプレートを読み込む
    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)
    ]

    // Featured Action を追加する
    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
    )

    // 署名して .pkpass を出力する
    let destinationURL = URL(string: "/www/passes/" + doggo.id)
    try signer.signPass(package, writingTo: destinationURL)

    return destinationURL
}

重要ポイント:

  • PassPackagepass.fieldsbackgroundbarcodesfeaturedActionsなどのプロパティを含むpass bundleへ、型安全なAPIでアクセスできるようにする
  • PassImageはURLから画像リソースを読み込む
  • Pass.Barcode.pdf417.qrなどの形式enumをサポートする
  • PassCertificate.p12署名証明書とApple WWDR中間証明書を読み込む
  • PassSignerはmanifest生成、PKCS#7署名、圧縮パッケージ化のすべてのロジックをカプセル化する
  • signPass(package, writingTo:)は配布可能な.pkpassファイルを1ステップで出力する

Swift以外のバックエンドでも使える

Pass BuilderはSwiftバックエンドに限定されません。Appleは2つの道を提供しています。

  1. swift-javaバインディング: swift-javaプロジェクトを通じてJavaネイティブバインディングを生成し、JVMからPass Builder APIを直接呼び出す(13:54
  2. Protobuf + コマンドライン: AppleはPass Package形式のprotobuf定義を公開しており、任意の言語で型安全なモデルを生成し、その後buildpassコマンドラインツールを呼び出してパーソナライズと署名を完了できる(14:03

主な示唆

1. 会員/ポイントカードアプリのビジュアルアップグレード

ユーザーのアバターやブランドのキービジュアルをPoster Genericの背景画像にし、最初のprimary fieldのlabelを省略してユーザー名やポイント残高を表示し、footerに会員ランクを置きます。Featured Actionには「ポイントストアを見る」と「クーポンを交換する」の2つのボタンを置きます。ユーザーがWalletを開いた瞬間に中核情報が見え、タップすれば直接操作へ進めます。

入口: Pass DesignerでPoster Genericテンプレートを作成し、バックエンドでPassPackageを使ってユーザーデータを注入します。

2. 実店舗のスキャン入場システム

ジム、ヨガスタジオ、コワーキングスペースは、Pass Builderを使ってPDF417バーコード付きの日次カード/月次カードを一括生成できます。バーコード内容にはユーザーIDと有効期限をエンコードし、店舗ゲートでスキャンすれば開錠します。fallbackバーコードとしてQR Codeを使い、古いデバイスに対応します。

入口: Pass.Barcode(message: userId, format: .pdf417) + barcodes配列でQR Codeをフォールバックとして用意します。

3. イベントチケットのセマンティック操作

コンサートや展示会のチケットでは、Passの下に「座席図を見る」と「会場への道順」の2つのFeatured Actionsを置けます。ユーザーは現地でアプリを探す必要がなく、Walletから直接タップして移動できます。

入口: featuredActions配列でtypeurlを構成すると、Walletがアイコンと文言を自動レンダリングします。

4. 企業内部の来訪者通行証システム

会社の受付がPass Designerで来訪者証テンプレートを設計し、HRシステムがPass Builder APIを呼び出して、写真、アクセス区域、有効期限を含むPassを来訪者ごとに生成し、.pkpass添付ファイルとしてメール送信します。来訪者がWalletへ追加した後、入退室ゲートでスキャンすれば通行できます。

入口: PassImage(url: photoURL)で来訪者写真を設定し、Pass.Barcodeで来訪者IDをエンコードします。

5. サードパーティ署名スクリプトから公式ツールチェーンへ移行する

まだPython/Node.jsのオープンソースライブラリでPassを生成しているチームは、署名ロジックをbuildpass CLIまたはPass Builderへ置き換えられます。これにより、OpenSSLバージョン衝突や証明書形式の非互換といった運用問題を根本的に解消できます。

入口: Pass Builderのソースをダウンロードし、既存の署名ロジックをPassSignerに置き換え、protobuf定義で多言語バックエンドに対応します。

関連セッション

コメント

GitHub Issues · utterances