1. Introduzione e configurazione
Funzionalità web
Vogliamo colmare il divario di capacità tra il web e gli annunci nativi e consentire agli sviluppatori di creare facilmente esperienze eccezionali sul web aperto. Crediamo fermamente che ogni sviluppatore debba avere accesso alle funzionalità necessarie per offrire un'esperienza web ottimale e ci impegniamo a rendere il web più efficiente.
Tuttavia, alcune funzionalità, come l'accesso al file system e il rilevamento di inattività, sono disponibili per gli utenti nativi, ma non sono disponibili sul web. L'assenza di queste funzionalità significa che alcuni tipi di app non possono essere pubblicati sul web o sono meno utili.
Progetteremo e svilupperemo queste nuove funzionalità in modo aperto e trasparente, utilizzando i processi degli standard delle piattaforme web aperte esistenti e ricevere feedback tempestivi da sviluppatori e altri fornitori di browser man mano che continuiamo a sviluppare la progettazione, per garantire un design interoperabile.
Cosa creerai
In questo codelab, esplorerai una serie di API web nuove o disponibili solo dietro un flag. Pertanto, questo codelab si concentra sulle API stesse e sui casi d'uso che queste API sbloccano, piuttosto che sulla creazione di un prodotto finale specifico.
Cosa imparerai a fare
Questo codelab ti insegnerà i meccanismi di base di diverse API sperimentali. Tieni presente che questi meccanismi non sono ancora definitivi e apprezziamo molto il tuo feedback sul flusso degli sviluppatori.
Che cosa ti serve
Poiché le API presenti in questo codelab sono davvero all'avanguardia, i requisiti di ciascuna API variano. Leggi attentamente le informazioni sulla compatibilità all'inizio di ogni sezione.
Come affrontare il codelab
Il codelab non deve essere necessariamente elaborato in sequenza. Ogni sezione rappresenta un'API indipendente, quindi scegli liberamente ciò che ti interessa di più.
2. API Badging
L'obiettivo dell'API Badging è portare gli utenti agli eventi che si verificano in background. Per semplicità della demo in questo codelab, utilizziamo l'API per portare gli utenti a qualcosa che sta accadendo in primo piano. Puoi quindi eseguire il trasferimento mentale di ciò che accadrà in background.
Installa Airhorner
Affinché questa API funzioni, è necessaria una PWA installata nella schermata Home, quindi il primo passaggio consiste nell'installare una PWA, come il famigerato airhorner.com. Tocca il pulsante Installa nell'angolo in alto a destra o utilizza il menu con tre puntini per eseguire l'installazione manuale.
Verrà visualizzato un messaggio di conferma: fai clic su Installa.
Ora nel dock del sistema operativo è presente una nuova icona. Fai clic sul pulsante per avviare la PWA. Avrà una propria finestra per l'app e verrà eseguita in modalità autonoma.
Impostare un badge
Ora che hai installato una PWA, hai bisogno di alcuni dati numerici (i badge possono contenere solo numeri) da visualizzare su un badge. Una cosa semplice da contare in Air Horner è: sospira il numero di volte che ha ricevuto le corna. Con l'app Airhorner installata, prova a far suonare la sirena e a controllare il badge. ne conta uno ogni volta che c'è un corno.
Come funziona? Essenzialmente, il codice è questo:
let hornCounter = 0;
const horn = document.querySelector('.horn');
horn.addEventListener('click', () => {
navigator.setExperimentalAppBadge(++hornCounter);
});
emetti l'airhorn un paio di volte e controlla l'icona della PWA: si aggiornerà ogni volta. singolo. nel tempo. l'airhorn. Niente di più facile.
Cancellare un badge
Il contatore sale fino a 99 e poi ricomincia da capo. Puoi anche reimpostarlo manualmente. Apri la scheda della console DevTools, incolla la riga di seguito e premi Invio.
navigator.setExperimentalAppBadge(0);
In alternativa, puoi rimuovere il badge cancellandolo esplicitamente, come mostrato nello snippet seguente. L'icona della PWA dovrebbe ora essere di nuovo come all'inizio, chiara e senza badge.
navigator.clearExperimentalAppBadge();
Feedback
Come ti è sembrato l'API? Aiutaci rispondendo brevemente a questo sondaggio:
L'API era intuitiva?
Hai fatto eseguire l'esempio?
Hai altro da dire? Mancano delle funzionalità? Fornisci un rapido feedback in questo sondaggio. Grazie.
3. API Native File System
L'API Native File System consente agli sviluppatori di creare potenti app web che interagiscono con i file sul dispositivo locale dell'utente. Dopo che un utente ha concesso l'accesso a un'app web, questa API consente alle app web di leggere o salvare le modifiche direttamente ai file e alle cartelle sul dispositivo dell'utente.
Leggere un file
Il file "Hello World" dell'API Native File System è leggere un file locale e recuperarne i contenuti. Crea un file .txt
normale e inserisci del testo. Successivamente, accedi a un qualsiasi sito sicuro (ovvero un sito pubblicato tramite HTTPS) come example.com e apri la console DevTools. Incolla lo snippet di codice riportato di seguito nella console. Poiché l'API Native File System richiede un gesto dell'utente, alleghiamo un gestore del doppio clic al documento. In seguito avremo bisogno dell'handle del file, quindi lo trasformiamo in una variabile globale.
document.ondblclick = async () => {
window.handle = await window.chooseFileSystemEntries();
const file = await handle.getFile();
document.body.textContent = await file.text();
};
Quando fai doppio clic in un punto qualsiasi della pagina example.com, viene visualizzato un selettore file.
Seleziona il file .txt
che hai creato in precedenza. I contenuti del file sostituiranno quindi i contenuti body
effettivi di example.com.
Salvataggio di un file
Ora apportiamo alcune modifiche. Pertanto, puoi rendere modificabile body
incollando lo snippet di codice riportato di seguito. Ora puoi modificare il testo come se il browser fosse un editor di testo.
document.body.contentEditable = true;
Ora vogliamo riscrivere queste modifiche nel file originale. Pertanto, abbiamo bisogno di un writer nell'handle del file, che possiamo ottenere incollando lo snippet seguente nella console. Ancora una volta dobbiamo fare un gesto dell'utente, quindi questa volta aspettiamo un clic sul documento principale.
document.onclick = async () => {
const writer = await handle.createWriter();
await writer.truncate(0);
await writer.write(0, document.body.textContent);
await writer.close();
};
Quando ora fai clic sul documento (e non doppio clic), viene visualizzata una richiesta di autorizzazione. Una volta concessa l'autorizzazione, i contenuti del file saranno quelli modificati in precedenza nel body
. Verifica le modifiche aprendo il file in un editor diverso (oppure riavvia il processo facendo nuovamente doppio clic sul documento e riaprendo il file).
Complimenti! [citation needed]
. Hai appena creato l'editor di testo più piccolo del mondo.
Feedback
Come ti è sembrato l'API? Aiutaci rispondendo brevemente a questo sondaggio:
L'API era intuitiva?
Hai fatto eseguire l'esempio?
Hai altro da dire? Mancano delle funzionalità? Fornisci un rapido feedback in questo sondaggio. Grazie.
4. API Shape Detection
L'API Shape Detection consente di accedere a rilevatori di forma accelerata (ad es. per i volti umani) e funziona su immagini statiche e/o feed di immagini live. I sistemi operativi dispongono di rilevatori di funzionalità ad alte prestazioni e altamente ottimizzati, come FaceDetector di Android. L'API Shape Detection apre queste implementazioni native e le espone tramite una serie di interfacce JavaScript.
Al momento, le funzionalità supportate sono il rilevamento dei volti tramite l'interfaccia FaceDetector
, il rilevamento dei codici a barre tramite l'interfaccia BarcodeDetector
e il rilevamento del testo (riconoscimento ottico dei caratteri) tramite l'interfaccia TextDetector
.
Rilevamento facciale
Una delle funzionalità più interessanti dell'API Shape Detection è il rilevamento dei volti. Per testarlo, abbiamo bisogno di una pagina con dei volti. Questa pagina con il volto dell'autore è un buon inizio. L'aspetto sarà simile a quello nello screenshot seguente. Su un browser supportato vengono riconosciuti il riquadro di confine del volto e i punti di riferimento dei volti.
Puoi vedere quanto poco codice è stato necessario per ottenere questo risultato remixando o modificando il progetto Glitch, in particolare il file script.js.
Se vuoi diventare completamente dinamico e non soltanto lavorare con il volto dell'autore, visita questa pagina dei risultati della Ricerca Google piena di volti in una scheda privata o in modalità ospite. In questa pagina, apri Strumenti per sviluppatori di Chrome facendo clic con il tasto destro del mouse in un punto qualsiasi e poi facendo clic su Ispeziona. Quindi, nella scheda Console, incolla lo snippet di seguito. Il codice evidenzia i volti rilevati con un riquadro rosso semitrasparente.
document.querySelectorAll('img[alt]:not([alt=""])').forEach(async (img) => {
try {
const faces = await new FaceDetector().detect(img);
faces.forEach(face => {
const div = document.createElement('div');
const box = face.boundingBox;
const computedStyle = getComputedStyle(img);
const [top, right, bottom, left] = [
computedStyle.marginTop,
computedStyle.marginRight,
computedStyle.marginBottom,
computedStyle.marginLeft
].map(m => parseInt(m, 10));
const scaleX = img.width / img.naturalWidth;
const scaleY = img.height / img.naturalHeight;
div.style.backgroundColor = 'rgba(255, 0, 0, 0.5)';
div.style.position = 'absolute';
div.style.top = `${scaleY * box.top + top}px`;
div.style.left = `${scaleX * box.left + left}px`;
div.style.width = `${scaleX * box.width}px`;
div.style.height = `${scaleY * box.height}px`;
img.before(div);
});
} catch(e) {
console.error(e);
}
});
Noterai che sono presenti alcuni messaggi DOMException
e che non tutte le immagini sono in fase di elaborazione. Questo perché le immagini above the fold sono incorporate come URI di dati e quindi sono accessibili, mentre le immagini below the fold provengono da un dominio diverso che non è configurato per supportare CORS. Ai fini della demo, non dobbiamo preoccuparci di questo.
Rilevamento dei punti di riferimento facciali
Oltre ai soli volti, di per sé macOS supporta anche il rilevamento dei punti di riferimento dei volti. Per testare il rilevamento dei punti di riferimento dei volti, incolla il seguente snippet nella console. Promemoria: l'elenco dei punti di riferimento non è per niente perfetto a causa di crbug.com/914348, ma puoi capire dove ci stiamo dirigendo e quanto può essere potente questa funzionalità.
document.querySelectorAll('img[alt]:not([alt=""])').forEach(async (img) => {
try {
const faces = await new FaceDetector().detect(img);
faces.forEach(face => {
const div = document.createElement('div');
const box = face.boundingBox;
const computedStyle = getComputedStyle(img);
const [top, right, bottom, left] = [
computedStyle.marginTop,
computedStyle.marginRight,
computedStyle.marginBottom,
computedStyle.marginLeft
].map(m => parseInt(m, 10));
const scaleX = img.width / img.naturalWidth;
const scaleY = img.height / img.naturalHeight;
div.style.backgroundColor = 'rgba(255, 0, 0, 0.5)';
div.style.position = 'absolute';
div.style.top = `${scaleY * box.top + top}px`;
div.style.left = `${scaleX * box.left + left}px`;
div.style.width = `${scaleX * box.width}px`;
div.style.height = `${scaleY * box.height}px`;
img.before(div);
const landmarkSVG = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
landmarkSVG.style.position = 'absolute';
landmarkSVG.classList.add('landmarks');
landmarkSVG.setAttribute('viewBox', `0 0 ${img.width} ${img.height}`);
landmarkSVG.style.width = `${img.width}px`;
landmarkSVG.style.height = `${img.height}px`;
face.landmarks.map((landmark) => {
landmarkSVG.innerHTML += `<polygon class="landmark-${landmark.type}" points="${
landmark.locations.map((point) => {
return `${scaleX * point.x},${scaleY * point.y} `;
}).join(' ')
}" /></svg>`;
});
div.before(landmarkSVG);
});
} catch(e) {
console.error(e);
}
});
Rilevamento di codici a barre
La seconda funzionalità dell'API Shape Detection è il rilevamento del codice a barre. Come in precedenza, abbiamo bisogno di una pagina con codici a barre, come questa. Quando lo apri in un browser, vedrai i vari codici QR decifrati. Per vedere come si fa, remixa o modifica il progetto Glitch, in particolare il file script.js.
Se vuoi qualcosa di più dinamico, possiamo di nuovo utilizzare Google Ricerca immagini. Questa volta, dal browser, vai a questa pagina dei risultati della Ricerca Google in una scheda privata o in modalità ospite. Ora incolla lo snippet di seguito nella scheda Console di Chrome DevTools. Dopo qualche istante, i codici a barre riconosciuti vengono annotati con il valore non elaborato e il tipo di codice a barre.
document.querySelectorAll('img[alt]:not([alt=""])').forEach(async (img) => {
try {
const barcodes = await new BarcodeDetector().detect(img);
barcodes.forEach(barcode => {
const div = document.createElement('div');
const box = barcode.boundingBox;
const computedStyle = getComputedStyle(img);
const [top, right, bottom, left] = [
computedStyle.marginTop,
computedStyle.marginRight,
computedStyle.marginBottom,
computedStyle.marginLeft
].map(m => parseInt(m, 10));
const scaleX = img.width / img.naturalWidth;
const scaleY = img.height / img.naturalHeight;
div.style.backgroundColor = 'rgba(255, 255, 255, 0.75)';
div.style.position = 'absolute';
div.style.top = `${scaleY * box.top + top}px`;
div.style.left = `${scaleX * box.left - left}px`;
div.style.width = `${scaleX * box.width}px`;
div.style.height = `${scaleY * box.height}px`;
div.style.color = 'black';
div.style.fontSize = '14px';
div.textContent = `${barcode.rawValue}`;
img.before(div);
});
} catch(e) {
console.error(e);
}
});
Rilevamento testo
L'ultima funzionalità dell'API Shape Detection è il rilevamento del testo. Ormai sai come funziona: abbiamo bisogno di una pagina con immagini contenenti testo, come questa con i risultati della scansione di Google Libri. Sui browser supportati, il testo verrà riconosciuto e vedrai un riquadro di delimitazione attorno ai passaggi del testo. Per vedere come si fa, remixa o modifica il progetto Glitch, in particolare il file script.js.
Per testarla in modo dinamico, vai a questa pagina dei risultati di ricerca in una scheda privata o in modalità ospite. Ora incolla lo snippet di seguito nella scheda Console di Chrome DevTools. Con un po' di attesa, parte del testo verrà riconosciuta.
document.querySelectorAll('img[alt]:not([alt=""])').forEach(async (img) => {
try {
const texts = await new TextDetector().detect(img);
texts.forEach(text => {
const div = document.createElement('div');
const box = text.boundingBox;
const computedStyle = getComputedStyle(img);
const [top, right, bottom, left] = [
computedStyle.marginTop,
computedStyle.marginRight,
computedStyle.marginBottom,
computedStyle.marginLeft
].map(m => parseInt(m, 10));
const scaleX = img.width / img.naturalWidth;
const scaleY = img.height / img.naturalHeight;
div.style.backgroundColor = 'rgba(255, 255, 255, 0.75)';
div.style.position = 'absolute';
div.style.top = `${scaleY * box.top + top}px`;
div.style.left = `${scaleX * box.left - left}px`;
div.style.width = `${scaleX * box.width}px`;
div.style.height = `${scaleY * box.height}px`;
div.style.color = 'black';
div.style.fontSize = '14px';
div.innerHTML = text.rawValue;
img.before(div);
});
} catch(e) {
console.error(e);
}
});
Feedback
Come ti è sembrato l'API? Aiutaci rispondendo brevemente a questo sondaggio:
L'API era intuitiva?
Hai fatto eseguire l'esempio?
Hai altro da dire? Mancano delle funzionalità? Fornisci un rapido feedback in questo sondaggio. Grazie.
5. API Web Share Target
L'API Web Share Target consente alle app web installate di registrarsi con il sistema operativo sottostante come destinazione di condivisione per ricevere contenuti condivisi dall'API Web Share o da eventi di sistema, ad esempio il pulsante di condivisione a livello di sistema operativo.
Installare una PWA da condividere su
Come primo passo, hai bisogno di una PWA con cui condividere contenuti. Questa volta Airhorner (per fortuna) non farà il lavoro, ma l'app demo Web Share Target ti aiuta. Installa l'app nella schermata Home del dispositivo.
Condividere qualcosa con la PWA
Poi devi condividere qualcosa, ad esempio una foto di Google Foto. Utilizza il pulsante Condividi e seleziona la PWA Scrapbook come destinazione della condivisione.
Quando tocchi l'icona dell'app, accederai direttamente alla PWA Scrapbook e vedrai la foto.
Come funziona? Per scoprirlo, esplora il file manifest dell'app web della PWA Scrapbook. La configurazione per far funzionare l'API Web Share Target si trova nella proprietà "share_target"
del file manifest che nel suo campo "action"
rimanda a un URL decorato con i parametri elencati in "params"
.
Il lato di condivisione compila quindi questo modello di URL di conseguenza (tramite un'azione di condivisione o controllato in modo programmatico dallo sviluppatore utilizzando l'API Web Share), in modo che il lato ricevente possa estrarre i parametri ed eseguire un'operazione, ad esempio visualizzarli.
{
"action": "/_share-target",
"enctype": "multipart/form-data",
"method": "POST",
"params": {
"files": [{
"name": "media",
"accept": ["audio/*", "image/*", "video/*"]
}]
}
}
Feedback
Come ti è sembrato l'API? Aiutaci rispondendo brevemente a questo sondaggio:
L'API era intuitiva?
Hai fatto eseguire l'esempio?
Hai altro da dire? Mancano delle funzionalità? Fornisci un rapido feedback in questo sondaggio. Grazie.
6. API Wake Lock
Per evitare di esaurire la batteria, la maggior parte dei dispositivi entra rapidamente in modalità di sospensione quando è inattivo. Anche se nella maggior parte dei casi questo approccio va bene, alcune applicazioni devono mantenere attivo lo schermo o il dispositivo per poter completare il proprio lavoro. L'API Wake Lock fornisce un modo per evitare che la luminosità del dispositivo si abbassi e si blocchi lo schermo o per evitare che venga attivata la modalità di sospensione. Questa funzionalità consente nuove esperienze che, fino a oggi, richiedevano un'app nativa.
Configurare un salvaschermo
Per testare l'API Wake Lock, devi prima assicurarti che il tuo dispositivo attivi la modalità di sospensione. Pertanto, nel riquadro delle preferenze del tuo sistema operativo, attiva un salvaschermo a tua scelta e assicurati che si avvii dopo 1 minuto. Assicurati che funzioni lasciando il tuo dispositivo solo per quel tempo (sì, lo so, è una situazione spiacevole). I seguenti screenshot mostrano macOS, ma ovviamente puoi provarlo sul tuo dispositivo Android mobile o su qualsiasi piattaforma desktop supportata.
Impostare un wakelock dello schermo
Ora che sai che il salvaschermo funziona, utilizzerai un wakelock di tipo "screen"
per impedire al salvaschermo di svolgere le sue operazioni. Vai all'app demo Wake Lock e fai clic su Attiva .
screen
Casella di controllo Wake Lock.
A partire da quel momento, è attivo un wakelock. Se sei abbastanza paziente da lasciare intatto il dispositivo per un minuto, ora vedrai che il salvaschermo in realtà non è stato avviato.
Come funziona? Per scoprirlo, accedi al progetto Glitch per l'app demo Wake Lock e controlla script.js. L'essenza del codice è illustrata nello snippet di seguito. Apri una nuova scheda (o utilizza una delle schede aperte) e incolla il codice riportato di seguito in una console degli Strumenti per sviluppatori di Chrome. Quando fai clic sulla finestra, dovresti vedere un wakelock attivo per esattamente 10 secondi (vedi i log della console) e il salvaschermo non dovrebbe avviarsi.
if ('wakeLock' in navigator && 'request' in navigator.wakeLock) {
let wakeLock = null;
const requestWakeLock = async () => {
try {
wakeLock = await navigator.wakeLock.request('screen');
wakeLock.addEventListener('release', () => {
console.log('Wake Lock was released');
});
console.log('Wake Lock is active');
} catch (e) {
console.error(`${e.name}, ${e.message}`);
}
};
requestWakeLock();
window.setTimeout(() => {
wakeLock.release();
}, 10 * 1000);
}
Feedback
Come ti è sembrato l'API? Aiutaci rispondendo brevemente a questo sondaggio:
L'API era intuitiva?
Hai fatto eseguire l'esempio?
Hai altro da dire? Mancano delle funzionalità? Fornisci un rapido feedback in questo sondaggio. Grazie.
7. API Contact Picker
Un'API che ci entusiasma molto è l'API Contact Picker. Consente a un'app web di accedere ai contatti dalla gestione contatti nativa del dispositivo, in modo che la tua app web abbia accesso ai contatti nomi, indirizzi email e numeri di telefono. Puoi specificare se desideri soltanto uno o più contatti e se vuoi includere tutti i campi o solo un sottoinsieme di nomi, indirizzi email e numeri di telefono.
Considerazioni sulla privacy
Una volta aperto il selettore, puoi scegliere i contatti che vuoi condividere. Noterai che non è presente l'opzione "Seleziona tutto" , che è intenzionale: vogliamo che la condivisione sia una decisione consapevole. Allo stesso modo, l'accesso non è continuo, ma piuttosto una decisione una tantum.
Accesso ai contatti
Accedere ai contatti è un'attività semplice. Prima dell'apertura del selettore, puoi specificare i campi che vuoi (le opzioni sono name
, email
e telephone
) e se vuoi accedere a più contatti o a un solo contatto. Puoi testare questa API su un dispositivo Android aprendo l'applicazione demo. La sezione pertinente del codice sorgente è essenzialmente lo snippet seguente:
getContactsButton.addEventListener('click', async () => {
const contacts = await navigator.contacts.select(
['name', 'email'],
{multiple: true});
if (!contacts.length) {
// No contacts were selected, or picker couldn't be opened.
return;
}
console.log(contacts);
});
8. API Async Clipboard
Copiare e incollare testo
Finora, non c'era modo di copiare e incollare in modo programmatico le immagini negli appunti del sistema. Di recente, abbiamo aggiunto il supporto delle immagini all'API Async Clipboard,
in modo da poter copiare e incollare le immagini. La novità è che puoi anche scrivere immagini negli appunti. L'API degli appunti asincroni supportava il copia e incolla del testo per un po' di tempo. Puoi copiare il testo negli appunti chiamando navigator.clipboard.writeText() e incollarlo in un secondo momento chiamando navigator.clipboard.readText().
Copiare e incollare immagini
Ora puoi anche scrivere immagini negli appunti. Affinché questo comando funzioni, i dati dell'immagine devono essere sotto forma di blob da passare al costruttore degli elementi degli appunti. Infine, puoi copiare questo elemento degli appunti chiamando navigator.clipboard.write().
// Copy: Writing image to the clipboard
try {
const imgURL = 'https://developers.google.com/web/updates/images/generic/file.png';
const data = await fetch(imgURL);
const blob = await data.blob();
await navigator.clipboard.write([
new ClipboardItem(Object.defineProperty({}, blob.type, {
value: blob,
enumerable: true
}))
]);
console.log('Image copied.');
} catch(e) {
console.error(e, e.message);
}
Incollare l'immagine dagli appunti sembra piuttosto impegnativo, ma in realtà consiste solo nel recuperare il blob dall'elemento degli appunti. Poiché possono esserci più file, devi esaminarli in sequenza finché non ottieni quello che ti interessa. Per motivi di sicurezza, al momento questa operazione è limitata alle immagini PNG, ma in futuro potrebbero essere supportati altri formati di immagine.
async function getClipboardContents() {
try {
const clipboardItems = await navigator.clipboard.read();
for (const clipboardItem of clipboardItems) {
try {
for (const type of clipboardItem.types) {
const blob = await clipboardItem.getType(type);
console.log(URL.createObjectURL(blob));
}
} catch (e) {
console.error(e, e.message);
}
}
} catch (e) {
console.error(e, e.message);
}
}
Puoi vedere questa API in azione in un'app demo; gli snippet pertinenti del suo codice sorgente sono incorporati sopra. La copia delle immagini negli appunti può essere eseguita senza autorizzazione, ma devi concedere l'accesso per incollare dagli appunti.
Dopo aver concesso l'accesso, puoi leggere l'immagine dagli appunti e incollarla nell'applicazione:
9. Ce l'hai fatta.
Congratulazioni, hai raggiunto la fine del codelab. Ancora una volta, questo è un promemoria per ricordare che la maggior parte delle API è ancora in fase di elaborazione e attivamente in fase di sviluppo. Per questo motivo, il tuo team apprezza molto il tuo feedback, perché solo l'interazione con persone come te ci aiuterà a sviluppare queste API nel modo giusto.
Ti invitiamo inoltre a consultare frequentemente la nostra pagina di destinazione delle funzionalità. La terremo aggiornata e conterrà tutti gli articoli di approfondimento relativi alle API su cui lavoriamo. Continua a muoverti!
Tom e l'intero team delle funzionalità 🐡