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
0
1.7k
In-App Purchasesの 実装前に知っておきたい ハマりポイント / Points to be aware of when implementing In-App Purchases
rockname
May 20, 2019
Tweet
Share
More Decks by rockname
See All by rockname
ゼロから理解するDependency Injection / Understanding Dependency Injection from the Ground Up
rockname
2
3.4k
サブスクリプション機能制御の設計における勘所
rockname
0
900
Anatomy of Dynamic color
rockname
1
1.1k
キャッシュによる状態管理のアーキテクチャ / Cache-based state management architecture
rockname
10
19k
Optimistic Updatesで UXを向上させる / Improve UX with Optimistic Updates
rockname
3
1.2k
モバイルアプリのリストUIにおける 理想的なState表示について / The ideal state display in a mobile app list UI
rockname
7
1.7k
オンデバイスで学習可能になったCreate MLで画像分類器を作ってみた💪 / Developing an app to train an image classifier on iOS Device using Create ML
rockname
4
450
The practice of inclusive design -WWDC21-
rockname
1
1.1k
AndroidアプリでLine Heightを 設定するときに注意したいこと / Things to keep in mind when setting Line Height in your Android app
rockname
1
4.6k
Other Decks in Programming
See All in Programming
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
290
CSC509 Lecture 11
javiergs
PRO
0
180
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
受け取る人から提供する人になるということ
little_rubyist
0
230
Jakarta EE meets AI
ivargrimstad
0
160
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.4k
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
4
640
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.3k
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
KATA
mclloyd
29
14k
Bash Introduction
62gerente
608
210k
Docker and Python
trallard
40
3.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Automating Front-end Workflow
addyosmani
1366
200k
How GitHub (no longer) Works
holman
310
140k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
4 Signs Your Business is Dying
shpigford
180
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
Scaling GitHub
holman
458
140k
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!!!