Slide 1

Slide 1 text

Firebase Remote ConfigͰ
 ΞϓϦͷΞοϓσʔτଅਐ Λ࣮૷͢Δ Otemachi Firebase #2

Slide 2

Slide 2 text

About Me Shinobu Okano @operandoOS Mercari, Inc. Souzoh, Inc.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

͓࿩͢ΔΞοϓσʔτଅਐͱ͸

Slide 5

Slide 5 text

Ξοϓσʔτଅਐ࣮૷ͯ͠Δਓʁ✋

Slide 6

Slide 6 text

Firebase Remote Config? Change the behavior and appearance of your app without publishing an app update. https://firebase.google.com/docs/remote-config/

Slide 7

Slide 7 text

Firebase Remote Config?

Slide 8

Slide 8 text

ͳͥFirebase Remote Configͳͷ͔ʁ • ୭Ͱ΋ΞοϓσʔτଅਐΛ഑৴͢Δ࡞ۀ͕Ͱ͖Δ • औΓԼ͛Δͷ΋ಉ༷ʹ • APIͷ࣮૷͕ͳͯ͘΋͍͍ • iOS͚ͩʹ௨஌Λग़͢ͱ͔OSผʹग़͠෼͚͕Ͱ͖Δ

Slide 9

Slide 9 text

ΞϓϦͷΞοϓσʔτଅਐʹ
 ඞཁͳ΋ͷ(Ұྫ)

Slide 10

Slide 10 text

μΠΞϩάͰΞοϓσʔτ಺༰ Λදࣔ͢Δ͜ͱΛ૝ఆ

Slide 11

Slide 11 text

μΠΞϩάͰΞοϓσʔτ಺༰ Λදࣔ͢Δ͜ͱΛ૝ఆ • Ξοϓσʔτର৅ͷΞϓϦͷόʔδϣϯ • ΞοϓσʔτଅਐΛग़͔͢ɺग़͞ͳ͍͔ • ΞοϓσʔτจݴͷλΠτϧ • Ξοϓσʔτจݴͷຊจ

Slide 12

Slide 12 text

ͲͷΑ͏ʹΞοϓσʔτଅਐͷ஋Λ
 Remote Configʹઃఆ͢Δ͔

Slide 13

Slide 13 text

JSON

Slide 14

Slide 14 text

ͲͷΑ͏ʹΞοϓσʔτଅਐͷ஋ ΛRemote Configʹઃఆ͢Δ͔ • Ξοϓσʔτଅਐͷ஋ΛJSONจࣈྻʹͯ͠ઃఆ • JSON͸minify͢Δ • ͦͷJSONΛΫϥΠΞϯτଆͰΑ͠ͳʹॲཧ͢Δ

Slide 15

Slide 15 text

JSONͷྫ { "update_application_version": 2, "is_show_update_notice": true, "update_title": "Ξοϓσʔτͷ͓஌Βͤ", "update_message": "Ξοϓσʔτ಺༰Λΰχϣΰχϣ…" }

Slide 16

Slide 16 text

Remote Configͷ஋ʹ͸
 ͲΕ͘Β͍ͷจࣈྻ͕ೖΔͷʁ The total length of parameter value strings within a project cannot exceed 500,000 characters. https://firebase.google.com/docs/remote-config/ parameters#limits_on_parameters_and_conditions

Slide 17

Slide 17 text

࣮૷͸ΘΓͱ؆୯ • Remote ConfigΛॳظԽ • Remote Config Serverͷ஋ΛfetchͰऔಘͯ͠ߋ৽ • Ξοϓσʔτଅਐͷ஋Λࢦఆͨ͠Key໊Ͱ಺༰Λऔಘ • Remote Config͔Βऔಘͨ͠஋ͷνΣοΫ • ஋ΛνΣοΫͯ͠ɺΞοϓσʔτଅਐΛग़͢ඞཁ͕͋Δͱ ൑அͨ͠Βग़͢

Slide 18

Slide 18 text

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RemoteConfig.init(this); RemoteConfig.updateConfig(this, task -> { RemoteConfig.getUpdateNoticeConfig(this) .filter(value -> !TextUtils.isEmpty(value)) .flatMap(UpdateNotice::parseJson) .filter(value -> getSharedPreferences("update_notice", Context.MODE_PRIVATE).getInt("showed_update_notice_version", 0) < value.updateApplicationVersion) .filter(value -> BuildConfig.VERSION_CODE < value.updateApplicationVersion) .ifPresent(this::showUpdateDialog); }); } private void showUpdateDialog(UpdateNotice updateNotice) { new AlertDialog.Builder(this) .setTitle(updateNotice.updateTitle) .setMessage(updateNotice.updateMessage) .setPositiveButton("Ξοϓσʔτ͢Δ", (dialogInterface, i) -> { IntentUtil.openGooglePlayAppDetails(this, getPackageName()); }) .setNegativeButton("ด͡Δ", (dialogInterface, i) -> { }) .show(); getSharedPreferences("update_notice", Context.MODE_PRIVATE) .edit() .putInt("showed_update_notice_version", updateNotice.updateApplicationVersion) .apply(); } }

Slide 19

Slide 19 text

Remote ConfigͷWrapper https://github.com/operando/ FirebaseRemoteConfigUpdateNotice/blob/ master/app/src/main/java/com/os/operando/ updatenotice/sample/RemoteConfig.java Remote ConfigͷLibraryͷ࢖͍ํ͸ҎԼࢀর

Slide 20

Slide 20 text

RemoteConfig.init(this); Remote ConfigΛॳظԽ

Slide 21

Slide 21 text

Remote Config Serverͷ஋Λ
 fetchͰऔಘͯ͠ߋ৽ RemoteConfig.updateConfig(this, task -> { // ͜͜ʹΰχϣΰχϣॻ͖·͢ });

Slide 22

Slide 22 text

Ξοϓσʔτଅਐͷ஋Λࢦఆ͠ ͨKey໊Ͱ಺༰Λऔಘ RemoteConfig.updateConfig(this, task -> { RemoteConfig.getUpdateNoticeConfig(this); });

Slide 23

Slide 23 text

Remote Config͔Βऔಘͨ͠
 ஋ͷνΣοΫ RemoteConfig.updateConfig(this, task -> { RemoteConfig.getUpdateNoticeConfig(this) .filter(value -> !TextUtils.isEmpty(value)) .flatMap(UpdateNotice::parseJson) .filter(v -> BuildConfig.VERSION_CODE < v.updateApplicationVersion); });

Slide 24

Slide 24 text

஋ΛνΣοΫͯ͠ɺΞοϓσʔτଅਐ Λग़͢ඞཁ͕͋Δͱ൑அͨ͠Βग़͢ RemoteConfig.updateConfig(this, task -> { RemoteConfig.getUpdateNoticeConfig(this) .filter(value -> !TextUtils.isEmpty(value)) .flatMap(UpdateNotice::parseJson) .filter(v -> BuildConfig.VERSION_CODE < v.updateApplicationVersion) .ifPresent(this::showUpdateDialog); });

Slide 25

Slide 25 text

ΞοϓσʔτଅਐͷμΠΞϩάදࣔ private void showUpdateDialog(UpdateNotice updateNotice) { new AlertDialog.Builder(this) .setTitle(updateNotice.updateTitle) .setMessage(updateNotice.updateMessage) .setPositiveButton("Ξοϓσʔτ͢Δ", (dialogInterface, i) -> { IntentUtil.openGooglePlayAppDetails(this, getPackageName()); }) .setNegativeButton("ด͡Δ", (dialogInterface, i) -> { }) .show(); }

Slide 26

Slide 26 text

Sample https://github.com/operando/ FirebaseRemoteConfigUpdateNotice

Slide 27

Slide 27 text

ӡ༻໘Ͱͷ՝୊ • Remote Configʹઃఆ͢Δ஋ͷJSONจࣈྻΛͲͷΑ͏ʹ࡞੒͢Δ͔ • ࡞੒༻ͷࡶͳπʔϧ࡞Δͱ͔ • Ξοϓσʔτͨ͠ΞϓϦʹ໰୊͕͋ͬͨ৔߹ɺ௨஌ͯ͠͠·ͬͨ
 ಺༰ΛऔΓԼ͛ͯ൓ө͞ΕΔ·Ͱͷ͕࣌ؒ͋Δ • Ξοϓσʔτͨ͠ΞϓϦʹ໰୊ͳ͍Ͷʂ͕Θ͔͔ͬͯΒ
 ੾Γସ͑Δ

Slide 28

Slide 28 text

ࢀߟ FirebaseͷRemoteConfigΛ༻͍ͯAndorid
 ΞϓϦͷΞοϓσʔτૌٻ௨஌Λग़͢ํ๏Λ
 ߟ͑ͯΈͨ http://qiita.com/masaibar/items/f32a788159f210abd262

Slide 29

Slide 29 text

Thanks!!