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
In-App Purchasesの 実装前に知っておきたい ハマりポイント / Points ...
Search
rockname
May 20, 2019
Programming
1.9k
0
Share
In-App Purchasesの 実装前に知っておきたい ハマりポイント / Points to be aware of when implementing In-App Purchases
rockname
May 20, 2019
More Decks by rockname
See All by rockname
AIを活用したレシート読み取り機能の開発から得られた実践知 / AI Receipt Scan Practice
rockname
2
4.6k
Unlock the Potential of Swift Code Generation
rockname
0
550
生成AIを活用したレシート読み取り機能のアプリ開発の裏側 / AI Receipt Scan App Development
rockname
0
140
ゼロから理解するDependency Injection / Understanding Dependency Injection from the Ground Up
rockname
2
4.4k
サブスクリプション機能制御の設計における勘所
rockname
0
1.3k
Anatomy of Dynamic color
rockname
1
1.3k
キャッシュによる状態管理のアーキテクチャ / Cache-based state management architecture
rockname
10
21k
Optimistic Updatesで UXを向上させる / Improve UX with Optimistic Updates
rockname
2
1.6k
モバイルアプリのリストUIにおける 理想的なState表示について / The ideal state display in a mobile app list UI
rockname
6
2.2k
Other Decks in Programming
See All in Programming
AIを導入する前にやるべきこと
negima
2
370
次世代リンターで探る、tsgo 時代における型認識カスタムルールの現実解
ytakahashii
1
410
Migrations : C'est une question d'hygiène !
vinceamstoutz
0
680
関係性から理解する"同一性"の型用語たち
pvcresin
2
260
Agentic AI & UI: Arcitecture, HITL, Emerging Standards
manfredsteyer
PRO
0
120
AWSはOSSをどのように 考えているのか?
akihisaikeda
0
130
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
120
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
370
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
140
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
4
400
AI Agent と正しく分析するための環境作り
yoshyum
2
550
運転動画を検索可能にする〜Cosmos-Embed1とDatabricks Vector Searchで〜/cosmos-embed1-databricks-vector-search
studio_graph
3
970
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
150
Into the Great Unknown - MozCon
thekraken
41
2.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Prompt Engineering for Job Search
mfonobong
0
310
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Technical Leadership for Architectural Decision Making
baasie
3
370
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
740
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
[SF Ruby Conf 2025] Rails X
palkan
2
1k
Typedesign – Prime Four
hannesfritz
42
3k
Transcript
In-App Purchasesͷ ࣮લʹ͓͖͍ͬͯͨ ϋϚΓϙΠϯτ ΈͯͶͷMeetup #5 ܾࡁΛࢧ͑Δٕज़ 2019/05/20 גࣜձࣾϛΫγΟ ΈͯͶࣄۀ෦
ϩΫωϜ@rockname
ϩΫωϜ@rockname • גࣜձࣾϛΫγΟ 2018৽ଔೖࣾ • ՈΞϧόϜΈͯͶ • ΞϓϦ։ൃάϧʔϓ iOS(Swift, objc)
> Android(Kotlin, Java) == Rails(ruby) • झຯ: VTuberؑ • WWDC 2019 ࢀՃ͠·͢ ✈ ࣗݾհ
ΞδΣϯμ ͢͜ͱ • In-App PurchasesͱԿ͔ • ΈͯͶʹ͓͚ΔIn-App Purchasesͷେ·͔ͳ࣮ • In-App
PurchasesͰϋϚͬͨ͜ͱͱͦͷճආࡦ ͞ͳ͍͜ͱ • αʔόʔαΠυͷ࣮ • iOSͷࡉ͔͍࣮
In-App Purchasesͱʁ
In-App Purchases • iOSʹ͓͚ΔΞϓϦ՝ۚͷ໊শ • ΞϓϦͷػೳΛఏڙ͢Δࡍʹ༻ ͢Δඞཁ͕͋Δ • ࠷ۙApple͕αϒεΫϦϓγϣϯΛ ਪͯ͠Δײ͕͋͡Δ
ΞϓϦ՝͕ۚ ө͞ΕΔ·ͰͷྲྀΕ
1. AppStoreͷtransactionΛࢹ
2. ՝ۚΞΠςϜΛදࣔ
3. AppStoreͰߪೖॲཧ
4. ϨγʔτͷόϦσʔγϣϯ
ࣗಈߋ৽αϒεΫϦϓγϣϯ ͷ߹͞Βʹ…
ঢ়ଶߋ৽௨ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕ΓସΘͬͨ͜ͱΛ௨ "QQ4UPSF
ঢ়ଶߋ৽௨ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕ΓସΘͬͨ͜ͱΛ௨ αϒεΫϦϓγϣϯΛΩϟϯηϧ "QQ4UPSF
ঢ়ଶߋ৽௨ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕ΓସΘͬͨ͜ͱΛ௨ αϒεΫϦϓγϣϯΛΩϟϯηϧ 5ZQF$"/$&- "QQ4UPSF
ঢ়ଶߋ৽௨ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕ΓସΘͬͨ͜ͱΛ௨ αϒεΫϦϓγϣϯΛΩϟϯηϧ Ϣʔβʔσʔλͷߋ৽ 5ZQF$"/$&- "QQ4UPSF
ຊ
In-App Purchasesͷ࣮Ͱ ϋϚͬͨ5ͭͷপ
1. SandboxͰ͔͠ ߪೖͷಈ࡞֬ೝ͕Ͱ͖ͳ͍
ΞϓϦ՝ۚͷςετ • App Store ConnectͰSandboxςελʔ Λ࡞ • SandboxςελʔͰߪೖ͢Δ͜ͱͰ AppleͷςεταʔόʔͰϨγʔτ͕ॲཧ ͞ΕΔ
• SandboxڥͷϨγʔτ͕͍ग़͞ΕΔ
ΞϓϦ՝ۚͷਃ • ΞϓϦͷϨϏϡʔAppleͷ SandboxͰϨγʔτ͕ॲཧ ͞ΕΔ • ຊ൪Ͱॲཧ͞ΕΔͷΞϓϦ ΛϦϦʔε͔ͯ͠Β͚ͩ…
αʔόʔଆͰͷຊ൪Ϩγʔτ ॲཧͷಈ࡞֬ೝ͕Ͱ͖ͳ͍
ϓϩϞίʔυ
ϓϩϞʔγϣϯίʔυͱ • ਃͷ௨ͬͨΞϓϦͳͲΛެ։લͰ͢ Δ͜ͱ͕Ͱ͖Δ • ެࣜυΩϡϝϯτతʹʮજࡏސ٬Ϩ Ϗϡʔهࣄͷ࡞ऀͷͳͲϓϩϞʔ γϣϯͷͨΊͷ༻ʯ͕ఆ͞Ε͍ͯΔ
ϓϩϞʔγϣϯίʔυͷ͓͔͛Ͱ ແࣄʹϦϦʔεલʹຊ൪Ͱͷ ಈ࡞֬ೝ͕Ͱ͖ͨ
2. Ϩγʔτ͕ ͷ͘͘͢͝ͳΔ
SandboxςελʔͰಈ࡞֬ೝ͍ͯͨ͋͠Δ • Կ՝ࣦۚͯ͠ഊ͢Δ • αʔόʔʹೖͬͯϩάΛݟΔͱݪҼ͕Θ͔ͬͨ…
SandboxςελʔͰಈ࡞֬ೝ͍ͯͨ͋͠Δ • Կ՝ࣦۚͯ͠ഊ͢Δ • αʔόʔʹೖͬͯϩάΛݟΔͱݪҼ͕Θ͔ͬͨ…
ফܕϓϩμΫτҎ֎ͷ ϓϩμΫτߪೖใϨγʔτʹΓଓ͚Δ • ͭ ެࣜυΩϡϝϯτ w ফܕϓϩμΫτͷใɺࢧ͍͕ߦΘΕΔͱγʔτʹՃ͞Εɺ τϥϯβΫγϣϯΛऴྃ͢Δ·ͰϨγʔτ্ʹΓ·͢ɻτϥϯβΫ γϣϯͷऴྃޙɺ͜ͷใϨγʔτ͕࣍ʹߋ৽͞ΕΔͱ͖ɺͨͱ͑ Ϣʔβʔ͕࣍ʹߪೖΛߦͬͨͱ͖ʹআ͞Ε·͢ɻ
͜ΕҎ֎ͷछྨͷϓϩμΫτߪೖͷใɺࢧ͍͕ߦΘΕΔͱϨ γʔτʹՃ͞ΕɺϨγʔτʹΓଓ͚·͢ɻ • DBʹอଘ͢Δͱ͖ʹҰඞཁͦ͏
FYDMVEFPME USBOTBDUJPOT
Key: exclude-old-transactions • ϨγʔτͷόϦσʔγϣϯΛߦ͏ࡍʹ `exclude-old-transactions` Λࢦఆ͢Δ͜ͱͰ αϒεΫϦϓγϣϯͷ࠷৽ͷtransactionͷΈΛऔಘͰ͖Δʂʂʂ
3. υΩϡϝϯτʹͳ͍ Τϥʔίʔυ͕ฦͬͯ͘Δ
ΤϥʔϋϯυϦϯά • ΞϓϦͷ՝ۚʹࣦഊͨ͠߹ʹదͳΤϥʔϝοηʔδΛ Ϣʔβʔʹݟͤͯ͋͛Δඞཁ͕͋Δ • StoreKitͰͷΤϥʔίʔυ `SKErrorDomain` ͱͳΔ
ߪೖ్தͰͷΩϟϯηϧΤϥʔѻ͍ • ߪೖ్தग़ͯ͘ΔΞϥʔτͷΩϟϯηϧΛબ͢ΔͱɺͦΕΤ ϥʔͱͯ͠ྲྀΕͯ͘Δ • Τϥʔίʔυ `SKErrorDomain.paymentCancelled` ͱͳΔ • Ωϟϯηϧͷ߹͚ͩ
guard ͯ͋͛͠Δඞཁ͕͋Δ guard error.code != SKError.paymentCancelled.rawValue else { return }
෮ݩ్தͰͷΩϟϯηϧ…? • In-App PurchasesͰߪೖͨ͠ϓϩμΫτΛ෮ݩ͢ΔखஈΛఏڙ ͢Δඞཁ͕͋Δ (rejectҊ݅) • ͦͷࡍʹߦ͏ɺAppϨγʔτͷߋ৽ॲཧͷ్தग़ͯ͘ΔΞϥʔτ ͷΩϟϯηϧΛબ͢ΔͱɺͦΕΤϥʔͱͯ͠ྲྀΕͯ͘Δ •
Τϥʔίʔυ `SSErrorDomain` …
෮ݩ్தͰͷΩϟϯηϧ…? • In-App PurchasesͰߪೖͨ͠ϓϩμΫτΛ෮ݩ͢ΔखஈΛఏڙ ͢Δඞཁ͕͋Δ (rejectҊ݅) • ͦͷࡍʹߦ͏ɺAppϨγʔτͷߋ৽ॲཧͷ్தग़ͯ͘ΔΞϥʔτ ͷΩϟϯηϧΛબ͢Δͱ… •
Τϥʔίʔυ `SSErrorDomain` …
υΩϡϝϯτʹࡌͬͯΔ Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ Τϥʔίʔυ SSErrorDomain
υΩϡϝϯτʹࡌͬͯΔ Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ Τϥʔίʔυ SSErrorDomain
υΩϡϝϯτʹࡌͬͯΔ Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ Τϥʔίʔυ SSErrorDomain ͳΜ͔ͪΐͬͱҧ͏
SSErrorDomain • StoreKit෦Ͱൃੜ͢ΔΤϥʔͷίʔυ͕࿙ΕͨΑ͏ • Open Radar: https://openradar.appspot.com/25502597 • υΩϡϝϯτԽ͞Ε͍ͯͳ͍ͷͰϋϯυϦϯάͷ͠Α͏͕ͳ͍ •
ݱঢ়ΈͯͶͰͪ͜ΒͷΤϥʔίʔυguardจͰ return ͯ͠ ରॲ͍ͯ͠Δ
4. υΩϡϝϯτʹͳ͍ ௨λΠϓ͕ฦͬͯ͘Δ
͋ΔͷSlack • ϨγʔτॲཧपΓͷΤϥʔ͕ྲྀΕͯ͘ΔSlackͷνϟϯωϧʹͯ ෆԺͳϝοηʔδ͕දࣔ͞ΕΔ
͋ΔͷSlack • ϨγʔτॲཧपΓͷΤϥʔ͕ྲྀΕͯ͘ΔSlackͷνϟϯωϧʹͯ ෆԺͳϝοηʔδ͕දࣔ͞ΕΔ
͋ΔͷSlack
Ṗͷঢ়ଶߋ৽௨λΠϓ DID_CHANGE_RENEWAL_STATUS
࣍ͷͷSlack
Subscription Offers • iOS 12.2͔Βར༻ՄೳʹͳΔɺαϒεΫϦϓγϣϯΛղͨ͠Ϣʔβʔʹର͠ ͯఏڙͰ͖ΔDiscountͷ৽͍͠ϓϩϞʔγϣϯϓϥϯ • `DID_CHANGE_RENEWAL_STATUS` ͦΕʹਵͯ͠ఏڙ͞Εͨ৽͍͠௨ λΠϓ
• ΈͯͶهࣄެ։લʹ͜ͷ௨λΠϓͷଘࡏʹ͍ͭͯͬͨগͳ͍νʔϜ ࠓޙෆ༻ҙʹ৽͍͠௨λΠϓΛ͞ΕΔՄೳੑ͕͋ΔͷͰɺ ߟྀͯ͠αʔόʔαΠυ࣮͠Α͏
5. ਃͨ͠ߪೖΞΠςϜ औΓԼ͛Δ͜ͱ͕Ͱ͖ͳ͍
rejectͷόοϑΝͱͯ͠Ծਃ • Կճ͔reject͞ΕΔ͜ͱΛݟӽͯ͠ΈͯͶiOSΞϓϦΛ2݄Լ० ʹԾਃ͍ͯͨ͠ • ҊͷఆԿ͔ϦδΣΫτΛ͘Βͬͨ ❌ ͕ɺແࣄʹ৹͕ࠪ௨Δʂʂʂ
ޙ… • ϓϨϛΞϜެ։લʹόάϑΟοΫεͷࠩΛผϦϦʔεͱͯ͠ग़͢ ͜ͱʹ • ;ͱAppStoreΛͷ͍͍ͧͯΔͱ…
None
None
None
ϓϨϛΞϜ͕ϦϦʔε͞Ε͍ͯΔ
ΞϓϦ՝ۚͷਃ • ΞϓϦ՝ۚͷ࠷ॳͷਃରԠ͢Δipa(όΠφϦ)ʹඥ͚ͮͯਃ ͢Δඞཁ͕͋Δ • ࣍ճҎ߱ͷΞϓϦ՝ۚͷਃͦΕࣗͷΈͰՄೳ
Կ͕μϝͩͬͨʁ • ΞϓϦ՝ۚͷਃ࣌ʹAppStoreConnect্Ͱʮ৴Մೳʯͷ νΣοΫϘοΫεΛ unchecked ʹ͢Δ͖ͩͬͨʁ
ޙ͔Β֎ͤͳ͍ͷʁ • `disabled` ʹͳ͍ͬͯͯ֎ͤͳ͔ͬͨ • ެࣜυΩϡϝϯτతʹݖݶ͕͋Εૢ࡞Ͱ͖Δͣͳͷʹ • https://help.apple.com/app-store-connect/#/ dev360aba524 •
AppleʹԿ͍߹Θ͕ͤͨͪ͜Βͷ༧ظ͢ΔճಘΒΕͳ ͔ͬͨ…
Έͳ͞ΜؾΛ͚͍ͭͯͩ͘͞
WWDCͰ৭ʑฉ͍͖ͯ·͢ ✈
Thank you!!!