Slide 1

Slide 1 text

Remote ConfigΛಋೖͯ͠ɺ Notifications͸ಋೖ͠·ͤΜͰͨ͠ɻ @wakwak3125 Otemachi Firebase #1

Slide 2

Slide 2 text

About me ɾࡔޱ ྒʢ͔͙ͪ͞ Γΐ͏ʣ ɾLang-8ͱ͍͏ձࣾͰಇ͍͍ͯ·͢ɻ ɾҰࡢ೥·ͰՈ۩԰ͷൢചһΛ͍ͯ͠·ͨ͠ ɾձࣾ΍TwitterͰ͸Θ͘Θ͘͞Μͱݺ͹Ε͍ͯ·͢

Slide 3

Slide 3 text

HiNativeʢϋΠωΠςΟϒʣ commitϝοηʔδΛఴ࡟ͯ͠΋Β͏ͷΦεεϝͰ͢

Slide 4

Slide 4 text

Agenda • What’s Remote Config • What’s Notifications • Remote Config, Pros/Cons • Notifications, Pros/Cons • Analytics with Remote Config

Slide 5

Slide 5 text

What’s Remote Config?

Slide 6

Slide 6 text

What’s Remote Config? • ΦϯϥΠϯ্Ͱઃఆͨ͠஋Λଈ࠲ʹΞϓϦʹಧ͚Δ ͜ͱ͕Ͱ͖Δπʔϧ • A/BςετͷͨΊʹ࢖ͬͯΈͨΓ • ηάϝϯτຖʹΞϓϦͷڍಈΛ͔͑ͨΓ • มߋΛΞϓϦͷΞοϓσʔτͳ͠ʹ൓өͤͨ͞Γ • ͋ΔػೳΛ༗ޮԽͨ͠ΓແޮԽͨ͠Γ

Slide 7

Slide 7 text

Chang the behavior by segments. • ಛఆͷϢʔβʔ͞ΜͷΈʹԿ͔Λද͍ࣔͤͨ͞ • ϨϏϡʔૌٻμΠΞϩά • ϔϏʔϢʔβʔ޲͚ͷ͝Ҋ಺

Slide 8

Slide 8 text

How to use Remote Config ?

Slide 9

Slide 9 text

Step1 Firebaseͷґଘؔ܎Λ௥Ճ // Add dependencies to app/build.gradle compile 'com.google.firebase:firebase-core:9.2.0' compile ‘com.google.firebase:firebase-config:9.2.0' // Create singleton Remote Config object remoteConfig = FirebaseRemoteConfig.getInstance() val configSettings = FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnable(BuildConfig.DEBUG).build() remoteConfig.setConfigSettings(configSettings)

Slide 10

Slide 10 text

Step2 σϑΥϧτ஋Λઃఆ // Create default parameter like this. res/xml/remote_config_default_params.xml show_review_dialog false // set default parameters by “setDefaults()” remoteConfig = FirebaseRemoteConfig.getInstance() remoteConfig.setDefaults(R.xml.remote_config_default_params)

Slide 11

Slide 11 text

Step3 ύϥϝʔλʔΛRemote ConfigαʔόʔʹConsole͔Β ઃఆ (Review targetʹ͍ͭͯ͸ޙड़)

Slide 12

Slide 12 text

Step4 αʔόʔ͔Β஋Λऔಘ // Fetch the parameter from server. override fun onPostResume() {
 super.onPostResume() // cacheExpireΛ։ൃ࣌͸0ʹ͢Δͱɺ஋ͷมߋͷ֬ೝΛ͠΍͘͢ͳΓ·͢ɻ val cacheExpire: Long = 3600L
 remoteConfig.fetch(cacheExpire)
 .addOnFailureListener({
 Log.d(TAG, "Failure")
 })
 .addOnSuccessListener ({ // औಘͨ͠ύϥϝʔλʔΛ༗ޮԽ͢Δɻ
 remoteConfig.activateFetched()
 })
 .addOnCompleteListener({
 Log.i(TAG, "Complete")
 })}

Slide 13

Slide 13 text

Step5 औಘͨ͠஋Λ࢖ͬͯԿ͔͢Δ // Fetch the parameter from server. // Ұ౓औಘͨ͠஋͸Ωϟογϡ͞ΕΔͷͰɺfetch͢Δඞཁ͸ͳ͍ɻ if (remoteConfig.getBoolean(“show_review_dialog”)) { showReviewDialog() }

Slide 14

Slide 14 text

Point • ެࣜͷυΩϡϝϯτʹ΋ॻ͍ͯ͋Γ·͕͢ɺdeveloper modeΛ༗ޮԽ͠ͳ͍ ͱɺfetchճ਺ʹ੍ݶ͕ઃఆ͞ΕΔͨΊɺඞͣ༗ޮԽ͠·͠ΐ͏ɻ • ஋ͷfetch͸εϓϥογϡ΍ɺॳճىಈ࣌ʹ·ͱΊͯऔಘ͓͖ͯ͠ɺऔಘՄ൱Λ ࣋ͬͯࠓޙ࠶౓fetch͢Δ͔Ͳ͏͔Λ൑அ͢Ε͹ྑ͍ͱࢥ͍·͢ɻ • ͦͯ͠fetch()͸Αࣦ͘ഊ͠·͢ɻ·ͨɺonCreateͰݺͿͱ͔ͳΓͷ֬཰Ͱࣦ ഊɺ·ͨ͸ηοτ͍ͯ͠ΔOnCompleteListener͕ݺ͹Ε·ͤΜͰͨ͠ɻ
 work around ͱͯ͠͸ onPostResumeͰfetchͯ͋͛͠Δ͜ͱͰྑͦ͞͏Ͱ͢ɻ • Ref: http://stackoverflow.com/questions/37501124/firebaseremoteconfig- fetch-does-not-trigger-oncompletelistener-every-time

Slide 15

Slide 15 text

What’s Notifications ?

Slide 16

Slide 16 text

What’s Notifications ? • FirebaseͷGROWηΫγϣϯʹҐஔ෇͚ΒΕ͍ͯΔλʔήςΟ ϯάՄೳͳϓογϡϝοηʔδ഑৴πʔϧ • ϓογϡ௨஌ͷ։෧཰ଌఆ • ϓογϡ௨஌։෧ޙͷίϯόʔδϣϯΠϕϯτͷଌఆ • ηάϝϯτ͝ͱʹ഑৴Մೳ • ΞϓϦͷར༻ଅਐʹͭͳ͕Δ • ϓογϡϝοηʔδૹΓϗʔμΠ

Slide 17

Slide 17 text

Versatile message targeting. • Analyticsͱͷ࿈ܞͰ͍ΖΜͳλʔήοτ޲͚ʹϓογϡΛ഑৴Ͱ͖·͢ɻ • ೔ຊޠֶशऀ޲͚ʹ೔ຊจԽʹؔ͢Δ໘നͦ͏ͳ࣭໰Λ഑৴ͨ͠Γ • αϒεΫϦϓγϣϯϓϥϯͷηʔϧΛʮҎલαϒεΫϦϓγϣϯొ࿥Λ ͍͕ͯͨ͠ղ໿ͯ͠͠·ͬͨਓʯʹ͓஌Βͤͨ͠Γ… • Console͔ΒखܰʹϓογϡϝοηʔδΛ࡞Δ͜ͱ͕Ͱ͖ΔͷͰɺඇ։ൃ ऀͷΞϧόΠτ͞Μʹ΋͓ئ͍͢Δ͜ͱ͕Ͱ͖Δɻ • Analytics࿈ܞͰͲΜͳϢʔβʔʹ΋഑৴Ͱ͖Δͳ͊ศརͦ͏ͩͳͱࢥͬͯ ಋೖ

Slide 18

Slide 18 text

͠Α͏ͱࢥ͍·͕ͨࣙ͠Ί·ͨ͠

Slide 19

Slide 19 text

Why…? • ΞϓϦ͕ϑΥΞάϥ΢ϯυͷ࣌͡Όͳ͍ͱɺConsoleͰ࡞ͬͨϓογϡ௨஌ͷΞ Πίϯ΍σʔλΛΧελϚΠζ͢Δ͜ͱ͕Ͱ͖ͳ͔ͬͨͨΊࣙΊͪΌ͍·ͨ͠… • ΞϓϦΛόοΫάϥ΢ϯυʹ͍ͯ͠Δਓୡ(જࡏతͳϢʔβʔ͞Μୡ)ΛΞϓϦ ʹ໭ͬͯͤ͜͞ΔͨΊʹ࢖͍͔͕ͨͬͨɺཁ݅Λຬͨ͢͜ͱ͕Ͱ͖ͳ͔ͬͨɻ • όοΫάϥ΢ϯυঢ়ଶͰ΋ɺΞϓϦΛىಈͤ͞Δ͚ͩ͸Ͱ͖Δ͕ɺͦΕͰ΋Ξ ΠίϯͷઃఆͳͲΛConsoleͰͰ͖ͳ͍ͷ͸͢͜͠ࠔΔͨΊɻ • ଞʹແྉͰྑ͍αʔϏεΛݟ͚ͭͨɻ • OneSignalͱ͍͏αʔϏε͕ߴػೳ͔ͭૹΓϗʔμΠͰྑ͔ͬͨͰ͢ɻ

Slide 20

Slide 20 text

Use Remote Config with Firebase Analytics !

Slide 21

Slide 21 text

Use Remote Config with Analytics • Remote Config͸͋͘·Ͱ΋ɺαʔόʔ͔Β஋Λओ มߋͨ͠Γ͢ΔͨΊ͚ͩͷπʔϧɻมߋޙͷӨڹ΍ ൓ԠΛݟΔͨΊʹ͸ूܭ࡞ۀ͕ඞཁɻͦ͜·Ͱ͸ Remote Config͚ͩͰ͸Ͱ͖·ͤΜɻ • ·ͨɺηάϝϯτΛߜͬͨมߋͷద༻౳΋୯ମͰ͸ Ͱ͖·ͤΜɻ

Slide 22

Slide 22 text

Set up(1/6) • ઌʹઆ໌͍ͯͨ͠ϨϏϡʔૌٻμΠΞϩάΛྫʹઆ ໌͍ͨ͠ͱࢥ͍·͢ɻ • ϨϏϡʔΛॻ͍ͯ΄͍͠ϢʔβʔͷଐੑΛܾΊΔɻ ྫ͑͹…(HiNativeͷ৔߹) • ࣭໰ճ਺͕10ճҎ্ͷϢʔβʔ͞Μʹରͯ͠Ϩ ϏϡʔૌٻΛߦ͍ͬͯ·͢ɻ

Slide 23

Slide 23 text

Set up(2/6) • ଐੑ͕ܾ·ͬͨΒɺ࣍͸ͦͷϢʔβʔଐੑΛ Analyticsʹઃఆͯ͋͛͠·͠ΐ͏ɻ • ࠓճ͸͜Μͳײ͡ʹͯ͠Έ·ͨ͠ɻ

Slide 24

Slide 24 text

Set up(3/6) • ઌ΄Ͳ࡞ͬͨϓϩύςΟΛݩʹΦʔσΟΤϯεΛ࡞ ੒͠·͢ɻ

Slide 25

Slide 25 text

Set up(4/6) ࠷ޙʹɺΞϓϦଆ͔ΒϢʔβʔϓϩύςΟΛૹ ৴͠·͢ɻ // ϨϏϡʔର৅Ϣʔβʔͷ࣭໰਺ͷ͖͍͠஋ // ͜͜ͷ஋΋ɺRemoteConfigͰઃఆ͓͚ͯ͠͹ɺϨϏϡʔର৅ʹ͢ΔϢʔβʔͷ࣭ ໰਺Λ͍ͭͰ΋ม͑Δ͜ͱ͕Ͱ͖·͢ɻ val threshold = 10 // numberOfQuestions͸ΞϓϦΛ࢖༻͍ͯ͠ΔϢʔβʔͷ࣭໰਺ val reviewTarget = (numberOfQuestions >= threshold).toString() // Firebase AnalyticsʹϢʔβʔϓϩύςΟΛૹ৴ firebaseAnalytics.setUserProperty(“review_target”, reviewTarget)

Slide 26

Slide 26 text

Set up(5/6) • Analyticsʹઃఆͨ͠ϓϩύςΟΛݩʹɺRemote Config ʹ৚݅Λ௥Ճ͠·͢ɻ

Slide 27

Slide 27 text

Set up(6/6) • Remote Configͷύϥϝʔλʔʹ৚݅Λద༻͠·͢ɻ
 ৚݅ͷ஋Λ௥Ճ -> Review targetΛબ୒

Slide 28

Slide 28 text

͕࣌ؒΞϨ͹࿩͢͜ͱ • Remote Config࢖ͬͯͯؾ͍ͮͨ͜ͱͱ͔ • A/Bςετ͸άϧʔϐϯάͳͲ͕Ͱ͖ͳ͍ͷͰɺҰ࿈ͷྲྀΕͳͲΛςετ͢Δ৔߹͸ͪΐͬͱ೉͕͋Δɻʢνϡʔ τϦΞϧͷҰ࿈ͷςΩετͷςετ౳ʣ • ύοͱࢥ͍͍ͭͨͷ͸ɺRemote Configͷ஋ʹ͸จࣈ਺ͷ੍ݶ͕΄΅΄΅ແ͍ͷͰɺJSONͳΜ͔ΛೖΕ͓͍ͯ ͯɺͦΕΛύʔεͯ͠࢖͏Α͏ʹ͢Ε͹ɺॊೈʹมߋ͔ͭάϧʔϐϯά͕Ͱ͖ΔΜ͡Όͳ͍͔ͳͱࢥ͍·ͨ͠ɻ • FirebaseશମΛ௨ͯ͠ࢥͬͨ͜ͱ • Lang-8ͷΑ͏ͳখن໛ͳձࣾ(5ਓن໛)ͱ͔ͩͱɺ͢΂ͯΛࣗࣾ։ൃͰಠࣗʹ΍͍ͬͯΔͱ͍͘Β͕࣌ؒ͋ͬͯ΋ ଍Γͳ͍ͷͰɺ͜͏͍ͬͨϫϯετοϓͰ͍Ζ͍ΖͰ͖Δπʔϧ͸ඇৗʹॿ͔Δͳ͊ͱ͍͏ҹ৅Ͱͨ͠ɻ • ͔͠΋ແྉɻ • ͍Ζ͍Ζফͤͳ͍ɻ • ௥Ճͨ͠ΞϓϦ͕ফͤͳ͍ • ௥Ճͨ͠ϓϩύςΟ΋ফͤͳ͍ • σϑΥϧτͰ༻ҙ͞Ε͍ͯΔ΋ͷ΋ফͤͳ͍ • ͱʹ͔͘ফͤͳ͍

Slide 29

Slide 29 text

͋Γ͕ͱ͏͍͟͝·ͨ͠