cordova - Angular 2/ionic 2 lese json-fil fra lokal enhets filsystem


Jeg jobber med en app med et spesielt krav - appen fungerer offline og har en "sync"-mekanisme. Det betyr at brukeren på forespørsel kan synkronisere appen med serverne. Jeg implementerte en prosess som bruker Cordovas 'FileTransfer' og Node til å generere en json-fil med de nyeste dataene, og laster den ned til det lokale filsystemet. Nå trodde jeg naivt at jeg bare kunne hente dataene ved hjelp av en standard HTTP-forespørsel til denne filen. Men det fungerte ikke. Så jeg undersøkte logcat på enheten min og fant ut at det ikke er mulig å utføre HTTP-forespørsler til 'file://'-protokollen. Mens jeg skriver disse linjene gir det faktisk mening.

Hvordan kan jeg gjøre det uansett? Hvordan kan jeg hente en fil fra filsystemet? Finnes det en måte å late som om en tjeneste kjører på enheten eller noe sånt?

Takk!

Svar #1

Problemet skyldes forskjellige baner til json-filer på lokal nettleser (datamaskin) og enhet (Android). Opprett en data-mappe inne i src\assets-mappen. Flytt json-filen din dit.

Når vi kjører ionic serve, vil det flytte den mappen (med filen) inn i www\assets-mappen. Gjør deretter følgende ting:

  1. Importer Platform-tjenesten fra ionic2

     import { Platform } from 'ionic-angular';
    
  1. Injiser Platform tjeneste.

      constructor(private http: Http, private platform: Platform ) { }
    
  1. Bruk Platform-tjenesten.

    public getItems() {
    
        var url = 'assets/data/Items.json'; 
    
        if (this.platform.is('cordova') && this.platform.is('android')) {
            url = "/android_asset/www/" + url;
        }
    
        return this.http.get(url)
            .map((res) => {
                return res.json()
            });
    }
    

Svar #2

Bare bruk "assets/data/Items.json" i stedet for "/assets/data/Items.json" som filbane. Det vil fungere både i nettleser og på Android-enhet.

    this.http.get('assets/path/to/file').success((res) => {
       console.log(res);
    });

Relaterte artikler