Probabilmente sei arrivato al punto in cui l'interfaccia utente è pronta, lo schermo del profilo ha un pulsante 'Carica foto' e ora la parte facile non è più facile. La selezione effettiva dell'immagine tocca le autorizzazioni native, gli interfacce controllate dall'OS, diverse forme di ritorno rispetto a quelle che molti sviluppatori si aspettano, e un pugno di dettagli di build-time che si manifestano solo dopo aver distribuito un build reale.
Dove entra in gioco l'immagine picker Expo. È la libreria ufficiale Expo per aprire l'interfaccia di sistema per scegliere immagini e video dal repository del dispositivo o scattare una foto con la fotocamera, come descritto nel repository del pacchetto Expo. In pratica, ciò significa che ottenete un ponte affidabile per l'accesso ai dati di input nativi, ma non un'esperienza di media personalizzata che si comporta identicamente su ogni dispositivo.
Questa guida è scritta per la prima implementazione, non per la demo. Si concentra sulle decisioni che contano nella produzione: configurazione di setup di workflow gestito o nudo, gestione delle autorizzazioni che non vi sorprenderanno in seguito, parsing dei risultati sicuro e un modello di caricamento pratico dopo che l'utente ha selezionato un file. Se lavorate in un setup nativo personalizzato, aiuta anche a capire come questo differisce da un workflow di un client di sviluppo Expo. Expo development client workflow.
Indice
- Inizia con l'immagine picker di Expo
- Installazione e configurazione essenziale
- Accesso alla telecamera e alla libreria dei media
- Manipolazione dei risultati e delle opzioni del picker
- Modelli avanzati e differenze tra piattaforme
- Risoluzione dei problemi comuni
Avvio rapido con Expo Image Picker
Un manager di prodotto chiede foto di profilo. Una settimana dopo, la stessa funzionalità ha bisogno anche di caricamenti di ricevute, cattura della camera per rapporti di incidente e ripetizioni quando gli utenti negano la prima volta il permesso. L'input di immagini si espande rapidamente perché tocca le autorizzazioni native, l'interfaccia utente di sistema di proprietà, la gestione dei file temporanei e le flussi di caricamento backend.
expo-image-picker è il modulo Expo SDK per quel lavoro. Apre il picker di piattaforma o l'interfaccia utente della camera e restituisce i media selezionati in una forma che il tuo React Native code può gestire. Il JavaScript API è piccolo. Il principale ostacolo si trova nella configurazione nativa, nel flusso di autorizzazione e nella gestione dei risultati, sia in progetti gestiti che in progetti bare.
La principale trade-off è chiara. Lasci che iOS e Android presentino le loro interfacce di media al posto di costruire un picker personalizzato. Ciò solitamente dà un risultato migliore: gli utenti già comprendono le schermate del sistema, le richieste di autorizzazione si comportano nel modo in cui l'OS aspetta e il tuo team evita di mantenere un'implementazione di galleria in JavaScript.
Considera questo come una funzionalità di integrazione nativa con un'interfaccia React.
Questa mentalità aiuta perché i modi di fallimento sono raramente nel bottone che chiama il picker. Di solito provengono da uno dei tre luoghi:
- Configurazione nativa: impostazione del plugin mancante, stringhe di autorizzazione errate o un build obsoleto dopo aver modificato la configurazione
- Comportamento di esecuzione: gli utenti possono negare l'accesso, concedere accesso limitato alla libreria su iOS o annullare il flusso senza selezionare nulla
- Analisi dei risultati: il corrente API restituisce un
assetsarray, quindi gli esempi più vecchi che leggonoresult.urifalliscono direttamente
La scelta del flusso di lavoro cambia anche il percorso di configurazione. In un'app Expo gestita, la maggior parte del lavoro nativo vive nella configurazione dell'app e richiede un rebuild quando quella configurazione cambia. In un'app bare, si ottiene ancora il modulo Expo API, ma è necessario verificare le impostazioni dei progetti iOS e Android sottostanti in modo più diretto. Se il suo team utilizza un client personalizzato invece di Expo Go, questa guida si abbina bene con l'Capgo's spiegazione di come un client di sviluppo Expo cambia la verifica dei moduli nativi.
Quel divario è importante per il resto della guida perché il percorso felice è solo la metà della storia. Una implementazione di picker è solida quando funziona in entrambi i flussi di lavoro, gestisce le stranezze di autorizzazione delle piattaforme senza sorprendere l'utente e passa un file utilizzabile al livello di caricamento anziché fermarsi a una anteprima locale.
Installazione e Configurazione Essenziale
Installazione richiede un solo comando. Ottenere la configurazione nativa giusta è ciò che determina se il picker funziona su un dispositivo reale, in un client di sviluppo personalizzato e nella tua build di produzione.
expo-image-picker dà un React-facing API sulle picker delle piattaforme per le foto, i video e la cattura della fotocamera. La chiamata JavaScript è semplice. La configurazione non lo è, perché l'accesso alle foto e la cattura della fotocamera sono controllati da iOS e Android, non da React Native.

Inizia con l'installatore versione-aware di Expo:
npx expo install expo-image-picker
Usa expo install al posto di npm install o yarn add. Expo matches the package version to your SDK, which avoids a common class of native compatibility problems. If you are comparing how Expo modules fit into your release process, this Riepilogo delle funzionalità di Expo Configurazione del flusso gestito
In fase di configurazione del flusso gestito, dichiara il plugin nella configurazione dell'applicazione in modo che Expo possa applicare le modifiche native al momento della compilazione.
Esempio con
Questo è il minimo per la configurazione. In pratica, le squadre aggiungono di solito il testo delle autorizzazioni, soprattutto su iOS, dove la richiesta di autorizzazione dovrebbe spiegare perché l'app necessita di accesso. Mantieni il testo specifico per l'azione dell'utente. 'Carica una foto di profilo' è meglio che 'Necessità di accesso ai media'. app.json:
{
"expo": {
"plugins": ["expo-image-picker"]
}
}
Un dettaglio operativo causa molto tempo perso. Cambiare
stringhe di autorizzazione, o altre configurazioni native richiede una ricompilazione. Il caricamento di JavaScript non applica quelle modifiche. In Expo Go, sei anche limitato da ciò che il client include già. In un build di sviluppo o in un build di produzione, il progetto nativo riflette la configurazione solo dopo una nuova compilazione. pluginsDettagli di configurazione di React Native senza pacchetto
In un'app senza pacchetto, il pacchetto __CAPGO_KEEP_0__ è lo stesso, ma devi verificare di più il progetto nativo da solo. Le descrizioni di utilizzo di iOS sono la prima cosa da controllare. Se il tuo flusso può aprire la libreria, avviare la fotocamera o registrare un video con audio, la tua app necessita delle stringhe di autorizzazione corrispondenti in
Ecco un esempio di come Expo si adatta al tuo pacchetto API, evitando così un comune problema di compatibilità nativa. Se stai confrontando come i moduli di Expo si integrano nel tuo processo di rilascio, questo Info.plist prima di ricostruire.
Un elenco pratico per progetti senza bare si presenta così:
- Installa
expo-image-pickerconnpx expo install expo-image-picker. - Aggiungi la configurazione del plugin se il tuo progetto utilizza plugin di configurazione Expo.
- Conferma che le descrizioni di utilizzo per iOS corrispondono alle funzionalità che esponi.
- Ricostruisci le app per iOS e Android dopo qualsiasi cambiamento nella configurazione nativa.
Il testo delle autorizzazioni mancanti spesso si presenta come un bug di esecuzione perché l'interfaccia utente code è corretta e il gestore del pulsante viene eseguito. L'errore si trova più in basso nella pila. Di solito controlli Info.plist, la configurazione dell'app e se la versione corrente include le ultime modifiche native prima di toccare il componente code.
Un paio di abitudini rendono la configurazione più prevedibile:
- Scrivi il testo delle autorizzazioni per l'azione effettiva: gli utenti dovrebbero capire perché vedono la richiesta.
- Configura la camera e la libreria separatamente: uno può funzionare mentre l'altro continua a fallire.
- Riavvia dopo le modifiche native: il caricamento caldo e la ricarica veloce non aggiornano le autorizzazioni native.
- Testa sul dispositivo: il comportamento del simulatore può nascondere problemi di autorizzazione e di camera.
Se il picker funziona durante lo sviluppo ma si rompe in TestFlight o nella versione Play Store, considera questo un problema di configurazione in primo luogo. La maggior parte delle volte, è così.
Accesso alla Camera e alla Libreria dei Media
Un utente clicca su “Carica foto”, si aspetta che la camera o la libreria si aprano, e il tuo app ha un solo compito in quel momento. Apri la GUI di sistema giusta, gestisci la rifiutazione o la cancellazione senza rompere lo schermo, e restituisci un riferimento di file locale utilizzabile per la visualizzazione o l'upload.
Sembra semplice fino a quando non si testano sia le costruzioni gestite che quelle bare su iOS e Android. Il JavaScript API rimane compatto, ma il comportamento di esecuzione ancora dipende dalle richieste di OS, dal hardware del dispositivo e da come sono state configurate le autorizzazioni native precedentemente.

Un componente minimo ma sicuro
La flusso di base è coerente in entrambi i progetti di workflow Expo gestiti e non gestiti. Richiedi la permessi pertinenti, avvia il picker, controlla se l'utente ha annullato, quindi leggi il primo asset da result.assets.
Un componente di base assomiglia a questo:
import { useState } from 'react';
import { View, Button, Image, Alert } from 'react-native';
import * as ImagePicker from 'expo-image-picker';
export default function PhotoInput() {
const [imageUri, setImageUri] = useState<string | null>(null);
const pickFromLibrary = async () => {
const permission = await ImagePicker.requestMediaLibraryPermissionsAsync();
if (!permission.granted) {
Alert.alert('Permission required', 'Please allow photo library access.');
return;
}
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['images'],
allowsEditing: true,
quality: 1,
});
if (result.canceled) return;
const asset = result.assets?.[0];
if (!asset?.uri) return;
setImageUri(asset.uri);
};
const takePhoto = async () => {
const permission = await ImagePicker.requestCameraPermissionsAsync();
if (!permission.granted) {
Alert.alert('Permission required', 'Please allow camera access.');
return;
}
const result = await ImagePicker.launchCameraAsync({
allowsEditing: true,
quality: 1,
});
if (result.canceled) return;
const asset = result.assets?.[0];
if (!asset?.uri) return;
setImageUri(asset.uri);
};
return (
<View>
<Button title="Choose from library" onPress={pickFromLibrary} />
<Button title="Take photo" onPress={takePhoto} />
{imageUri ? (
<Image
source={{ uri: imageUri }}
style={{ width: 200, height: 200 }}
/>
) : null}
</View>
);
}
Tre dettagli sono importanti qui.
- Richiedi i permessi della libreria e della fotocamera separatamente. Essi falliscono indipendentemente.
- Tieni conto dell'annullamento come di un'azione normale dell'utente, non di uno stato di errore.
- Leggi da
assets[0], perché il picker restituisce un array di asset anziché un elemento di livello superioreuri.
Flussi di libreria e fotocamera
Inizia con il flusso della libreria se desideri la via più veloce per una funzionalità funzionante. È più facile da testare, funziona in più impostazioni di simulatore e evita i casi di bordo del hardware della fotocamera. Aggiungi il supporto della fotocamera una volta che il percorso di gestione dei risultati è stabile.
La via della fotocamera ha più modi per fallire in fase di sviluppo. La supportazione del simulatore iOS è limitata. Gli emulatori Android possono non esporre il comportamento della fotocamera che corrisponde a un dispositivo reale. Nei progetti non gestiti, quei vuoti possono farvi guardare il componente code anche se il problema reale è la configurazione nativa o l'ambiente di test.
Un modello di UI pulito è chiedere all'utente la fonte prima di chiamare il picker API:
const showPickerOptions = () => {
Alert.alert('Upload image', 'Choose a source', [
{ text: 'Camera', onPress: takePhoto },
{ text: 'Photo Library', onPress: pickFromLibrary },
{ text: 'Cancel', style: 'cancel' },
]);
};
Quella separazione mantiene ogni funzione focalizzata. Inoltre, rende più facile aggiungere analisi, flag di funzionalità o regole specifiche del backend in un secondo momento. Ad esempio, alcune squadre consentono l'upload di libreria per le immagini di profilo, ma richiedono catture di fotocamera fresche per la verifica dell'identità.
Se il tuo'app più ampia supporta anche modelli di accesso ai file al di fuori di Expo o stai confrontando convenzioni tra stack nativi, questo riferimento alla libreria di foto Capacitor è utile contesto.
Un breve demo è utile quando mostri questo flusso ai tuoi colleghi o QA:
Cosa aspettarsi dalla UI del sistema
expo-image-picker apre il picker di piattaforma o la UI della fotocamera. La tua app non controlla ogni schermo in quel flusso. Quella distinzione è importante perché 'funziona sul mio dispositivo' spesso significa 'l'OS ha consentito il percorso che ho testato'.
Sui dispositivi iOS, gli utenti possono concedere accesso limitato alla libreria al posto di un accesso completo. Sui dispositivi Android, il comportamento del picker può variare in base alla versione del sistema operativo e alla pelle del fornitore. Nei progetti di workflow gestiti, Expo gestisce più della connessione nativa per te. Nei progetti di workflow nudo, devi confermare che la tua app costruita include le modifiche alle autorizzazioni native che hai fatto. Il sito di chiamata JavaScript può essere identico in entrambi i casi mentre l'esito in esecuzione differisce.
Di solito testo questi casi prima di chiamare la funzionalità completa:
- prima richiesta di autorizzazione
- autorizzazione negata
- annullamento dell'utente
- selezione della libreria riuscita
- captura di immagine di successo su un dispositivo fisico
- anteprima immediata dell'URI locale restituito
Quei casi si mappano direttamente a comportamenti di produzione reali. Inoltre, configurano il passo successivo in modo pulito se hai bisogno di inviare il file a un server, a una pipeline di moderazione o a un endpoint di pubblicazione come il pubblicazione dei media di Instagram API.
Gestione dei risultati e delle opzioni del picker
Il risultato del picker è la parte che solitamente richiede logica di produzione reale. L'interfaccia utente del sistema restituisce un oggetto strutturato, non solo un percorso del file, e piccoli errori qui portano a anteprime rotte, upload vuoti o crash dopo che l'utente annulla.
Leggere correttamente l'oggetto di risultato
La forma del risultato che conta nelle attuali applicazioni Expo è result.assets[0].urinon un livello superiore result.uri. Dettaglio che influenza sia i progetti di workflow gestiti che quelli bare perché lo script JavaScript API è lo stesso anche se la configurazione nativa differisce sotto.
Usa un pattern di guard-first:
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['images'],
allowsEditing: true,
quality: 1,
});
if (result.canceled) {
return;
}
const asset = result.assets?.[0];
if (!asset) {
return;
}
const { uri } = asset;
setImageUri(uri);
Questo gestisce i due casi di fallimento che vedo più spesso. Un picker annullato non ti da un asset da leggere, e code che assume result.assets[0] esisterà sempre ma fallirà all'esecuzione.
Una volta che hai la URI, la visualizzazione di un anteprima è semplice:
<Image source={{ uri: imageUri }} style={{ width: 240, height: 240 }} />
Se hai l'intenzione di caricare in seguito, conserva l'intero asset oggetto, non solo la URI. In pratica, fileName, mimeType, width, heighte sono spesso utili per la validazione, il logging o la creazione di una richiesta multipart più pulita. fileSize Le opzioni che modificano il comportamento downstream
Alcune opzioni del picker influenzano più della schermata di selezione. Modificano la dimensione del file, il comportamento di editing e cosa il tuo backend deve accettare.
Opzione
| Tipo | Cosa cambia | Utilizzo tipico | Opzioni |
|---|---|---|---|
mediaTypes |
array | Limita le opzioni disponibili per l'utente | Limita la selezione alle immagini se il tuo API accetta solo immagini |
allowsEditing |
boolean | Consente all'OS di offrire una UI per la taglia o l'edizione delle immagini, se supportata | Avatar, copertine quadrate, cattura di ricevute |
quality |
number | Comprime gli output di immagini supportati | Riduci la dimensione dell'upload per reti mobili |
base64 |
boolean | Aggiunge i dati di immagine codificati al risultato | Solo per integrazioni che richiedono esplicitamente i dati di immagine inline |
A pochi compromessi possono essere facilmente trascurati:
allowsEditingè utile quando lo slot dell'immagine ha una forma o un dimensione fisse. È meno utile se il tuo server gestisce il proprio pipeline di taglio e desideri il file originale.qualityincide sul tempo di caricamento, sulla pressione della memoria e sullo spazio di archiviazione del server.quality: 1non è automaticamente la scelta giusta.mediaTypesdovrebbe corrispondere alle regole del backend. Se il server rifiuta i video, non lasciare che il picker li restituisca.base64aumenta la dimensione del payload in memoria. Evitalo a meno che il servizio di ricezione non lo richieda.
Quel punto ultimo conta sui dispositivi con memoria inferiore. Una URI del file locale è di solito la scelta migliore per la preview e l'upload multipart. Il Base64 ha usi validi, ma è costoso rispetto a passare una referenza del file.
URI contro base64
Per la maggior parte degli app, la regola è semplice:
- Usa URI per le anteprime.
- Usa URI per le caricature di file.
- Usa base64 solo quando il sistema di destinazione chiede esplicitamente contenuto codificato.
Questo pattern mantiene il picker code piccolo e più facile da testare. Inoltre, si allinea con la maggior parte delle flussi di media backend, compresi i servizi che pubblicano eventualmente su piattaforme esterne, come il pubblicazione dei media di Instagram API.
Se il tuo team invia aggiornamenti OTA frequenti o sposta asset immagine pesanti attraverso la consegna dell'applicazione, le decisioni sulle dimensioni dei file qui hanno ripercussioni sulla restante pipeline. Questa guida su l'ottimizzazione delle immagini per gli aggiornamenti dell'applicazione è un utile compagno di configurazione del picker.
Un pattern di risultato più sicuro per le app reali
Per demo code, memorare solo imageUri è sufficiente. In produzione, memorare un oggetto normalizzato in modo che il passaggio successivo, anteprima, validazione, caricamento o riprova, non debba reinterpretare la risposta del picker raw ogni volta.
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['images'],
allowsEditing: true,
quality: 0.8,
});
if (result.canceled || !result.assets?.length) {
return;
}
const asset = result.assets[0];
setSelectedImage({
uri: asset.uri,
fileName: asset.fileName ?? 'upload.jpg',
mimeType: asset.mimeType ?? 'image/jpeg',
width: asset.width,
height: asset.height,
fileSize: asset.fileSize ?? null,
});
Questo ti da una forma predittiva all'interno dell'app. Ciò rende anche i progetti gestiti e bare più facili da tenere allineati perché l'app code rimane stabile mentre lavori attraverso le differenze native altrove.
Un controllo finale aiuta. Non abilitare campi di risultato aggiuntivi solo per precauzione. Richiedi i dati che sai di dover richiedere, e mantieni il picker concentrato sulla selezione piuttosto che trasformarlo in un passaggio di elaborazione dei file generale.
Patterni avanzati e differenze di piattaforma
Un feature del picker solitamente smette di essere semplice non appena l'immagine selezionata deve sopravvivere alle riprova, ai capi di autenticazione, alle differenze di autorizzazione native e a un endpoint di caricamento reale. expo-image-picker gestisce la selezione bene. Il resto della feature è a carico dell'app.

Un modello di caricamento pratico
Per API che aspettano un caricamento di file FormData è ancora il default più sicuro. Funziona su backends comuni di Rails, Node, Laravel, Django e Go, e mantiene il picker separato dalle preoccupazioni di trasporto.
async function uploadImage(imageUri: string) {
const formData = new FormData();
formData.append('file', {
uri: imageUri,
name: 'upload.jpg',
type: 'image/jpeg',
} as any);
const response = await fetch('https://your-api.example.com/uploads', {
method: 'POST',
body: formData,
headers: {
Accept: 'application/json',
},
});
if (!response.ok) {
throw new Error('Upload failed');
}
return response.json();
}
Quello code è sufficiente per dimostrare che il percorso funziona, ma le app di produzione solitamente hanno bisogno di un'altra layer. Deriva name e type dal file selezionato quando possibile, attacca l'autenticazione fuori dalla funzione del picker e mantiene lo stato di caricamento separato dall'Stato del picker, in modo che una richiesta fallita non costringa l'utente a riaprire la libreria.
Un paio di controlli prevenire le comuni fallite che vedo in revisione:
- Conferma la presenza locale
uriesiste prima di costruire la richiesta - Visualizza un anteprima prima di caricare, in modo che gli utenti possano individuare il file sbagliato presto
- Prevenire i tocchi ripetuti mentre la richiesta è in volo
- Gestisci le fallite di rete separatamente dalla cancellazione del picker o dagli errori di autorizzazione
- Spera che la validazione del backend respinga file grandi, tipi MIME non supportati o mancanti di autenticazione
Se il tuo backend richiede base64 invece di multipart, è di solito una restrizione del server, non una richiesta del picker. Multipart è più economico in termini di memoria e più facile da ragionare su dispositivi mobili.
Dove le differenze tra piattaforme hanno effettivamente importanza
L'interfaccia del picker è nativa, quindi eredita il comportamento nativo. Ciò influisce sia su cosa gli utenti vedono sia su cosa il tuo code dovrebbe assumere.
On iOS, le flussi di modifica e le richieste di autorizzazione seguono le convenzioni di Apple. L'accesso alle foto è limitato e può restituire un insieme più ristretto di asset rispetto a quanto visto nel tuo account di test su un dispositivo con accesso pieno. Su Android, il comportamento del picker varia più a seconda della versione del sistema operativo e della pelle del produttore, soprattutto intorno agli album, ai nomi dei file e a come le catture della fotocamera sono restituite. Le app React Native nate da zero sentono queste differenze più direttamente perché si possiede più della configurazione nativa, ma le app Expo gestite ancora hanno bisogno di code che tratta il picker come piattaforma-formato piuttosto che perfettamente uniforme.
La regola pratica è semplice. Dipendi dai campi che puoi validare, non dai UI identici o dai metadati identici tra dispositivi.
Un paio di esempi contano nelle app reali:
- Modifica e taglio: Il UI e il comportamento di taglio non sono identici tra iOS e Android
- Metadati restituiti:
fileName,mimeType, efileSizepossono essere assenti o inconsistenti, quindi aggiungi fallbacks - Autorizzazioni: L'accesso alle foto di iOS può essere limitato agli elementi selezionati, mentre il comportamento di Android dipende più dalla versione del sistema operativo e dal supporto del picker del sistema
- Output della fotocamera: Le immagini catturate possono tornare con caratteristiche di denominazione, orientamento o compressione diverse rispetto agli asset della libreria
If il tuo team lavora anche fuori Expo, questo Guida allo sviluppo di app con DesignStack fornisce un contesto Android utile per le decisioni di gestione dei media che si verificano oltre una singola libreria.
Differenze tra flussi di lavoro gestiti e non gestiti
A questo punto, le scelte di configurazione iniziano a contare operativamente.
Nel flusso di lavoro gestito, le stringhe di autorizzazione e la configurazione dei plugin sono solitamente presenti nella configurazione dell'app, e le modifiche native vengono applicate quando si crea una nuova build. Ciò mantiene la superficie di JavaScript pulita, ma significa che una correzione di configurazione non è visibile fino alla prossima build nativa. Le aggiornamenti OTA non riparano le autorizzazioni native mancanti.
Nel flusso di lavoro non gestito, la stessa funzionalità ha più parti in movimento. È necessario verificare le descrizioni di utilizzo iOS native, il comportamento del manifesto Android, l'installazione del pacchetto e il timing della ricostruzione da parte del team. L'aspetto positivo è il controllo. Il costo è che un problema di picker può essere causato dalla configurazione nativa, non dal sito di chiamata JavaScript.
Il team che passa da Expo a Capacitor spesso sottovaluta quanto siano diversi questi layer di astrazione. Capgo ha una spiegazione utile di come Capacitor gestisce le differenze tra piattaforme, e è un buon punto di confronto se si sta decidendo quanto setup nativo il team vuole gestire.
La mia preferenza è coerente in entrambi i flussi di lavoro. Mantieni il picker code stretto, normalizza il risultato una volta, caricalo attraverso un layer API dedicato, e trattalo come qualcosa da configurare e testare esplicitamente piuttosto che smooth over con assunzioni.
Risolvere i Problemi Comuni
La maggior parte dei bug di Expo Image Picker appartiene a una piccola serie di categorie. La soluzione più veloce è di solito identificare quale layer sta fallendo: configurazione, autorizzazione, gestione del risultato o rendering.

Verifiche rapide per fallimenti comuni
Se il picker non si apre o le autorizzazioni falliscono, controlla prima la configurazione nativa. Sono specialmente gli app bare a presentare spesso descrizioni di utilizzo iOS mancanti come causa radice.
Se l'app si blocca dopo che l'utente chiude il picker, controlla la gestione del risultato. Molti implementazioni ancora suppongono una URI diretta e saltano il canceled check.
Un paio di rapide mappature aiutano:
- Errori di autorizzazione negata: Verifica la tua configurazione dell'app e le stringhe di autorizzazione native, quindi ricostruisci.
undefinedURI dell'immagine: Leggi daresult.assets?.[0]?.uri, nonresult.uri.- Niente accade dopo l'annullamento: Ciò potrebbe essere corretto. Tratta l'annullamento come uno stato senza operazioni.
- L'immagine non si visualizza: Conferma che l'URI è stato memorizzato nello stato e passato in
<Image source={{ uri }} />. - La camera si comporta in modo strano nel simulatore: Testa sul dispositivo fisico prima di incolpare un bug del framework.
Un breve checklist di produzione
Utilizza questo come passaggio finale prima di distribuire:
- Installa con gli strumenti di Expo: Utilizza
npx expo install expo-image-picker. - Configura le parti native: Aggiungi il plugin e le descrizioni delle autorizzazioni richieste.
- Richiedi le autorizzazioni in modo intenzionale: Flussi separati per la fotocamera e la libreria dei media.
- Proteggere ogni risultato: Controlla
result.cancelede leggi in modo sicuroassets[0]. - Preferisci le upload basate su URI: Conserva la base64 solo per casi speciali.
- Testa dispositivi reali: Specialmente per la cattura della fotocamera e le richieste di autorizzazione.
Se il tuo team distribuisce applicazioni Capacitor o Electron accanto ai progetti React Native Capgo è una delle opzioni per distribuire aggiornamenti di JavaScript, CSS, configurazione e asset senza dover attendere la revisione del store per ogni cambiamento. È rilevante quando le correzioni relative alle immagini vivono nel layer web, come ad esempio l'interfaccia utente di caricamento, le regole di validazione, il testo o il trattamento degli asset intorno al flusso del picker.