Mobiilikehitys Flutterilla · Oppitunti

Remote Config, ominaisuusliput ja vaiheistetut julkaisut

Ota ominaisuuksia käyttöön etänä ja julkaise muutokset asteittain lähettämättä sovellusta uudelleen tarkistettavaksi.

Oppitunti 4/413 vaihetta

Remote Config, ominaisuusliput ja vaiheistetut julkaisut on ilmainen Mobiilikehitys Flutterilla-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Mobiilikehitys Flutterilla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Mobiilikehitys Flutterilla-kurssilla on yhteensä 4 oppituntia.

Miksi etäkonfiguraatio

Sovelluskauppojen tarkistuskierrokset ovat hitaita. Jos ominaisuus julkaistaan rikkinäisenä, saatat joutua odottamaan päiviä, ennen kuin pikakorjaus saavuttaa käyttäjät. Etäkonfiguraatio erottaa koodin julkaisemisen sen käyttöönotosta.

  • Ominaisuusliput rajaavat koodipolkuja boolean-arvolla, jota hallitset palvelimelta.
  • Etäkonfiguraatio toimittaa säädettäviä arvoja (merkkijonoja, lukuja ja JSON-dataa) ilman uutta koontiversiota.
  • Vaiheistetut käyttöönotot altistavat kasvavan prosenttiosuuden käyttäjistä muutokselle.

Flutterissa yleinen työkalu on firebase_remote_config, mutta samat mallit pätevät myös LaunchDarklyyn, ConfigCatiin tai omaan taustajärjestelmääsi.

Lipin mallintaminen paikallisesti

Ennen minkään SDK:n kytkemistä mallinna lippusi tavallisena Dart-koodina, jotta muu sovellus ei koskaan käsittele raakoja merkkijonoja. Tyypitetty konfiguraatio-olio tekee oletusarvoista yksiselitteisiä ja helpottaa koodin testaamista.

Tämä on puhdasta Dartia järkevine oletusarvoineen — juuri se, mitä julkaiset, jos verkko ei ole käytettävissä.

class AppConfig {
  final bool newCheckoutEnabled;
  final int maxUploadMb;
  final String welcomeMessage;

  const AppConfig({
    this.newCheckoutEnabled = false,
    this.maxUploadMb = 10,
    this.welcomeMessage = 'Welcome!',
  });
}

void main() {
  const defaults = AppConfig();
  print('checkout: ${defaults.newCheckoutEnabled}');
  print('maxUploadMb: ${defaults.maxUploadMb}');
  print('welcome: ${defaults.welcomeMessage}');
}

Firebase Remote Configin määritys

Kun Firebase on alustettu, haet FirebaseRemoteConfig-singletonin, asetat sovelluksen sisäiset oletusarvot ja määrität noutamisen toiminnan RemoteConfigSettings-asetuksilla.

  • fetchTimeout rajoittaa noutamisen odotusaikaa.
  • minimumFetchInterval rajoittaa noutotiheyttä kiintiöiden noudattamiseksi. Käytä debug-tilassa pientä arvoa ja tuotannossa tuntien mittaista väliä.

Oletusarvot varmistavat, että sovellus toimii järkevästi ennen ensimmäistä onnistunutta noutoa.

import 'package:firebase_remote_config/firebase_remote_config.dart';

Future<FirebaseRemoteConfig> initRemoteConfig() async {
  final rc = FirebaseRemoteConfig.instance;

  await rc.setConfigSettings(RemoteConfigSettings(
    fetchTimeout: const Duration(seconds: 10),
    minimumFetchInterval: const Duration(hours: 6),
  ));

  await rc.setDefaults(const {
    'new_checkout_enabled': false,
    'max_upload_mb': 10,
    'welcome_message': 'Welcome!',
  });

  return rc;
}

Nouda ja aktivoi

Remote Config erottaa toisistaan noutamisen (arvojen lataamisen paikalliseen välimuistiin) ja aktivoinnin (noudettujen arvojen ottamisen käyttöön). Kätevä metodi fetchAndActivate() tekee molemmat ja palauttaa tiedon siitä, aktivoitiinko uusia arvoja.

Ympäröi kutsu aina virheenkäsittelyllä: verkkovirheen tulee palauttaa käyttöön viimeksi aktivoidut arvot tai sovelluksen sisäiset oletusarvot — käynnistyspolku ei saa koskaan kaatua.

Future<void> refreshConfig(FirebaseRemoteConfig rc) async {
  try {
    final updated = await rc.fetchAndActivate();
    if (updated) {
      // New values are now live; rebuild dependent UI.
      print('Remote config activated with new values');
    }
  } catch (e) {
    // Offline or quota hit: keep last-known-good values.
    print('Remote config fetch failed, using cached/defaults: $e');
  }
}

Tyypitettyjen arvojen lukeminen

Remote Config tallentaa kaiken sisäisesti merkkijonoina, mutta tarjoaa tyypitetyt hakumetodit: getBool, getInt, getDouble ja getString. Muunna ne takaisin AppConfig-olioksi, jotta muu sovellus säilyy tyypitettynä.

Keskitytä tämä muunnos yhteen paikkaan. Jos avaimen nimi muuttuu, korjaat sen vain kerran.

import 'package:firebase_remote_config/firebase_remote_config.dart';

AppConfig readConfig(FirebaseRemoteConfig rc) {
  return AppConfig(
    newCheckoutEnabled: rc.getBool('new_checkout_enabled'),
    maxUploadMb: rc.getInt('max_upload_mb'),
    welcomeMessage: rc.getString('welcome_message'),
  );
}

Käyttöliittymän rajaaminen lipulla

Ominaisuuslipun pitäisi suojata yhtä päätöspistettä. Lue se kerran widget-puun yläosassa (tai providerista) ja tee haarautuminen.

Pidä rajaaminen pinnallisena: haarauta lipun perusteella, älä syvällä liiketoimintalogiikan sisällä, jotta lipun myöhempi poistaminen on siisti poistotoimenpide.

Widget buildCheckout(BuildContext context, AppConfig config) {
  if (config.newCheckoutEnabled) {
    return const NewCheckoutScreen();
  }
  return const LegacyCheckoutScreen();
}

JSON-muotoisen konfiguraation jäsentäminen

Monipuolisempia tietosisältöjä varten tallenna JSON-merkkijono yhteen avaimeen ja pura se. Näin yksi lippu voi sisältää kokonaisen rakenteisen kokeilun — teemat, kynnysarvot ja järjestetyt luettelot — ilman kymmenten avainten lisäämistä.

Alla oleva itsenäinen Dart-esimerkki näyttää purku- ja varamallin, jota käyttäisit kutsulle rc.getString('promo_banner').

import 'dart:convert';

class PromoBanner {
  final String text;
  final int priority;
  PromoBanner(this.text, this.priority);
}

PromoBanner parsePromo(String raw) {
  try {
    final map = jsonDecode(raw) as Map<String, dynamic>;
    return PromoBanner(
      map['text'] as String? ?? '',
      map['priority'] as int? ?? 0,
    );
  } catch (_) {
    return PromoBanner('', 0); // malformed JSON -> safe default
  }
}

void main() {
  final ok = parsePromo('{"text":"Summer Sale","priority":5}');
  print('${ok.text} (${ok.priority})');
  final bad = parsePromo('not-json');
  print('fallback text empty: ${bad.text.isEmpty}');
}

Vaiheistettu käyttöönotto prosenttiosuuden perusteella

Vaiheistetussa käyttöönotossa ominaisuus otetaan käyttöön esimerkiksi yhdelle prosentille käyttäjistä, sitten kymmenelle, 50:lle ja lopulta kaikille — samalla seuraten kaatumis- ja mittarikoontinäyttöjä jokaisessa vaiheessa. Firebase Remote Config tekee tämän palvelinpuolella käyttämällä prosenttiehtoja, jotka perustuvat vakaaseen ja satunnaistettuun käyttäjäryhmään.

Keskeinen vaatimus on, että ryhmittelyn on oltava vakaa. Käyttöönottoon määrätyn käyttäjän on pysyttävä siinä istuntojen välillä, muuten käyttöliittymä välkkyy ja mittarit ovat merkityksettömiä.

Vakaa ryhmittely asiakaspuolella

Jos käytät Firebasen sijaan omaa taustajärjestelmääsi, toteutat ryhmittelyn asiakaspuolella. Hajauta vakaa käyttäjätunnus arvoksi välillä [0, 100) ja vertaa sitä käyttöönoton kynnysarvoon. Sama tunnus päätyy aina samaan ryhmään.

Tämä deterministinen hajautus on vaiheistettujen käyttöönottojen ja A/B-jakojen ydin.

int bucketOf(String userId) {
  // Simple stable hash -> 0..99
  var hash = 0;
  for (final code in userId.codeUnits) {
    hash = (hash * 31 + code) & 0x7fffffff;
  }
  return hash % 100;
}

bool isInRollout(String userId, int percent) {
  return bucketOf(userId) < percent;
}

void main() {
  const id = 'user-42';
  print('bucket: ${bucketOf(id)}');
  print('in 10% rollout: ${isInRollout(id, 10)}');
  print('stable on retry: ${bucketOf(id) == bucketOf(id)}');
}

Poiskytkentäkytkimet ja turvalliset oletusarvot

Arvokkain lippu on poiskytkentäkytkin: etäpalvelussa hallittava boolean-arvo, joka poistaa riskialttiin ominaisuuden välittömästi käytöstä ilman uutta julkaisua. Kaksi sääntöä tekee poiskytkentäkytkimistä luotettavia:

  • Turvallisen tilan on oltava oletus. Poiskytkentäkytkimen oletusarvon tulee olla false (ominaisuus pois käytöstä), jotta epäonnistunut nouto ei vahingossa ota riskialtista polkua käyttöön.
  • Lue lippu päätöspisteessä joka kerta, älä vain käynnistyksen yhteydessä, jotta muutos tulee voimaan seuraavan konfiguraation päivityksen yhteydessä.

Remote Configia käytettäessä ajoita päivitys sovelluksen palautuessa aktiiviseksi, jotta poiskytkentäkytkin välittyy yhden etualajakson aikana.

// Default OFF => a fetch failure leaves the risky feature disabled.
bool experimentalSyncEnabled(AppConfig config) {
  return config.newCheckoutEnabled; // example risky path
}

void onAppResumed(FirebaseRemoteConfig rc) {
  // Re-fetch so a flipped kill switch reaches the user quickly.
  refreshConfig(rc);
}

Reaaliaikaisten päivitysten kuunteleminen

Uudemmat Firebase Remote Config -versiot tukevat reaaliaikaisia päivityksiä: virtaa, joka laukeaa palvelimen julkaistessa uusia arvoja, joten seuraavaa ajoitettua noutoa ei tarvitse odottaa. Sinun on silti kutsuttava activate() niiden ottamiseksi käyttöön.

Käytä tätä poiskytkentäkytkimiin, joissa minuutit ovat tärkeitä. Yhdistä kuuntelija kutsuun setState/providerin invalidointiin, jotta vaikutuksen alaiset widgetit rakennetaan uudelleen.

import 'package:firebase_remote_config/firebase_remote_config.dart';

void subscribeToUpdates(FirebaseRemoteConfig rc, void Function() onChanged) {
  rc.onConfigUpdated.listen((event) async {
    await rc.activate();
    onChanged(); // e.g. trigger a UI rebuild
  });
}

Pikatarkistus

Testaa, miten hyvin ymmärrät turvallisen käyttöönoton suunnittelun.

Kertaus

Opit julkaisemaan ominaisuudet oletuksena pois käytöstä ja hallitsemaan niitä etänä:

  • Mallinna liput tyypitettynä AppConfig-oliona, jolla on yksiselitteiset oletusarvot.
  • Alusta Remote Config setDefaults-metodilla ja säädetyillä RemoteConfigSettings-asetuksilla ja kutsu sen jälkeen fetchAndActivate()-metodia virheet kestävästi.
  • Lue tyypitetyt arvot ja rajaa käyttöliittymä yhteen pinnalliseen päätöspisteeseen; välitä monipuoliset tietosisällöt JSON-merkkijonoina.
  • Toteuta vaiheistetut käyttöönotot vakaalla prosenttipohjaisella ryhmittelyllä, jotta käyttäjät pysyvät johdonmukaisesti joko mukana tai ulkopuolella.
  • Aseta jokaisen poiskytkentäkytkimen oletukseksi sen turvallinen tila ja käytä reaaliaikaisia päivityksiä sekä sovelluksen aktivoituessa tehtävää päivitystä, jotta muutokset välittyvät nopeasti.

Näin voit erottaa käyttöönoton julkaisusta ja reagoida häiriöihin ilman sovelluskaupan kautta tehtävää uutta julkaisukierrosta.

Aloita maksutta

Opi Dart tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
22
Oppitunnit
88

Usein kysytyt kysymykset

Onko oppitunti ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Mobiilikehitys Flutterilla-oppimispolun 3 oppituntia, myös oppitunnin “Remote Config, ominaisuusliput ja vaiheistetut julkaisut”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Mobiilikehitys Flutterilla-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut”?

Ota ominaisuuksia käyttöön etänä ja julkaise muutokset asteittain lähettämättä sovellusta uudelleen tarkistettavaksi. Harjoittelet Mobiilikehitys Flutterilla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Mobiilikehitys Flutterilla-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Mobiilikehitys Flutterilla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Mobiilikehitys Flutterilla-oppitunnilla?

Kyllä. Jokainen Mobiilikehitys Flutterilla-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Build-variantit ja ympäristöasetukset
  2. Automaattiset putket Fastlanella ja GitHub Actionsilla
  3. Kaatumisraportointi ja symboloidut pinojäljet
  4. Remote Config, ominaisuusliput ja vaiheistetut julkaisut
← Takaisin: Mobiilikehitys Flutterilla