Salta al contenuto principale

Strategie efficaci per le notifiche di aggiornamento app

Implementa una notifica di aggiornamento app robusta per Capacitor ed Electron. Scopri i pattern UX, Capgo, aggiornamenti silent/forced e le strategie CI/CD.

Strategie efficaci per le notifiche di aggiornamento app Capgo illustrazione blog

Hai rilasciato un hotfix venerdì. Lunedì, il supporto continua a ricevere segnalazioni da utenti che non l’hanno ricevuto, i beta tester sono bloccati su un bundle obsoleto e un cliente enterprise vuole sapere esattamente quale versione sta usando il suo team sul campo. È il momento in cui diventa chiaro che un notifica di aggiornamento dell'app non è un modale. È un sistema operativo per il controllo dei rilasci.

Nei progetti Capacitor ed Electron, la parte difficile di solito non è rilevare che un aggiornamento esiste. La parte difficile è tutto ciò che lo circonda: decidere chi dovrebbe vederlo, quando, cosa succede se lo ignorano, come l'aggiornamento si muove attraverso CI/CD e cosa ti dice la telemetria dopo il rollout. Se tratti i prompt di aggiornamento come un semplice ornamento UI, ottieni notifiche invasive, logica di release fragile e utenti confusi. Se li consideri parte del ciclo di vita del prodotto, ottieni rollout più sicuri e una coda di supporto molto più tranquilla.

Indice dei contenuti

Perché la tua strategia di aggiornamento conta

Gli aggiornamenti influenzano la retention, non solo la manutenzione

I team spesso considerano gli aggiornamenti come un compito di manutenzione. Correggi il bug, avvisa l'utente, passa oltre. Questa mentalità ignora l'impatto sul prodotto.

Le push notification sono uno dei pochi canali di lifecycle in grado di riportare gli utenti nell'app dopo l'installazione. I dati riassunti da la ricerca di Invesp sulle push notification mobili dimostrano che le notifiche push possono aumentare l'engagement dell'app del 88%, e gli utenti che opt-in sono trattenuti a un tasso quasi 2x rispetto a chi non lo fa. Per la strategia di aggiornamento, questo conta perché ogni client obsoleto è un utente che potrebbe non vedere mai la feature, la fix o il cambio di compliance appena rilasciato.

Un flusso di aggiornamento debole crea solitamente tre problemi contemporaneamente:

  • Product lag means new features launch unevenly, so PMs read mixed signals from analytics.
  • Carico sul supporto si manifesta quando gli agenti devono chiedere screenshot, versioni e dettagli del dispositivo prima ancora di poter riprodurre un problema.
  • Esposizione alla sicurezza cresce quando i client obsoleti continuano a comunicare con API che sono già evolute.

Regola pratica: considera la distribuzione degli aggiornamenti come parte del release management, non come un messaggio di cortesia alla fine dello sprint.

Gli aggiornamenti dello store e i live update risolvono problemi diversi

Gli aggiornamenti di App Store e Play Store sono ancora importanti. Le modifiche alle dipendenze native, i rilasci guidati dalle policy, i cambi di permessi e le correzioni a livello binario appartengono a questo ambito. Ma gli aggiornamenti guidati dallo store sono solo un livello del sistema e sono lenti per progettazione, perché la revisione e l'adozione da parte degli utenti sono al di fuori del tuo controllo diretto.

Per le app Capacitor ed Electron, i live update coprono una categoria diversa di lavoro. Sono adatti a modifiche del web bundle come JavaScript, CSS, testi, asset e feature flag che non richiedono un nuovo binario. In pratica, questo significa che puoi separare due domande di rilascio:

Domanda sul rilascio Consigliato
Questa modifica richiede un nuovo binario nativo? Rilascio sugli store
Questa modifica può essere distribuita in sicurezza come web bundle? Live update
Gli utenti devono essere informati prima di procedere? Decisione sulla notifica in-app
Serve subito solo ad alcuni utenti? Rollout basato su channel

Questa distinzione è il motivo per cui le agenzie che sviluppano app per i clienti dovrebbero smettere di progettare tutto intorno a un singolo pop-up di "aggiornamento disponibile". I team professionali hanno bisogno di soft prompt, percorsi di applicazione silenziosa, regole di rollback, targeting dei channel e log che il supporto possa consultare in seguito.

Anche la fiducia conta. Agli utenti gli aggiornamenti danno molto meno fastidio delle interruzioni imprevedibili. Se l'app si aggiorna senza intoppi, spiega con chiarezza i cambiamenti importanti e blocca l'uso solo in caso di problemi reali o rischi per la sicurezza, le persone lo interpretano come competenza.

Implementare l'Update Detection con Capgo

Il primo compito è semplice: sapere quale versione sta usando l'utente, a quale channel appartiene e decidere se c'è qualcosa da scaricare. La maggior parte dei sistemi di aggiornamento fai-da-te diventa un caos perché mescola queste decisioni. Tienile separate.

Screenshot da https://capgo.app/blog/building-a-native-mobile-app-with-nextjs-and-capacitor/

Parti dalla consapevolezza della versione

Un updater affidabile richiede tre valori disponibili a runtime:

  1. Versione dell'app installata
  2. Canale di rilascio assegnato
  3. Stato attuale dell'update, come idle, checking, available, downloading, ready, failed

Se salti quel modello di stato, i bug nelle notifiche emergono in fretta. L'app fa check troppo spesso. Lo stesso prompt appare a ogni avvio. Un download in background termina, ma la UI continua a dire “checking”.

Un servizio gestito è di solito la scelta giusta qui per un motivo: il lavoro operativo è più pesante di quanto suggerisca lo snippet code. Servono bundle firmati, regole per i canali, supporto al rollback, storico delle versioni, log a livello di dispositivo e infrastruttura di delivery. Capgo fornisce tutto questo per Capacitor e app Electron tramite un plugin di aggiornamento e un workflow di distribuzione hostato, motivo per cui la maggior parte dei team client fa meglio a usarlo piuttosto che ricostruire lo stack internamente.

Integra l'updater nell'avvio dell'app

All'avvio dell'app, esegui un controllo leggero dopo che il shell è pronto. Non bloccare il primo render a meno che l'app non possa continuare senza l'aggiornamento.

Un pattern tipico in un'app Capacitor è questo:

import { App } from '@capacitor/app'
// import your updater SDK here

type UpdateDecision =
  | { kind: 'none' }
  | { kind: 'soft'; version: string }
  | { kind: 'hard'; version: string }
  | { kind: 'silent'; version: string }

async function checkForUpdate(): Promise<UpdateDecision> {
  try {
    // Replace with your updater SDK call
    const result = await updater.check()

    if (!result || !result.available) {
      return { kind: 'none' }
    }

    if (result.metadata?.mandatory === true) {
      return { kind: 'hard', version: result.version }
    }

    if (result.metadata?.silent === true) {
      return { kind: 'silent', version: result.version }
    }

    return { kind: 'soft', version: result.version }
  } catch {
    return { kind: 'none' }
  }
}

App.addListener('appStateChange', async ({ isActive }) => {
  if (!isActive) return
  const decision = await checkForUpdate()
  handleUpdateDecision(decision)
})

Il punto di check() non è solo "c'è una versione più recente". È "c'è una versione più recente per questo utente sul questo canale, e come dovrebbe reagire l'app a ciò".

Un'implementazione sana memorizza anche l'ultimo controllo riuscito e l'ultima versione proposta. Questo mantiene la logica di notifica degli aggiornamenti dell'app idempotente invece di essere invadente.

Leggi il risultato e ramifica presto

La branch deve avvenire il più vicino possibile al risultato del check. Non disperdere le regole di aggiornamento tra le schermate.

Ecco la suddivisione pratica che uso:

  • No update significa non fare nulla e registrare un normale risultato del check.
  • Aggiornamento soft significa mettere in coda un banner, un badge nelle impostazioni o un prompt in-app leggero.
  • Update silenzioso significa scaricare in background e attivare al prossimo avvio.
  • Aggiornamento hard significa passare l'app in un flusso di blocco controllato.

Più avanti nell'implementazione, preferisco esporre quella decisione tramite un unico store centrale, così React, Vue o Ionic UI possono consumarla in modo coerente.

Questa guida è utile se vuoi vedere la configurazione più ampia attorno a un'app Capacitor:

Mantieni il layer di rilevamento noioso. L'ingegno sta nella policy di rollout, non nell'avvio code.

Progettare pattern di notifica efficaci

La maggior parte dei prompt di aggiornamento fallisce perché il team sceglie un unico pattern e lo usa per tutto. Così finisci per mostrare un modale bloccante per una modifica al testo, o nascondere una migrazione critica dietro un toast che nessuno nota.

L'ambiente è già affollato. Riepilogo del benchmark Airship di Business of Apps riporta che l'utente medio di smartphone negli Stati Uniti riceve 46 notifiche push al giorno, mentre le medie di reazione e click-through restano modeste, rispettivamente 3,4% su iOS e 4,6% su Android. Una notifica di aggiornamento app deve conquistare l'attenzione senza stancare l'utente.

Infografica con tre pattern efficaci per le notifiche di aggiornamento delle app mobili: banner, finestra di dialogo modale e messaggio in-app.

Usa il pattern meno invasivo che funzioni comunque

Una buona UI di aggiornamento rispetta il costo dell'interruzione. Se l'utente sta inserendo i dati di pagamento, registrando una nota clinica o scansionando l'inventario, una modale può essere peggio del bug che stai cercando di risolvere.

Di solito mappo i pattern in questo modo:

  • Banner in alto o in basso per fix minori, miglioramenti a bassa urgenza e conferma degli aggiornamenti silenziosi.
  • Toast per lo stato in background, come "Aggiornamento pronto al prossimo avvio", ma non per decisioni importanti.
  • Punto di accesso nelle Impostazioni o nel Profilo per gli utenti che vogliono controllo e visibilità del changelog.
  • Modale bloccante solo quando l'app non può continuare in sicurezza sulla vecchia versione.

Un banner discreto spesso fa più lavoro di un modale drammatico, perché non costringe l'utente a lottare con l'interfaccia.

Un rapido confronto dei principali pattern

Pattern Ideale per Main risk Nota di implementazione
Banner Optional updates, low urgency nudges Facile da ignorare Persisti la chiusura per versione
Toast Cambiamenti di stato in background Scompare troppo in fretta Associa a un'impostazione persistente
Messaggio in-app Rollout contestuale delle funzionalità Potrebbe non essere visto subito Collegalo a uno screen pertinente
Modale Azione obbligatoria Frustrazione dell'utente Riservato solo a hard gate

Il dettaglio di implementazione più importante è persistenza dello stato. Se un utente tocca “Più tardi”, associa questa scelta alla versione offerta. Se ignora un banner, non mostrarlo di nuovo a ogni cambio di rotta. Se dimentichi questo, gli utenti percepiranno l'app come rotta, anche se l'updater funziona.

Per i team che usano già le push nel loro stack di lifecycle, vale la pena confrontare l'UX degli aggiornamenti app con il setup di messaging più ampio. La guida di Capgo a le notifiche push di Ionic e Capacitor con Firebase è utile qui perché aiuta a separare gli aspetti del trasporto dalle superfici in-app che chiedono all'utente di agire.

Il push è solo una parte della storia

Un errore comune è pensare che i badge di aggiornamento del sistema operativo e le notifiche degli store siano sufficienti. In realtà, gli utenti spesso non li notano a causa delle impostazioni del dispositivo, dei permessi per i badge, del comportamento degli aggiornamenti automatici o delle modalità di risparmio energetico. Ecco perché il messaging in-app resta fondamentale anche quando l'ecosistema degli store funziona correttamente.

Per Electron, questo è ancora più evidente. Gli utenti desktop si aspettano indicatori di stato discreti, non interruzioni modali. Un piccolo chip "Update ready" nella shell può risultare più professionale di un dialog di sistema che ruba il focus nel mezzo di un workflow.

Il pattern migliore è quello che si adatta al rischio dell'aggiornamento e al task attuale dell'utente. Tutto il resto è teatro.

Automating Update Flows and User Choice

Una volta impostati i pattern di rilevamento e UX, il cuore del sistema è il workflow. Qui i team tendono ad automatizzare troppo e perdere il controllo, oppure troppo poco, creando debito di supporto.

Un diagramma che illustra i tre tipi di workflow automatizzati per l'aggiornamento delle app: silent, user-choice e forced updates.

Guida di Coderio alla manutenzione delle app consiglia un ritmo di rilascio concreto di aggiornamenti minori ogni 2-4 settimane e rilasci major ogni 3-6 mesi, con gli hard update riservati a problemi critici di sicurezza o stabilità. È il giusto approccio. La decisione deve basarsi sul tipo di release, non sull'ansia dello sviluppatore.

Silent update per modifiche a basso rischio

I silent update sono la modalità meno sfruttata nelle app Capacitor. Se hai corretto lo stile, il copy, il wiring delle feature-flag o un bug JavaScript non breaking, di solito non c'è motivo di interrompere l'utente.

Il flusso è semplice:

  1. L'app controlla se c'è un nuovo bundle.
  2. Se l'update è marcato come sicuro per l'applicazione in background, il download avviene in background.
  3. L'app attiva il nuovo bundle al prossimo avvio.
  4. L'utente potrebbe vedere un breve messaggio di “Aggiornamento completato” dopo il riavvio, o nulla.

L'ultima scelta dipende dalla modifica. Se l'update ha cambiato il workflow visibile, una piccola card “Novità” al prossimo avvio aiuta l'utente. Se non è cambiato nulla, il silenzio va benissimo.

Un semplice gestore di stato può essere questo:

async function handleUpdateDecision(decision: UpdateDecision) {
  if (decision.kind === 'silent') {
    await updater.download()
    await updater.setNextBundle()
    localStorage.setItem('pendingUpdateVersion', decision.version)
    return
  }

  if (decision.kind === 'soft') {
    showBanner(decision.version)
    return
  }

  if (decision.kind === 'hard') {
    showForcedUpdateScreen(decision.version)
  }
}

Flussi a scelta dell'utente per modifiche visibili al prodotto

Un flusso basato sulla scelta dell'utente è adatto quando l'aggiornamento cambia il comportamento al punto che le persone dovrebbero scegliere di accettare l'interruzione. Nuova navigazione, onboarding rivisto, un flusso di approvazione modificato o un redesign sostanziale della dashboard rientrano tutti in questo gruppo.

Il prompt deve restare mirato:

  • Cosa è cambiato
  • Perché è importante
  • Cosa succede se aggiornano ora
  • Cosa succede se aspettano

Non scrivere poesie nelle note di rilascio. Una frase chiara e due pulsanti funzionano meglio di un muro di testo.

Mi piace questo pattern:

Nuova versione disponibile. Include il workflow di reporting aggiornato e risolve un problema di export. Aggiorna ora o continua e installa più tardi.

Usa “Più tardi” con criterio. Se il vecchio client è ancora valido, lascia che l'utente continui. Se il vecchio client smetterà di funzionare a causa di una migrazione API, non fingere che sia opzionale.

Per i team che ragionano sulla governance oltre la distribuzione delle app, la stessa logica si applica alle operazioni di sicurezza. Una buona automazione gestisce le modifiche di routine in silenzio e fa escalation solo quando il rischio lo giustifica. È uno dei motivi per cui questa panoramica di automazione della sicurezza per i team SOC è utile. Mostra il principio di design più ampio: classificare gli eventi, automatizzare i percorsi sicuri e rendere intenzionale l'intervento umano.

Puoi anche stringere i criteri con la logica di audience. L’articolo di Capgo su la segmentazione per frequenza d'uso negli aggiornamenti delle app è un riferimento pratico, perché gli utenti frequenti e quelli occasionali non dovrebbero ricevere sempre lo stesso timing o stile di prompt.

Aggiornamenti forzati per casi critici limitati

Gli aggiornamenti forzati sono legittimi. Ma sono anche facili da abusare.

Usa un hard gate quando una di queste condizioni è vera:

Condizione Aggiornamento forzato
Patch di sicurezza con esposizione nota Sì
Problemi di stabilità con gravi malfunzionamenti Sì
Breaking change nel contratto backend Sì
Piccoli ritocchi alla UI No
Rollout opzionale di feature No

L'implementazione deve essere esplicita. Controlla la versione installata all'avvio, confrontala con la tua versione minima supportata e porta l'utente in uno stato bloccato solo se scende sotto quella soglia. Non dedurre che sia "obbligatorio" solo perché esiste una versione più recente.

Una schermata di aggiornamento forzato richiede tre proprietà:

  • Nessun vicolo cieco. Offri all'utente un percorso di retry chiaro.
  • Spiegazione chiara. Spiega perché l'aggiornamento è obbligatorio.
  • Gestione offline. Se la rete non è disponibile, spiegalo anche.

Quello che non funziona è un modale con un solo pulsante “Aggiorna” che fallisce senza indicazioni su dati mobili instabili. Se l'app è bloccata, il percorso di recovery deve essere più curato di quello normale.

Rollout avanzati con Channels e Telemetry

La maggior parte degli incidenti di aggiornamento non avviene perché il rilevamento è fallito. Succede perché il team ha rilasciato l'aggiornamento su larga scala prima di capire cosa stesse facendo in produzione.

I canali riducono il raggio d'azione

Il rollout basato su canali è il modo più sicuro per pubblicare live update nelle app client. Invece di pubblicare un singolo bundle per tutti, pubblicalo per audience come internal, QA, beta, staging, production o persino stream specifici per cliente.

Questo ti dà una forma di release che assomiglia più a un controllo operativo che a un lancio binario. Un build può attraversare una sequenza di audience, con ogni gruppo che ti dà fiducia prima che il successivo lo veda.

Di seguito uno screenshot utile del lato commerciale di quel modello di rollout, inclusa la struttura dei piani attorno ai workflow di aggiornamento.

Screenshot da https://capgo.app/pricing

Questo conta anche per la strategia di notifica. Le best practice di push notification di Adapty riportano che I tempi di invio ottimizzati possono aumentare i tassi di risposta del 40% e il targeting avanzato può triplicare i tassi di reazione. Nei sistemi di aggiornamento, ciò si traduce in rollout sensibili al canale e messaggi specifici per versione, non in prompt generici per l'intera base installata.

La telemetria ti dice se gli utenti hanno effettivamente aggiornato

Un sistema di aggiornamento professionale dovrebbe rispondere a queste domande senza che gli ingegneri debbano setacciare log ad hoc:

  • Quale versione del bundle ha ogni dispositivo?
  • L'aggiornamento è stato scaricato?
  • È stato applicato correttamente al successivo avvio?
  • Gli errori all'avvio sono aumentati dopo il rollout?
  • Quali utenti sono bloccati su una versione obsoleta?

È qui che la telemetria trasforma l'aggiornamento da semplice rilascio a processo operativo. Senza di essa, sai solo cosa hai distribuito. Con essa, sai cosa hanno adottato gli utenti.

Se il supporto non riesce a vedere lo stato dell'aggiornamento, escalerà un problema di prodotto che in realtà è un problema di rollout.

Preferisco di gran lunga le timeline per singolo dispositivo rispetto ai dashboard solo aggregati. Le curve di adozione aggregate sono utili, ma non spiegano perché un cliente enterprise stia ancora aprendo l'app con un vecchio bundle dopo una settimana. I log a livello di dispositivo sì.

Anche il publishing mirato per versione diventa più pratico quando puoi isolare cohort specifiche. Questa guida su inviare una versione specifica agli utenti è un buon esempio del tipo di controllo di cui i team enterprise finiscono per aver bisogno quando gestiscono più ambienti cliente.

La CI/CD dovrebbe pubblicare e osservare, non solo buildare

Una pipeline moderna non dovrebbe fermarsi a "build riuscita". Dovrebbe:

  1. Buildare il bundle
  2. Firma e pubblica sul canale corretto
  3. Allega i metadati della release
  4. Monitora l'adozione e i fallimenti
  5. Rollback se lo stato di salute peggiora

Il rollback è ciò che distingue un updater demo da uno di produzione. Se un bundle causa crash all'avvio o deadlock di startup, i team devono poter contenere subito il raggio d'azione. È uno dei motivi principali per cui gli strumenti gestiti battono il fai-da-te per la maggior parte delle agenzie. Delivery, guardrail, osservabilità e rollback non sono funzioni secondarie. Sono il sistema.

L'integrazione CI/CD non deve essere complicata. Ciò che conta è che il publishing sia deterministico e tracciabile. Un rilascio deve essere riconducibile a un commit, un ambiente, un utente e un canale. Se non riesci a rispondere rapidamente a queste quattro domande, la gestione degli incidenti si complica parecchio.

Risoluzione dei problemi comuni di notifica

I problemi seguenti ricorrono spesso nel lavoro di aggiornamento con Capacitor ed Electron. La maggior parte deriva da disallineamenti di stato, non dalla rete.

Il prompt appare a ogni avvio

Sintomo: gli utenti chiudono la notifica di aggiornamento dell'app, ma questa riappare ogni volta che l'app viene aperta.

Causa probabile: stai verificando correttamente, ma non stai salvando lo stato del prompt per ogni versione offerta.

Soluzione: salva la versione che l'utente ha ignorato o rimandato e confrontala prima di mostrare di nuovo l'UI.

function shouldPrompt(version: string): boolean {
  const dismissed = localStorage.getItem('dismissedUpdateVersion')
  return dismissed !== version
}

function dismissPrompt(version: string) {
  localStorage.setItem('dismissedUpdateVersion', version)
}

È anche qui che i team confondono "disponibile" con "dovrebbe interrompere". Sono decisioni diverse.

Gli aggiornamenti silent scaricano ma non si attivano mai

Sintomo: i log mostrano che un bundle è stato recuperato, ma l'UI vecchia continua a caricarsi.

Causa probabile: l'app ha scaricato l'update ma non l'ha mai contrassegnato per il prossimo avvio, oppure il percorso di startup punta ancora all'ultimo bundle attivo.

Soluzione: rendi l'attivazione esplicita e verificala durante il boot. Tratta “downloaded” e “active” come stati separati in code e analytics.

Molti bug spariscono quando modelli il lifecycle come available -> downloading -> ready -> active invece di un singolo boolean.

I check si comportano diversamente in dev e in produzione

Sintomo: il rilevamento dell'update funziona su una release build ma non in sviluppo locale, o viceversa.

Causa probabile: configurazione specifica dell'ambiente. Nomi di channel diversi, plugin disabilitati in debug, o startup code racchiusa nel guard sbagliato.

Soluzione: rendi visibile il comportamento dell'ambiente. Logga canale, versione dell'app e modalità di build all'avvio. Non affidarti alla memoria.

  • Build di sviluppo dovrebbe di solito aggirare i controlli di live update o puntare a un canale di test dedicato.
  • Build di staging dovrebbero comportarsi come in produzione ma su stream di rollout isolati.
  • Build di produzione non devono mai condividere canali con il traffico QA interno.

Gli utenti sono offline durante il check

Sintomo: l'app mostra uno stato di aggiornamento non valido quando l'utente la apre senza connettività.

Causa probabile: il percorso di verifica presuppone il successo della rete e mappa il fallimento su un'interfaccia di errore anziché su uno stato neutro.

Soluzione: degradare in modo elegante. Mantieni la versione corrente in esecuzione, registra il controllo fallito e riprova più tardi quando l'app torna attiva.

L'offline è una condizione di runtime normale, non eccezionale.

Per gli aggiornamenti forzati, il percorso offline richiede maggiore attenzione. Se la versione minima supportata è già non valida, l'app potrebbe dover restare bloccata. In tal caso, spiega chiaramente il motivo e mostra un'azione di retry quando la connettività torna. Se l'aggiornamento è opzionale, non penalizzare mai l'utente per una perdita temporanea di rete.

Il principio ricorrente in tutti questi casi è semplice: separare rilevamento, policy, UI, e attivazioneQuando queste responsabilità si concentrano in un unico hook o componente, il debugging diventa un gioco d'azzardo.


Se il tuo team rilascia app Capacitor o Electron e ti serve un sistema di update controllato con canali, consegna di bundle firmati, protezione dal rollback e osservabilità a livello di device, Capgo vale la pena valutarlo. È l'ideale per i team che vogliono che i Live Update si comportino come un'infrastruttura di rilascio piuttosto che come un progetto secondario gestito manualmente.

Continua da Strategie efficaci per le notifiche di aggiornamento app

Se stai usando Strategie efficaci per le notifiche di aggiornamento app per pianificare l'automazione CI/CD e connetterla a CI/CD con Capgo per il workflow del prodotto in Capgo CI/CD, Capgo Native Build per il workflow di prodotto in Capgo Native Builds, Integrazioni Capgo per il workflow di prodotto in Integrazioni Capgo, Integrazione CI/CD per i dettagli implementativi in CI/CD Integration, e Integrazione GitHub Actions per i dettagli implementativi in GitHub Actions Integration.

Live updates per le app Capacitor

Quando un bug nel web-layer è live, rilascia la fix tramite Capgo invece di aspettare giorni l'approvazione degli store. Gli utenti ricevono l'update in background, mentre le modifiche native restano nel normale processo di review.

Ultimi articoli dal blog

Capgo ti offre gli insight migliori che ti servono per creare un'app mobile davvero professionale.