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
370
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
110
WebKit::WebView Essentials / Sapporo.swift #1
yutailang0119
0
270
SwiftUI Inspectorが難しすぎる / Mobile Act OSAKA 18
yutailang0119
0
160
Google Nest CamとApple Vision frameworkと猫🐈🐈⬛ / onishi50
yutailang0119
0
420
Swift Concurrencyでのスケジュール処理を考える / Mobile Act OSAKA 17
yutailang0119
0
170
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
500
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
360
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
360
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
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
400
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
120
Are APIs Still Relevant in the AI Era?
soyuka
0
260
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
150
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
150
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
wkhtmltopdfの次どうするか問題2026
willnet
2
1.4k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
170
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
440
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
150
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
730
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
Test your architecture with Archunit
thirion
2
2.4k
Become a Pro
speakerdeck
PRO
31
6.3k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Deep Space Network (abreviated)
tonyrice
0
310
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Embracing the Ebb and Flow
colly
88
5.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