Slide 1

Slide 1 text

2019/07/22 @Google AdMob Japan Meetup #5 Yutaro Muta @yutailang0119 ͸ͯͳϒοΫϚʔΫiOSΞϓϦͷ First Screen A/Bςετͷཪଆ with Firebase A/B Testing

Slide 2

Slide 2 text

• Yutaro Muta @yutailang0119 • Hatena Co., Ltd. @Kyoto • Conference Staff • builderscon 2017, 2018 • try! Swift Tokyo 2019, 2020 • ࠷ۙͷਪ͠͸Combine framework Who am I ?

Slide 3

Slide 3 text

࿩͢͜ͱ • ͸ͯͳϒοΫϚʔΫͷiOSΞϓϦͰߦͬͨA/Bςετͷ֓ཁ • ্هʹ͓͚ΔFirebase A/B Testingͷ໾ׂ • ઃఆํ๏ • Tips

Slide 4

Slide 4 text

࿩͞ͳ͍͜ͱ • AdMobʹΑΔΞϓϦ಺޿ࠂ

Slide 5

Slide 5 text

͸ͯϒͷεϚϗΞϓϦΛ ࢖͍ͬͯΔਓʙ

Slide 6

Slide 6 text

͸ͯϒεϚϗΞϓϦ • https:b.hatena.ne.jp ͷεϚϗΞϓϦ • ίϝϯτ෇͖ͰϒοΫϚʔΫͰ͖Δ • ײ૝Λڞ༗Ͱ͖Δ • ࿩୊ͷϖʔδΛൃݟͰ͖Δ • iOS / Android

Slide 7

Slide 7 text

࠷ۙ͸ͯϒΞϓϦͷ ϗʔϜը໘͕มΘͬͨͳʔ ͱؾ͍ͮͨਓʙ

Slide 8

Slide 8 text

Before

Slide 9

Slide 9 text

After

Slide 10

Slide 10 text

Before After

Slide 11

Slide 11 text

Before After

Slide 12

Slide 12 text

มߋ఺ • First ScreenͰΧςΰϦຖͷਓؾʹ੾Γସ͑ΒΕΔ • ݩʑ͸૯߹ͷਓؾͱ৽ணͷΈ͕දࣔ͞Ε͍ͯͨ • ΧςΰϦͷฒͼॱ͸ɺ೚ҙʹฒͼସ͑ΒΕΔ

Slide 13

Slide 13 text

Ͱ΋ɺ First ScreenΛΤΠϠοͱ มߋ͢Δͷ͸ා͍ͳ͊

Slide 14

Slide 14 text

ͦ͜ͰA/Bςετ

Slide 15

Slide 15 text

A/BςετπʔϧʹٻΊͨ͜ͱ • [Must] A or Bͷ੾Γସ͑Λ֎෦ (ΞϓϦϦϦʔεαΠΫϧ֎) ͔Βߦ͑Δ • ঢ়ଶʹ߹Θͤͯը໘ଆΛ੾Γସ͑Δ • ςετதͷෆ۩߹΍݁Ռʹ໌Β͔ʹେ͖ͳ͕ࠩग़ͨࡍʹɺׂ߹Λมߋ • Ϗδωεతͳ͋Ε͜ΕʹରԠͰ͖ΔΑ͏ • [Better] ෼ੳπʔϧͱͷ૬ੑ΍ݕূͷ͠΍͢͞

Slide 16

Slide 16 text

Firebase A/B Testing

Slide 17

Slide 17 text

Firebase A/B Testing • ͢ͰʹFirebaseϓϥοτϑΥʔϜΛར༻͍ͯ͠Δͱɺಋೖίετ͕গͳ͍ • Google Analytics for Firebaseͱ࿈ܞ͕Մೳ • Remote Configͱͯ͠ѻ͏ͷͰɺखܰ

Slide 18

Slide 18 text

Firebase A/B Testingͷઃఆ

Slide 19

Slide 19 text

ઃఆελʔτ

Slide 20

Slide 20 text

λʔήοτͷઃఆ

Slide 21

Slide 21 text

λʔήοτͷઃఆ Analytics.logEvent(_:, parameters:) ͰૹΔΠϕϯτΛ࢖ͬͯɺ ಛఆͷૢ࡞Λͨ͠ϢʔβʔͷΈΛλʔήοτʹࢦఆՄೳ

Slide 22

Slide 22 text

໨ඪઃఆ

Slide 23

Slide 23 text

໨ඪઃఆ

Slide 24

Slide 24 text

όϦΞϯτͷઃఆ

Slide 25

Slide 25 text

ΞϓϦͷ࣮૷

Slide 26

Slide 26 text

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() }

Slide 27

Slide 27 text

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]())

Slide 28

Slide 28 text

ⷁ ⷂ

Slide 29

Slide 29 text

A/Bςετ։࢝

Slide 30

Slide 30 text

~͕࣌ྲྀΕͯ~

Slide 31

Slide 31 text

ςετ݁Ռ • ͓Αͦ1ϲ݄΄ͲͷςετΛ࣮ࢪͨ͠ • ςετ࣮ࢪલ͔Β΄΅૝ఆ௨Γͷظؒ • ৽ը໘ͷํ͕ɺچը໘ΑΓ΋ઃఆͨ͠ࢦඪʹ͓͍ͯ༏ҐͳࠩΛಘΒΕͨ • ࢦඪ͸ൿີ

Slide 32

Slide 32 text

ίϯιʔϧը໘

Slide 33

Slide 33 text

ςετ׬ྃ

Slide 34

Slide 34 text

ςετ݁ՌΛݩʹ... • ຬΛ࣋ͯ͠ɺ৽ը໘Λ100%ʹมߋ • AndroidͰ΋৽ը໘Λ࣮૷ɺϦϦʔε • ݁ՌɺAndroidͰ΋ྑ͍݁ՌΛಘΒΕͨ

Slide 35

Slide 35 text

A/B Testing Q&A

Slide 36

Slide 36 text

Q. ॳճىಈ࣌ʹ΋ A/BςετΛ൓ө͍ͨ͠

Slide 37

Slide 37 text

Q. ॳճىಈ࣌ʹ΋A/BςετΛ൓ө͍ͨ͠ • Remote Config͸ɺωοτϫʔΫ௨৴Λ௨ͯ͡ઃఆ஋Λऔಘ͢Δ • ॳճFetch࣌ʹ͸ઃఆ஋͸ແ͍ • ίʔυ্Ͱͷdefault஋͸༻ҙͰ͖Δ • (ಛʹ) First ScreenͷA/BςετͰ͸ɺ൓өλΠϛϯάʹ޻෉͕ඞཁʹͳΔ

Slide 38

Slide 38 text

ॳճFetchͷ޻෉Ҋ 1. Fetch͕׬ྃ͢Δ·Ͱɺը໘Λwait͢Δ Pros: ॳճ΋A/Bςετͷઃఆ஋Λ൓өͰ͖Δ Cons: ଴͕ͪ࣌ؒൃੜɺFetch͕ࣦഊͨ࣌͠͸Ͳ͏͢Δʁ 2. Fetch͕׬ྃͨ͠Βଈ࠲ʹ൓өͤ͞Δ -> ࠷ॳ͸default஋Ͱը໘Λදࣔ -> Fetchޙ͙͢ʹ RemoteConfig.activateFetched() -> ը໘ͷߋ৽ Pros: ࣮૷্ͷߟྀ఺͸গͳ͍ Cons: Ϣʔβʔ͸࢖༻தʹUI͕มߋ͞ΕΔͷͰɺڻ͔͘΋ 3. ࣍ճىಈ࣌·Ͱ଴ͭ -> ىಈ࣌ʹͷΈ RemoteConfig.activateFetched() Pros: ࣮૷্ͷߟྀ఺͸গͳ͍ Cons: 2ճ໨Ҏ߱ͷىಈʹͨͲΓண͚ͳ͍ͱɺςετͰ͖ͳ͍

Slide 39

Slide 39 text

Q. A/Bςετͷσόοά େม͡Όͳ͍ʁ

Slide 40

Slide 40 text

Q. A/Bςετͷσόοάେม͡Όͳ͍ʁ • betaϏϧυͰͷΈ Khan/SwiftTweaks Λ࢖͍ɺ੾Γସ͑Մೳʹͨ͠ • A/BςετҎ֎ʹ΋௨৴΍ͦͷଞઃఆͷ੾Γସ͑ɺσόοάʹ΋࢖͍ͬͯΔ

Slide 41

Slide 41 text

&OKPZ"#5FTUJOH 5IBOLT w NVUBZVUBSP!HNBJMDPN w IUUQTUXJUUFSDPNZVUBJMBOH w IUUQTHJUIVCDPNZVUBJMBOH