Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Apple Walletでパスを作るお話
Search
Ryotaro Onoue
July 12, 2024
Technology
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Apple Walletでパスを作るお話
Ryotaro Onoue
July 12, 2024
More Decks by Ryotaro Onoue
See All by Ryotaro Onoue
FlutterKaigi 2025 公式アプリ&WebサイトのCDについて
yumnumm
0
120
FlutterKaigi 2025 システム裏側
yumnumm
0
2.1k
Terraform+cloud-initで自宅サーバのLXDをIaCするお話
yumnumm
2
240
FlutterKaigi 2024における開発チームの取り組み と 2025への展望
yumnumm
0
100
Dart WebAssemblyを使ったWeb API on Cloudflare Workers
yumnumm
0
130
私がやってきたアウトプット集
yumnumm
0
210
俺/私のこだわりデスク大大大自慢LT大会 (LTFes #12)
yumnumm
0
150
仕事以外で作成したプロダクトの自慢大会
yumnumm
0
200
Cloudflare Workers でプリントシール機の画像共有システムを制作したお話 @serverlessF
yumnumm
0
310
Other Decks in Technology
See All in Technology
AI Coding Agent時代のcdk-nagガードレール 〜組織ルールを強制CIで守り抜く設計の挑戦〜
mhrtech
3
440
タスクの複雑さでモデルを選ぶ ── Thompson Samplingで動かす“トークン/コスト最適化
satohy0323
0
570
プロダクト開発組織の現在地(Ver.2026/07) / product-organization
kaonavi
0
120
Gen3R: 3D Scene Generation Meets Feed-Forward Reconstruction
spatial_ai_network
0
140
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
4k
AI時代のYAGNI:「爆速で無駄になった機能」からの学び / 20260720 Naoki Takahashi
shift_evolve
PRO
3
390
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
1.6k
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
4
2.4k
「最後に責任を取るのはチーム」— 人間のPRレビューを最小化してアップデートしたメンタルモデル
jnishime_dresscode
0
940
大量データに対しても、生成AIを用いてリーズナブルにデータ加工をしたい!Databricksのai_queryについて調べてみた
kamoshika
1
220
SRE本の知られざる名シーン / The Hidden Gems of Google SRE Book
nari_ex
2
430
Type-safe IaC for Dart
coborinai
0
160
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Navigating Team Friction
lara
192
16k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Thoughts on Productivity
jonyablonski
76
5.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
250
The Language of Interfaces
destraynor
162
27k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
810
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
2024.07.12 Apple WalletͰύεΛ࡞Δ͓ YUMEMI Inc. Flutter Engineer - Ryotaro Onoue
1 Money Forward×YUMEMI.grow ࣗশएखϞόΠϧΤϯδχΞLTձ
0. ࣗݾհ ɾגࣜձࣾΏΊΈ FlutterΤϯδχΞ 20234݄ʙ ɾFlutterKaigi 2023 (ڞಉ)ొஃ&ελοϑ ɾDart BFF(Backend
for Frontend)ͷΛ͠·ͨ͠ ɾFlutterKaigi 2024 WebαΠτνʔϜ&σʔλνʔϜ ɾTwitter @YumNumm(͙͙) Ͱ͍ͬͯ·͢ ɾࠓ9݄Ͱ20ࡀʹͳΓ·͢ ࠓ19Ͱ͢ 2
None
ࠓͷτϐοΫ ❌ FlutterΤϯδχΞͰ͕͢ɺFlutterͷ͠·ͤΜ ࠓɺAppleϓϥοτϑΥʔϜʹدͬͨΛ͠·͢ (ݩʑAndroidʹ৮Δ༧ఆͩͬͨͷͰ͕͢ɺ͕࣌ؒ͋·ΓऔΕͣ...🙏) 4
ࠓͷτϐοΫ ❌ FlutterΤϯδχΞͰ͕͢ɺFlutterͷ͠·ͤΜ ࠓɺAndroidͱiOS ͦΕͧΕϓϥοτϑΥʔϜʹدͬͨΛ͠Α͏ͱࢥ͍·͢ 5
ࠓͷτϐοΫ 6 ΥϨοτ App Έͳ͞Μ͍ͬͯ·͔͢?
ͳΜͰ͜ͷ? ɾ@ۙॴͷΠτʔϤʔΧυʔ ɾηϧϑϨδͰొΛͨ͠ޙͷϙΠϯτΧʔυొʹͯ ɾΠτʔϤʔΧυʔͷWiFiʹଓ͞Ε͍ͯͯ ΞϓϦ͕ىಈ͠ͳ͍ ɾϞόΠϧσʔλ༰ྔ͕ऴΘ͍ͬͯͯ ىಈʹ10ඵ͘Β͍ͨ͞ΕΔ ɾͭͷΠϠ͕ͩ ϙΠϯτ͕͔ͳ͍ͷ൵͍͠ ɾ݁Ռ:
ڏແͷ͕࣌ؒྲྀΕΔ 7
ͳΜͰ͜ͷ? ɾۙॴͷΠτʔϤʔΧυʔʹͯ ɾηϧϑϨδͰొΛͨ͠ޙͷϙΠϯτΧʔυొʹͯ ɾ΅͘ʮ͋ͬɺϙΠϯτΧʔυొ͠ͳ͍ͱ... εϚϗͷΞϓϦͬͱʯ ɾiPhoneʮΠτʔϤʔΧυʔͷWiFiܨ͕͍ͬͯΔ͔Βೝূͯ͠Ͷʯ(ΩϟϓςΟϒWiFi) ɾ΅͘ʮ͍ɺࠓ͍ΒΜʯ ɾΞϓϦʮ(10ඵ΄Ͳػ)ωοτଓͰ͖·ͤΜʯ ɾ΅͘ʮWiFiΦϑʹͯ͠ΞϓϦ࠶ىಈ...ʯ ɾΞϓϦʮ(5ඵ΄Ͳػ)͍ɺϙΠϯτΧʔυͷόʔίʔυʯ
ɾ΅͘ʮͬͱܾࡁͷͱ͜Ζ·ͰདྷͨΘʯ 8 ɾSuicaܾࡁɾΫϨδοτΧʔυܾࡁͰ͢Β Apple Watch୯ମͰࡁ·ͤΒΕΔ͜ͷ࣌ ʹͲ͏ͯ͠ʮΞϓϦΛ։͍ͯͭʯͱ͍͏ΊΜͲ͍͘͞ίτΛ͠ͳ͍ͱ͍͚ͳ͍ͷ ͔? ɾ͜͜Ұͭ ٕज़Ͱղܾ͍ͨ͠ɻ -> ύεΛ࡞ͬͨΔ!
2. Apple WalletͷΈ 9
1. ύεͷσʔλΛ༻ҙ͢Δ - pass.json: ύεʹදࣔ͢ΔจࣈྻϝλσʔλΛ֨ೲ - ֤छը૾ϑΝΠϧ: ϩΰΞΠίϯͳͲ - (optional)
ϩʔΧϦθʔγϣϯใ 2. Apple WalletͷΈ 10
1. ύεͷσʔλΛ༻ҙ͢Δ - pass.json: ύεʹදࣔ͢ΔจࣈྻϝλσʔλΛ֨ೲ - ֤छը૾ϑΝΠϧ: ϩΰΞΠίϯͳͲ - (optional)
ϩʔΧϦθʔγϣϯใ 2. ύεͷσʔλͦΕͧΕʹରͯ͠ॺ໊Λ͢Δ - ͍͔ͭ͘ͷσʔλΛ༻ҙͯ͠ॺ໊ 3. σʔλͱॺ໊ΛؚΊͯZIPѹॖ 4. ֦ுࢠΛ.pkpassʹม͑ͯ - Webܦ༝ͰϝʔϧͰAirDropͰʙ 2. Apple WalletͷΈ 11
- Apple WalletΛܦ༝ͯ͠ύεΛ৴ɾ͢ΔͨΊʹॺ໊͕ඞཁ - ύε͕࡞+ॺ໊͞Ε͔ͯΒɺѱҙͷ͋ΔϢʔβʹΑͬͯվม͞Ε͍ͯͳ͍͜ͱΛ ݕূͰ͖ΔΑ͏ʹͳΔ - Pass Type IdentifierͱTeam
IDΛ༻ҙ͢Δ - Identifier(ࣝผࢠ)Λొͨ͠ΒɺCertificate(ূ໌ॻ)ΛDL͢Δ - Identifier pass. ͔Β࢝·ΔҙͷٯDNSจࣈྻ 2-0. ֤छূ໌ॻͷ༻ҙ 12
- ύεͷσʔλ pass.json ʹهड़͢Δ - description, formatVersion: “1”, organizationName(Team ID),
passTypeIdentifier, serialNumber ඞਢ - barcodesbackgroundColor, associatedStoreIdentifiers, locationsهड़Ͱ͖Δ - associatedStoreIdentifiers: ύεʹඥͮ͘ΞϓϦ ͷAppStoreࣝผࢠྻɻύε͔ΒΞϓϦΛىಈͰ͖Δ - locations: ύεʹඥͮ͘ҢܦྻɻͦͷҐஔʹߦ͘ ͱɺϩοΫը໘ʹύεͷީิ͕ग़ͯ͘Δ - ৄࡉͳύεͷจࣈྻPass Type͝ͱʹهड़(࣍ϖʔδ) 2-1. ύεͷσʔλΛ༻ҙ͢Δ 13
- ύεʹେ͖͘5छྨ͋ΜͶΜ: ͦΕͧΕͰදࣔͰ͖Δ߲͕ҧ͏ 2-1. ύεͷσʔλΛ༻ҙ͢Δ 14 Boarding pass Coupon Generic
Event ticket Store card https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Creating.html#//apple_ref/doc/uid/TP40012195-CH4-SW1 ΑΓҾ༻
- ύεʹେ͖͘5छྨ͋ΜͶΜ: ͦΕͧΕͰදࣔͰ͖Δ߲͕ҧ͏ 2-1. ύεͷσʔλΛ༻ҙ͢Δ 15 Boarding pass Coupon Generic
Event ticket Store card https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/YourFirst.html ΑΓύεσʔλΛҾ༻
- ֤छը૾ͷ༻ҙ - എܠը૾ΞΠίϯɾϩΰͳͲΛஔ Ͱ͖Δ - ύεͷλΠϓʹԠͯ͡දࣔͰ͖Δը૾ ͕ҟͳΔͷͰɺ֬ೝ͢͠ 2-1. ύεͷσʔλΛ༻ҙ͢Δ
16
- ॺ໊ɾѹॖsignpassίϚϯυͰָʹ࣮Ͱ͖Δ - signpassπʔϧApple Developer͔ΒDLͰ͖Δ - signpass -p hoge Ͱѹॖʙॺ໊·Ͱͬͯ͘ΕΔ
- hoge.pkpass͕Ͱ͖ΔͷͰɺAirDropͰૹΕOK 2-2. ύεͷσʔλΛॺ໊͢Δ 17 https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/index.html ΑΓDLՄೳ
- ͰɺsignpassίϚϯυதͰԿΛ͍ͬͯΔͷ͔? - ͍͔ͭ͘ͷॺ໊νΣʔϯΛݩʹɺύεσʔλ͕ਖ਼͍͔͠ݕূͰ͖ΔΑ͏ʹ͍ͯ͠Δ 1. pass.jsonը૾ϑΝΠϧͷSHA-1ϋογϡΛܭࢉͯ͠manifests.jsonʹ֨ ೲ͢Δ 2-2. ύεͷσʔλΛॺ໊͢Δ 18
- ͰɺsignpassίϚϯυதͰԿΛ͍ͬͯΔͷ͔? - ͍͔ͭ͘ͷॺ໊νΣʔϯΛݩʹɺύεσʔλ͕ਖ਼͍͔͠ݕূͰ͖ΔΑ͏ʹ͍ͯ͠Δ 1. pass.jsonը૾ϑΝΠϧͷSHA-1ϋογϡΛܭࢉͯ͠manifests.jsonʹ֨ ೲ͢Δ 2.ʮ2-0. ֤छূ໌ॻͷ༻ҙʯͰ༻ҙͨ͠Certificates+WWDR(World Wide
Developer Relations தؒূ໌ॻ)Ͱ manifests.json Λެ։伴ॺ໊Λൃߦ - PKCS#7(҉߸Խσʔλॺ໊ΛؚΉϝοηʔδަܗࣜنఆ)ॺ໊Λ࡞͢Δ 2-2. ύεͷσʔλΛॺ໊͢Δ 19
- ͰɺsignpassίϚϯυதͰԿΛ͍ͬͯΔͷ͔? - ͍͔ͭ͘ͷॺ໊νΣʔϯΛݩʹɺύεσʔλ͕ਖ਼͍͔͠ݕূͰ͖ΔΑ͏ʹ͍ͯ͠Δ 1. pass.jsonը૾ϑΝΠϧͷSHA-1ϋογϡΛܭࢉͯ͠manifests.jsonʹ֨ ೲ͢Δ 2.ʮ2-0. ֤छূ໌ॻͷ༻ҙʯͰ༻ҙͨ͠Certificates+WWDR(World Wide
Developer Relations தؒূ໌ॻ)Ͱ manifests.json Λެ։伴ॺ໊Λൃߦ - PKCS#7(҉߸Խσʔλॺ໊ΛؚΉϝοηʔδަܗࣜنఆ)ॺ໊Λ࡞͢Δ 2-2. ύεͷσʔλΛॺ໊͢Δ 20
- ͰɺsignpassίϚϯυதͰԿΛ͍ͬͯΔͷ͔? - ͍͔ͭ͘ͷॺ໊νΣʔϯΛݩʹɺύεσʔλ͕ਖ਼͍͔͠ݕূͰ͖ΔΑ͏ʹ͍ͯ͠Δ 1. pass.jsonը૾ϑΝΠϧͷSHA-1ϋογϡΛܭࢉͯ͠manifests.jsonʹ֨ ೲ͢Δ 2.ʮ2-0. ֤छূ໌ॻͷ༻ҙʯͰ༻ҙͨ͠Certificates+WWDR(World Wide
Developer Relations தؒূ໌ॻ)Ͱ manifests.json Λެ։伴ॺ໊Λൃߦ - PKCS#7(҉߸Խσʔλॺ໊ΛؚΉϝοηʔδަܗࣜنఆ)ॺ໊Λ࡞͢Δ 3. σʔλ+ॺ໊ΛZIPѹॖ -> ֦ுࢠΛ.pkpassʹมߋ Ϥγ👌 2-2. ύεͷσʔλΛॺ໊͢Δ 21
3. ࣮ࡍʹύεΛߏங͢Δ 22
- ࠓճΠτʔϤʔΧυʔͷϙΠϯτΧʔυΛApple WalletʹೖΕ͍ͨ - ͪͳΈʹɺར༻ن֬ೝࡁΈ(ϙΠϯτΧʔυͷόʔίʔυෳʹؔ͢Δهड़ͳ͍) - όʔίʔυ࣌ؒʹΑͬͯมԽ͠ͳ͍ - े࣮ݱՄೳͳ͜ͱݕূࡁΈ 3.
࣮ࡍʹύεΛߏங͢Δɹ 23
3. ࣮ࡍʹύεΛߏங͢Δɹ 24
25 ͬͯ͜ͱͰ!
- νέοτͬͯݴΘΕͨΒΠϕϯτνέοτͰ͢ΑͶʙ - ͱ͍͏͜ͱͰɺSupabase(Database)+Stripe(ܾࡁ)+Flutter Web(ϑϩϯτ Τϯυ)ͰνέοτཧγεςϜΛ࡞ͬͯΈ·ͨ͠ ticket.yumnumm.dev github.com/YumNumm/ticket-system 4. [͓·͚]
ಈతੜ͢ΔΑ͏ʹͯ͠Έ·ͨ͠ 26
- νέοτͬͯݴΘΕͨΒΠϕϯτνέοτͰ͢ΑͶʙ - ͱ͍͏͜ͱͰɺSupabase(Database)+Stripe(ܾࡁ)+Flutter Web(ϑϩϯτ Τϯυ)ͰνέοτཧγεςϜΛ࡞ͬͯΈ·ͨ͠ ticket.yumnumm.dev github.com/YumNumm/ticket-system - νέοτੜCloudflare
Workers(αʔόϨεJS࣮ߦڥ)Ͱ࣮ߦ - TypeScriptͰهड़ - ແྉͰࢼͤΔͷͰؾ͕͍ͨΒݟͯΈ͍ͯͩ͘͞ 4. [͓·͚] ಈతੜ͢ΔΑ͏ʹͯ͠Έ·ͨ͠ 27
- νέοτͬͯݴΘΕͨΒΠϕϯτνέοτͰ͢ΑͶʙ - ͱ͍͏͜ͱͰɺSupabase(Database)+Stripe(ܾࡁ)+Flutter Web(ϑϩϯτ Τϯυ)ͰνέοτཧγεςϜΛ࡞ͬͯΈ·ͨ͠ ticket.yumnumm.dev github.com/YumNumm/ticket-system - νέοτੜCloudflare
Workers(αʔόϨεJS࣮ߦڥ)Ͱ࣮ߦ - TypeScriptͰهड़ - αϯϓϧύε https://api.ticket.yumnumm.dev/sample/wallet ͔Β DLͰ͖·͢! 4. [͓·͚] ಈతੜ͢ΔΑ͏ʹͯ͠Έ·ͨ͠ 28 ͍͔ͭ͘᠘͕͋ΔͷͷɺTSͷܕʹैͬͯຒΊ ͍͚ͯͩ͘ͳͷͰɺׂͱָʹߏஙͰ͖·͢
- Apple WalletͰͷύεੜׂͱָʹͰ͖Δ - ΞϓϦαʔϏεʹΈࠐΉ͚ͩͰͳ͘ɺࣗ༻ʹύεΛΉͷΞϦ(Ex. ϙ ΠϯτΧʔυɾֶੜূ) - نϧʔϧʹؾΛ͚ͭͯ -
ಈతʹੜ͢Δ͜ͱՄೳ - ຊLTͰѻ͍·ͤΜͰ͕ͨ͠ɺApple Push Notification Service(APNs)Λ ར༻ͯ͠ αʔό͔Βಈతʹ༰Λॻ͖͑Δ͜ͱͰ͖·͢ - ௨ΛૹͬͨΓͰ͖Δ 5. ·ͱΊ 29
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠! 30 Follow me on Twitter: @YumNumm νέοτཧγεςϜ Twitter