Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Back of First Screen AB test of Hatena Bookmark...
Search
Yutaro Muta
July 22, 2019
Programming
380
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
`t*(42&t>>10)`だけで音楽が鳴る、Swiftで実装するBytebeat / iOSDC Japan 2026
yutailang0119
0
200
WebKit::WebView Essentials / Sapporo.swift #1
yutailang0119
0
360
SwiftUI Inspectorが難しすぎる / Mobile Act OSAKA 18
yutailang0119
0
180
Google Nest CamとApple Vision frameworkと猫🐈🐈⬛ / onishi50
yutailang0119
0
450
Swift Concurrencyでのスケジュール処理を考える / Mobile Act OSAKA 17
yutailang0119
0
170
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
520
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
360
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
370
Apple Vision Pro購入RTA 1泊3日弾丸ハワイツアー / RTA: Purchase Apple Vision Pro in Hawaii
yutailang0119
0
1.6k
Other Decks in Programming
See All in Programming
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
1k
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.2k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
190
GraphQL の onError と Nullability のこれから
quramy
0
180
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
180
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
590
残高管理から台帳サービスへの進化
artoy
1
210
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
380
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
210
Seven New Principles of Software Engineering
yegor256
0
320
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
120
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Building Adaptive Systems
keathley
44
3.3k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Mobile First: as difficult as doing things right
swwweet
225
10k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
950
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
420
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
ラッコキーワード サービス紹介資料
rakko
4
5.5M
A Tale of Four Properties
chriscoyier
163
24k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
880
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
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