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
Androidアプリ内課金のテスト
Search
takuaraki
March 01, 2019
Technology
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Androidアプリ内課金のテスト
takuaraki
March 01, 2019
More Decks by takuaraki
See All by takuaraki
2021/02/03 発覚の COCOA Android版 不具合について
takuaraki
0
65
GASでSlackBot
takuaraki
1
570
Material Design Guideline: Dialogs, Dividers
takuaraki
0
450
Material Design Guideline: Bottom components
takuaraki
0
540
App Shortcuts
takuaraki
0
400
[関モバ#18] SQLBrite&SQLDelight
takuaraki
0
500
A/B testing GTM&GA vs Firebase
takuaraki
1
3k
【関モバ#12】Google Tag ManagerでモバイルアプリのABテストをする
takuaraki
1
690
Other Decks in Technology
See All in Technology
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.7k
35分でわかるEffective Platform Engineering
nwiizo
5
570
長期運営で肥大化したExcelマスターデータの解消に向けた移行事例
gree_tech
PRO
0
100
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
300
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.6k
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
670
【GCC2026】大規模言語モデルを活用した内製検索サービスの社内展開や業務活用
bandainamcostudios
PRO
0
390
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
6
1.5k
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
260
【GCC2026】TrueHDRIを用いたルックデブ環境とライティングテクニック
bandainamcostudios
PRO
0
150
コーチングの奥義 何もしないテクニック
jinwatanabe
0
140
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.4k
Featured
See All Featured
How to make the Groovebox
asonas
2
2.3k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
660
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Crafting Experiences
bethany
1
260
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
390
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
The Curious Case for Waylosing
cassininazir
1
470
Transcript
ΞϓϦ՝ۚͷςετ 2019/03/01 @ara_tack
ʢߥʣ !BSB@UBDL '63:6$PSQPSBUJPO
͜ͷൃදʹ͍ͭͯ • Androidͷ՝ۚͷجૅ • ՝ۚͷಓͷΓ • ্ख͘՝͕ۚͰ͖ͳ͍ͱ͖ʁ • Play StoreΛΘͣʹಈ࡞֬ೝ
(billingx) • ৄࡉͳ՝ۚͷ࣮ʹ͍ͭͯ͞ͳ͍
AndroidΞϓϦ՝ۚ Google Play ΞϓϦͱΓऔΓ͍ͯ͠Δ (PPHMF1MBZ "QQ .Z"QQ 8SBQQFS 1MBZ#JMMJOH-JCSBSZ *O"QQ#JMMJOH"1*
ߪೖͰ͖Δͷछྨ • One-time products: 1ճ͚ͩߪೖͰ͖Δ • Subscriptions: ఆظߪೖ
One-time products • 1ճ͚ͩߪೖͰ͖Δ • ΞΠςϜػೳΛߪೖ͢Δͷʹ͍͍ͯΔ
Subscriptions • ఆظߪೖΞΠςϜ • Ұఆظؒ͝ͱʹࢧ͍͕ൃੜ͢Δ • ձһαʔϏεͳͲʹΘΕΔ
՝ۚͷಓͷΓ • Developerొ • ΞϓϦΛPlay ConsoleʹΞοϓϩʔυ͢Δ • Play ConsoleͰΞΠςϜͷొΛ͢Δ
Developerొ • GoogleΞΧϯτΛ༻ҙ͢Δ • $25͏ • Google Play Console͕͑ΔΑ͏ʹͳΔ
ΞϓϦΛPlay Consoleʹ্͛Δ • ϦϦʔεϏϧυͷΞϓϦ͕ඞཁ • ূ໌ॻϦϦʔε࣌ͷͷΛར༻ • Billingͷύʔϛογϣϯ͕ඞཁ • ެ։͕ඞཁʢΫϩʔζ൛ͰΑ͍ʣ
ΞϓϦΛPlay Consoleʹ্͛Δ ςετ༻ͷΞϓϦʹ͍ͭͯ • ΞϓϦέʔγϣϯIDূ໌ॻΛϦϦʔε༻ͱ ߹ΘͤΔ • ςετ༻ͷผΞϓϦͱͯ͠Play Consoleʹ͋ ͛ΔͷOK
ΞϓϦΛPlay Consoleʹ্͛Δ // flavorDimensionsলུ productFlavors { product { applicationId =
APPLICATION_ID_PRODUCT } billingTest { applicationId = APPLICATION_ID_PRODUCT } develop { applicationId = APPLICATION_ID_STAGING } } sourceSets { // resΛςετܥͷͷʹ͢Δ!ςετܥͷAPIΛ͑ΔΑ͏ʹ͢Δ billingTest.res.srcDirs = ["src/develop/res"] }
ͷొΛ͢Δ
ͷొΛ͢Δ • ID: มߋෆՄ • λΠτϧͱઆ໌จɿมߋՄೳ • Ձ֨ɿมߋՄೳ • ٻରظؒɿSubscriptionsͷΈɻมߋෆՄɻि
ؒɺ݄ผɺ3͔݄ɺ6͔݄ɺؒ • εςʔλεɿ༗ޮʹ͢ΔͱআͰ͖ͳ͘ͳΔ
None
ςετΞΧϯτ • Google Play ConsoleͰςετΞΧϯτ͕ొ Ͱ͖Δ • ςετΞΧϯτͰແྉͰ՝ۚͰ͖Δ • ࣮ࡍͷPlay
StoreͰͷߪೖͱѻ͍Ұॹɻߪೖ ใಉ͡ɻஈͱߪಡظ͚͕ؒͩҟͳΔɻ
ςετΞΧϯτ Subscriptions ͷߪಡظؒ https://developer.android.com/google/play/billing/billing_testing ΑΓҾ༻
ςετΞΧϯτ
্ख͘՝͕ۚͰ͖ͳ͍ͱ͖ʁ • ΞϓϦʹBillingͷύʔϛογϣϯ͕ͳ͍ • Play Consoleʹ্͕͍ͬͯͳ͍ • ΞϓϦͷূ໌ॻ͕Play Consoleʹ্͍͛ͯΔͷͱ ҟͳΔ
• ͕༗ޮʹͳ͍ͬͯͳ͍ • σϕϩούʔΞΧϯτͳͷͰ՝ۚͰ͖ͳ͍
Play StoreΛΘͣʹςετ Play StoreͷϞοΫϨεϙϯεΛఏڙ͢Δ ϥΠϒϥϦ • pixiteapps/billingx • NYTimes/Register
billingx • Play Billing LibraryΛϞοΫԽͰ͖Δ • DebugBillingClientΛBillingClientͱͯ͠͏
billingx ༻ྫʣBillingClientFactoryΛ࡞ͬͯDI͢Δ // BillingClient ͷϑΝΫτϦΛఆٛ interface BillingClientFactory { fun createBillingClient(activity:
Activity, updateListener: PurchasesUpdatedListener): BillingClient }
billingx ༻ྫʣBillingClientFactoryΛ࡞ͬͯDI͢Δ // ຊ൪༻ Play Billing Library ͷ BillingClient Λฦ͢
class ReleaseBillingClientFactory : BillingClientFactory { override fun createBillingClient(activity: Activity, updateListener: PurchasesUpdatedListener): BillingClient { return BillingClient .newBuilder(activity) .setListener(updateListener) .build() } }
billingx ༻ྫʣBillingClientFactoryΛ࡞ͬͯDI͢Δ // σόοά༻ DebugBillingClient Λฦ͢ class DebugBillingClientFactory : BillingClientFactory
{ override fun createBillingClient(activity: Activity, updateListener: PurchasesUpdatedListener): BillingClient { initializeData(activity) return DebugBillingClient(activity, updateListener) } } private fun initializeData(activity: Activity) { // ϞοΫσʔλΛ४උʢ࣍εϥΠυࢀরʣ }
billingx ༻ྫʣBillingClientFactoryΛ࡞ͬͯDI͢Δ private fun initializeData(activity: Activity) { BillingStore.defaultStore(activity) .clearProducts() .addProduct(
SkuDetailsBuilder( sku = BillingManager.SKU_SUBS, type = BillingClient.SkuType.SUBS, price = "$9.99", priceAmountMicros = 9990000, priceCurrencyCode = "USD", title = "Premium Access", description = "Get all the super cool features.", subscriptionPeriod = "p1m", freeTrialPeriod = "p1w" ).build() ) }
billingx ༻ྫʣBillingClientFactoryΛ࡞ͬͯDI͢Δ @Module class BillingClientFactoryModule { @Provides fun provideBillingClientFactory(): BillingClientFactory
{ return if (BuildConfig.DEBUG) { DebugBillingClientFactory() } else { ReleaseBillingClientFactory() } } }
·ͱΊ • ՝ۚͷͨΊʹPlay Consoleͷઃఆ͕ඞཁ • ՝ۚςετ࣌ʹϋϚΓϙΠϯτ͕ଟ͍ • Play Storeແ͠Ͱಈ࡞֬ೝ͢Δํ๏͋Δ