Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Appleウォレット / Googleウォレットに チケットを保存する方法

Avatar for muno92 muno92 PRO
August 22, 2024

Appleウォレット / Googleウォレットに チケットを保存する方法

iOSDC Japan 2024 day1での発表資料です。
補足記事: https://muno-92.hatenablog.com/entry/2024/09/01/184414

Avatar for muno92

muno92 PRO

August 22, 2024

More Decks by muno92

Other Decks in Technology

Transcript

  1. Appleウォレット 搭乗券 クーポン 今回はこれ イベント • 様々な「パス」をiPhone・ Apple Watchに保存可能な サービス

    • ⚠ 一般的なパスは「他の種別 に当てはまらなかった」場合 のみ使用可 店舗カード その他の一般的なパス 画像: https://developer.apple.com/jp/wallet/ 8
  2. Googleウォレット 小売 チケット 今回はこれ アクセス • 様々な「パス」をAndroidス マートフォン・スマートウォッ チに保存可能なサービス •

    ⚠ 汎用パスは「他の種別に当 てはまらなかった」場合のみ使 用可 健康 汎用パス 画像: https://developers.google.com/wallet?hl=ja 9
  3. 事前準備 1. Google Wallet API 発行者アカウント登録 2. Google Cloudの任意のプロジェクトでGoogle Wallet

    APIを有効化 3. 2番のプロジェクトでサービスアカウント(アプリケーション用の アカウント)を作成 4. Google Pay and Wallet Consoleで3番のアカウントを承認 https://developers.google.com/wallet/tickets/events/getting-started/onboarding-guide 28
  4. 🚫 "Add to Google Wallet"ボタン • 日本語化されたボタンを使っていなかった • "It appears

    the button being used in your screenshot is incorrect and we ask that you correct this to re ect our Brand Guidelines." 何がどうincorrectなのかの記載は無く、ローカライズ対応が 指摘箇所かもしれないと修正したら審査を通った 40 fl •
  5. 本番で動かしたらエラー • 400エラー • • Request contains an invalid argument

    これだけ • → パスに差し込む画像のURL組み立て処理が間違っていた • ローカル環境では画像を固定していたので気づけず(伏線回収) 42
  6. 実装 1. Apple Developerから証明書を作成 2. pass.jsonを作成 3. 必要な画像を配置 4. pass.json・画像のSHA-1ハッシュを計算しmanifest.jsonを作成

    5. manifest.jsonに署名 6. zip圧縮し、拡張子をpkpassに変更 7. 「Appleウォレットに保存」ボタンを設置 54
  7. 証明書の作成 1. CSR (Certi cate Signing Request。証明書署名要求)を作成 • 署名時に秘密鍵が必要になるので、CSR生成時に秘密鍵も作成しておく •

    例) openssl req -new -key cert.key -out cert.csr -sha256 2. Apple Developer上 1. Pass Type Identi erを作成 2. CSRをアップロードし、証明書を作成 https://developer.apple.com/documentation/walletpasses/building-a-pass fi fi 55
  8. 必要な画像の配置 • icon: どの種類のパスでも必須 • "Customize the look of your

    pass by using images for a logo and other items. All passes require an icon" • メールに添付された場合の画像表示や、通知で使用される • その他の画像: パスの種類やレイアウトに応じて必須 • イベントパスのレイアウトは2種類 57
  9. イベントパスで必要な画像ファイル • icon • Layout 1の場合 • background or thumbnail

    • Layout 2の場合 ←こちらを使用 • strip (横長の画像) 60
  10. Layoutはどうやって決まる? "An event ticket can display logo, strip, background, or

    thumbnail images. However, if you supply a strip image, don’t include a background or thumbnail image." 🤔 https://developer.apple.com/design/human-interface-guidelines/wallet 61
  11. Layoutはどうやって決まる? "An event ticket can display logo, strip, background, or

    thumbnail images. However, if you supply a strip image, don’t include a background or thumbnail image." 意訳) background imageかthumbnail imageがあればLayout 1 に、strip imageがあればLayout 2になります。 https://developer.apple.com/design/human-interface-guidelines/wallet 62
  12. manifest.jsonに署名 • 例) openssl smime -sign -in manifest.json -inkey 秘密鍵のパス

    -signer 証明書のパス -cert le 中間証明 書のパス -out signature -outform DER • 署名に必要なファイル • Apple Developerから発行した証明書 • 証明書に紐づく秘密鍵 • WWDR中間証明書 https://developer.apple.com/jp/help/account/reference/wwdr-intermediate-certi cates/ のG4 fi fi 63
  13. メタデータの活用 (fortee未対応) • パスのメタデータを適切に設定するとウォレットがより便利に • イベント開催間際の通知 • イベント終了後にパスを期限切れに • 開始時間・会場の両方に近づいたらiPhoneのロック画面にパスを表示

    • etc https://developer.apple.com/documentation/walletpasses/supporting-semantic-tags-in-wallet-passes https://developer.apple.com/documentation/walletpasses/showing-a-pass-on-the-lock-screen https://developers.google.com/wallet/tickets/events/use-cases/upcoming-noti cation fi 76
  14. 比較 Appleウォレット Googleウォレット ・複数。「その他」あり パスの種別 ・複数。「その他」あり 参加者毎に独立 パスの情報 参加者共通項目あり pkpassファイルを作成

    パスの新規登録 POST API 複雑 パスの更新 PUT / PATCH APIを叩くだけ パス内に直接格納 (ローカルで開発しやすい) 画像 同じ 違い有 URL指定 (ローカルで開発しにくい) 有料 ※1 費用 無料 なし 審査 初期導入時あり ※1: Apple Developer Programに既に入っていれば実質無料 違い大 78
  15. 補足) スマートウォッチへの保存方法 • • Apple Watch • Webサイトからパスを追加する場合:iPhone経由 • メールやメッセージからパスを追加する場合:直接

    Wear OS スマートウォッチ • Androidスマートフォン経由 https://support.apple.com/ja-jp/guide/watch/apd4362807a0/watchos https://support.google.com/googlepixelwatch/answer/14260807? hl=ja&ref_topic=12652267&sjid=11192229721491948574-AP 82
  16. 補足) JWT • • JSON Web Tokensの略。RFC 7519で定義された形式 • コンパクトでURLセーフ

    • ドットで区切られたヘッダー / ペイロード / 署名からなる文字列 ペイロード • JSON形式のパスクラス・オブジェクトをbase64エンコード 83
  17. 補足) PKCS #7 • PKCS (Public Key Cryptography Standards、公開鍵暗号標準) の7番目

    • データの暗号化や署名に使われるRFC 2315で定義された形式 • 署名データの形式には3パターンある 85
  18. 補足) 署名データの形式 • 分離(Detached)形式 ← Appleウォレットで使用 • 署名対象データから独立して署名データを作成する形式 • 電子署名されたメールをS/MIME非対応のメーラーでも読み取れるようにする目的などで使用

    • 内包(Enveloping)形式 • 署名データの中に署名対象データを格納する形式 • 包含(Enveloped)形式 • 署名対象データの中に署名データを格納する形式 86
  19. ① forteeでの実装方針 • 必須 • 受付用QRコード • チケット番号 (QRコードを読めない •

    やらない • パスに埋め込んだカンファレンス・ イベント情報の更新 • 時の照合用) • チケット販売を開始する頃には確 定しているはず 頑張ってはやらない • パスに埋め込んだチケット参加者情 報の変更の更新 88