cordova - Angular 2/ionic 2 yerel cihaz dosya sisteminden json dosyası okuma


Özel bir gereksinimi olan bir uygulama üzerinde çalışıyorum - uygulama çevrimdışı çalışıyor ve bir "senkronizasyon" mekanizmasına sahip. Bu, kullanıcının talep üzerine uygulamayı sunucularla senkronize edebileceği anlamına geliyor. Cordova'nın 'FileTransfer' ve node kullanarak en güncel verilerle bir json dosyası üreten ve bunu yerel dosya sistemine indiren bir süreç uyguladım. Şimdi, saf bir şekilde bu dosyadan standart bir http isteği ile veri alabileceğimi düşündüm. Ama işe yaramadı. Bu yüzden cihazımın logcat'ini inceledim ve 'file://' protokolüne http isteği göndermenin mümkün olmadığını gördüm. Bu satırları yazarken aslında mantıklı geliyor.

Peki bunu her halükarda nasıl yapabilirim? Dosya sisteminde bir dosyayı nasıl alabilirim? Cihazda çalışan bir servisi sahte olarak oluşturmanın bir yolu var mı yoksa başka bir şey mi?

Teşekkürler!

Cevap #1

Sorun, json dosyalarının yerel tarayıcıda (bilgisayar) ve cihazda (android) farklı yollarına sahip olmasından kaynaklanıyor. src\assets klasörü içinde data klasörü oluşturun. Json dosyanızı buraya taşıyın.

ionic serve komutunu çalıştırdığımızda, o klasörü (ve dosyayı) www\assets klasörüne taşıyacaktır. Sonra aşağıdaki şeyleri yapın:

  1. ionic2 servisinin Platform öğesini içe aktarın

     import { Platform } from 'ionic-angular';
    
  1. Platform Servisini Enjekte Et.

      constructor(private http: Http, private platform: Platform ) { }
    
  1. Platform Servisini kullanın.

    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()
            });
    }
    

Cevap #2

Dosya yolu olarak "/assets/data/Items.json" yerine sadece "assets/data/Items.json" kullanın. Hem tarayıcıda hem de Android cihazında çalışacaktır.

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

İlgili makaleler