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
Back of First Screen AB test of Hatena Bookmark...
Search
Yutaro Muta
July 22, 2019
Programming
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Back of First Screen AB test of Hatena Bookmark iOS app with Firebase AB Testing
https://google-admob-japan.connpass.com/event/138083/
Yutaro Muta
July 22, 2019
More Decks by Yutaro Muta
See All by Yutaro Muta
Google Nest CamとApple Vision frameworkと猫🐈🐈⬛ / onishi50
yutailang0119
0
190
SwiftUI Inspectorが難しすぎる / Mobile Act OSAKA 18
yutailang0119
0
120
Swift Concurrencyでのスケジュール処理を考える / Mobile Act OSAKA 17
yutailang0119
0
150
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
430
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
320
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
340
Apple Vision Pro購入RTA 1泊3日弾丸ハワイツアー / RTA: Purchase Apple Vision Pro in Hawaii
yutailang0119
0
1.6k
個人開発のたのしみ / Enjoying personal development
yutailang0119
0
1.1k
バックポートして学ぶ新APIの仕組み
yutailang0119
0
3.4k
Other Decks in Programming
See All in Programming
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
180
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
スマートグラスで並列バイブコーディング
hyshu
0
120
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
210
A2UI という光を覗いてみる
satohjohn
1
130
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
New "Type" system on PicoRuby
pocke
1
830
Contextとはなにか
chiroruxx
1
290
OSもどきOS
arkw
0
530
The NotImplementedError Problem in Ruby
koic
1
710
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.7k
Accessibility Awareness
sabderemane
1
140
For a Future-Friendly Web
brad_frost
183
10k
A better future with KSS
kneath
240
18k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Rails Girls Zürich Keynote
gr2m
96
14k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Building AI with AI
inesmontani
PRO
1
1.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Documentation Writing (for coders)
carmenintech
77
5.4k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Transcript
2019/07/22 @Google AdMob Japan Meetup #5 Yutaro Muta @yutailang0119 ͯͳϒοΫϚʔΫiOSΞϓϦͷ
First Screen A/Bςετͷཪଆ with Firebase A/B Testing
• Yutaro Muta @yutailang0119 • Hatena Co., Ltd. @Kyoto •
Conference Staff • builderscon 2017, 2018 • try! Swift Tokyo 2019, 2020 • ࠷ۙͷਪ͠Combine framework Who am I ?
͢͜ͱ • ͯͳϒοΫϚʔΫͷiOSΞϓϦͰߦͬͨA/Bςετͷ֓ཁ • ্هʹ͓͚ΔFirebase A/B Testingͷׂ • ઃఆํ๏ •
Tips
͞ͳ͍͜ͱ • AdMobʹΑΔΞϓϦࠂ
ͯϒͷεϚϗΞϓϦΛ ͍ͬͯΔਓʙ
ͯϒεϚϗΞϓϦ • https:b.hatena.ne.jp ͷεϚϗΞϓϦ • ίϝϯτ͖ͰϒοΫϚʔΫͰ͖Δ • ײΛڞ༗Ͱ͖Δ • ͷϖʔδΛൃݟͰ͖Δ
• iOS / Android
࠷ۙͯϒΞϓϦͷ ϗʔϜը໘͕มΘͬͨͳʔ ͱؾ͍ͮͨਓʙ
Before
After
Before After
Before After
มߋ • First ScreenͰΧςΰϦຖͷਓؾʹΓସ͑ΒΕΔ • ݩʑ૯߹ͷਓؾͱ৽ணͷΈ͕දࣔ͞Ε͍ͯͨ • ΧςΰϦͷฒͼॱɺҙʹฒͼସ͑ΒΕΔ
Ͱɺ First ScreenΛΤΠϠοͱ มߋ͢Δͷා͍ͳ͊
ͦ͜ͰA/Bςετ
A/BςετπʔϧʹٻΊͨ͜ͱ • [Must] A or BͷΓସ͑Λ֎෦ (ΞϓϦϦϦʔεαΠΫϧ֎) ͔Βߦ͑Δ • ঢ়ଶʹ߹Θͤͯը໘ଆΛΓସ͑Δ
• ςετதͷෆ۩߹݁Ռʹ໌Β͔ʹେ͖ͳ͕ࠩग़ͨࡍʹɺׂ߹Λมߋ • Ϗδωεతͳ͋Ε͜ΕʹରԠͰ͖ΔΑ͏ • [Better] ੳπʔϧͱͷ૬ੑݕূͷ͢͠͞
Firebase A/B Testing
Firebase A/B Testing • ͢ͰʹFirebaseϓϥοτϑΥʔϜΛར༻͍ͯ͠Δͱɺಋೖίετ͕গͳ͍ • Google Analytics for Firebaseͱ࿈ܞ͕Մೳ
• Remote Configͱͯ͠ѻ͏ͷͰɺखܰ
Firebase A/B Testingͷઃఆ
ઃఆελʔτ
λʔήοτͷઃఆ
λʔήοτͷઃఆ Analytics.logEvent(_:, parameters:) ͰૹΔΠϕϯτΛͬͯɺ ಛఆͷૢ࡞Λͨ͠ϢʔβʔͷΈΛλʔήοτʹࢦఆՄೳ
ඪઃఆ
ඪઃఆ
όϦΞϯτͷઃఆ
ΞϓϦͷ࣮
Remote Config͔ΒΛऔಘ // Fetch from Remote Config func fetch() {
let expiration: TimeInterval = (60 * 60 * 3) remoteConfig.fetch(withExpirationDuration: expiration, completionHandler: nil) } // Activate fetched Remote Config settings func activateFetched() { remoteConfig.activateFetched() }
Remote ConfigͰऔಘͨ͠ઃఆ͔Βը໘Λग़͚͠Δ let viewController: UIViewController switch remoteConfig.viewSetting { case .a:
viewController = AViewController() case .b: viewController = BViewController() } // Add to ContainerView viewController.view.translatesAutoresizingMaskIntoConstraints = false addChild(viewController) containerViewController.addSubview(viewController.view) viewController.didMove(toParent: self) NSLayoutConstraint.activate([NSLayoutConstraint]) // Switch ViewController by Remote Config let viewController: UIViewController switch remoteConfig { case .a: viewController = AViewController() case .b: viewController = BViewController() default: viewController = DefaultViewController() } // Add to ContainerView viewController.view.translatesAutoresizingMaskIntoConstraints = false addChild(viewController) containerViewController.addSubview(viewController.view) viewController.didMove(toParent: self) NSLayoutConstraint.activate([NSLayoutConstraint]())
ⷁ ⷂ
A/Bςετ։࢝
~͕࣌ྲྀΕͯ~
ςετ݁Ռ • ͓Αͦ1ϲ݄΄ͲͷςετΛ࣮ࢪͨ͠ • ςετ࣮ࢪલ͔Β΄΅ఆ௨Γͷظؒ • ৽ը໘ͷํ͕ɺچը໘ΑΓઃఆͨ͠ࢦඪʹ͓͍ͯ༏ҐͳࠩΛಘΒΕͨ • ࢦඪൿີ
ίϯιʔϧը໘
ςετྃ
ςετ݁ՌΛݩʹ... • ຬΛ࣋ͯ͠ɺ৽ը໘Λ100%ʹมߋ • AndroidͰ৽ը໘Λ࣮ɺϦϦʔε • ݁ՌɺAndroidͰྑ͍݁ՌΛಘΒΕͨ
A/B Testing Q&A
Q. ॳճىಈ࣌ʹ A/BςετΛө͍ͨ͠
Q. ॳճىಈ࣌ʹA/BςετΛө͍ͨ͠ • Remote ConfigɺωοτϫʔΫ௨৴Λ௨ͯ͡ઃఆΛऔಘ͢Δ • ॳճFetch࣌ʹઃఆແ͍ • ίʔυ্Ͱͷdefault༻ҙͰ͖Δ •
(ಛʹ) First ScreenͷA/BςετͰɺөλΠϛϯάʹ͕ඞཁʹͳΔ
ॳճFetchͷҊ 1. Fetch͕ྃ͢Δ·Ͱɺը໘Λwait͢Δ Pros: ॳճA/BςετͷઃఆΛөͰ͖Δ Cons: ͕ͪ࣌ؒൃੜɺFetch͕ࣦഊͨ࣌͠Ͳ͏͢Δʁ 2. Fetch͕ྃͨ͠Βଈ࠲ʹөͤ͞Δ ->
࠷ॳdefaultͰը໘Λදࣔ -> Fetchޙ͙͢ʹ RemoteConfig.activateFetched() -> ը໘ͷߋ৽ Pros: ্࣮ͷߟྀগͳ͍ Cons: Ϣʔβʔ༻தʹUI͕มߋ͞ΕΔͷͰɺڻ͔͘ 3. ࣍ճىಈ࣌·Ͱͭ -> ىಈ࣌ʹͷΈ RemoteConfig.activateFetched() Pros: ্࣮ͷߟྀগͳ͍ Cons: 2ճҎ߱ͷىಈʹͨͲΓண͚ͳ͍ͱɺςετͰ͖ͳ͍
Q. A/Bςετͷσόοά େม͡Όͳ͍ʁ
Q. A/Bςετͷσόοάେม͡Όͳ͍ʁ • betaϏϧυͰͷΈ Khan/SwiftTweaks Λ͍ɺΓସ͑Մೳʹͨ͠ • A/BςετҎ֎ʹ௨৴ͦͷଞઃఆͷΓସ͑ɺσόοάʹ͍ͬͯΔ
&OKPZ"#5FTUJOH 5IBOLT w NVUBZVUBSP!HNBJMDPN w IUUQTUXJUUFSDPNZVUBJMBOH w IUUQTHJUIVCDPNZVUBJMBOH