A few days ago a reader posted a comment to a blog post I wrote that demonstrated a simple RSS reader built with the Ionic framework. Looking over the code I had written for that demo I realized there was a lot of room for improvement. I'm still no Angular expert, but I've learned a few things over the past few months and decided to update the code base. I thought it might be interesting to point out what I changed (especially if people better at Angular want to correct me) so folks could compare the differences.
I made three major changes to the code base. The first was to tweak how I handle Cordova's deviceready event within the Ionic code. Previously I had the default Ionic "run" code inside my controller. That was messy and not necessary, so I moved it back to the run
method in app.js:
.run(function($ionicPlatform, $rootScope, $location) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
}
});
$rootScope.goHome = function() {
$location.path('/entries');
};
});
That cleaned up my controller a bit. Next, I added a service. When I first started working with Angular, I did almost everything in controllers because that was simpler, but it also made my code messy (imo). I moved all the logic of RSS parsing into its own service.
(function() {
/* global angular,window,cordova,console */
angular.module('rssappServices', [])
.factory('rssService', function($http,$q) {
var entries;
return {
getEntries: function(url) {
var deferred = $q.defer();
console.log('getEntries for '+url);
if(entries) {
console.log('from cache');
deferred.resolve(entries);
} else {
google.load("feeds", "1",{callback:function() {
console.log('googles init called');
var feed = new google.feeds.Feed(url);
feed.setNumEntries(10);
feed.load(function(result) {
entries = result.feed.entries;
deferred.resolve(entries);
});
}});
}
return deferred.promise;
}
};
});
}());
Note the use of deferreds here to handle the async nature of Google's RSS parsing. The end result of these two changes is a much simpler controller.
.controller('HomeCtrl', ['$ionicPlatform', '$scope', '$rootScope', '$cordovaNetwork', '$ionicLoading', '$location', 'rssService', 'settings', function($ionicPlatform, $scope, $rootScope, $cordovaNetwork, $ionicLoading, $location, rssService, settings) {
$ionicLoading.show({
template: 'Loading...'
});
$ionicPlatform.ready(function() {
console.log("Started up!!");
if($cordovaNetwork.isOnline()) {
rssService.getEntries(settings.rss).then(function(entries) {
$ionicLoading.hide();
$rootScope.entries = entries;
$location.path('/entries');
});
} else {
console.log("offline, push to error");
$ionicLoading.hide();
$location.path('/offline');
}
});
}])
The final change was how I set the title and RSS URL of the app. I had used rootScope variables before, but now I'm using Angular Constants, which is something I just discovered about a month or so ago:
.constant("settings", {
title:"Raymond Camden's Blog",
rss:"http://feeds.feedburner.com/raymondcamdensblog"
})
All in all, not a huge amount of changes, but it "feels" a heck of lot better architected now. As I said in the beginning, I welcome comments/criticisms about the techniques here - just post a comment. You can find the full source code here: https://github.com/cfjedimaster/Cordova-Examples/tree/master/rssreader_ionic
Archived Comments
First, very good idea to wrap the complete RSS loading logic into a service, that's what they are made for.
Additional one question/hint: As you are using the ui-router, why not use $state.go('') for your route changes? I think state.go also feels better when you have already defined states in your config! SO link to this topic: http://stackoverflow.com/qu...
Anyway, great read!
Why? Because I didn't know better. :) Thanks for sharing that!
Is it possible to pull images as well and place them on the left of the content?
hello,
I'm trying to run this new ionic example, but it does not work properly.
I have a ubuntu 14.04 + a ionic working environment.
(your previous rssreader works fine in my system under phonegap)
now I created an empty project with inic
$ ionic start e-rssreader-ionic blanck
$ ionic platform add android
$ cordova plugin add cordova-plugin-inappbrowser
$ cordova plugin add cordova-plugin-network-information
Then I replaced the www folder with yours, just downloaded from github.
launched the preview with
$ ionic serve
... but the browser (Chrome) load only the header and remains with the message "loading ..."
(please have a look to the picture in attachment)
Here the errors in the console:
-------------
ionic $ c
Console log output: enabled
Loading: /?restart=605278
ionic $ 0 723850 log Started up!!
1 723867 error TypeError: Cannot read property 'type' of undefined
at Object.isOnline (http://localhost:8100/lib/ng-cordova.js:46:48)
at http://localhost:8100/js/controllers.js:17:23
at http://localhost:8100/lib/ionic/js/ionic.bundle.js:44815:19
at Object.ionic.Platform.ready (http://localhost:8100/lib/ionic/js/ionic.bundle.js:2120:9)
at Object.self.ready (http://localhost:8100/lib/ionic/js/ionic.bundle.js:44813:26)
at new <anonymous> (http://localhost:8100/js/controllers.js:13:18)
at invoke (http://localhost:8100/lib/ionic/js/ionic.bundle.js:12884:17)
at Object.instantiate (http://localhost:8100/lib/ionic/js/ionic.bundle.js:12892:27)
at http://localhost:8100/lib/ionic/js/ionic.bundle.js:17161:28
at self.appendViewElement (http://localhost:8100/lib/ionic/js/ionic.bundle.js:48253:24)
-------------
can you help me to understand where is my error, please?
MaX
I *think* I remember looking into this before and the Google API did not return Media properties from a RSS feed. The best thing to do is just try it and see. If their API returns it, then you would just look for it in the results and display it. Please let me know what you find.
You can't use the offline/online detection while running in a browser. You'll need to test in an emulator or a device.
Thanks for the tip - I've switched my code to use state.go.
Hello Raymond,
Does cordova things like "cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);" works in a MobileFirst application?
Right now - no - not as far as I know. I've been disabling them.
sorry, but it do not works. I have built it, and both emulator and my motoG phone have the same problem.
There is something that i'm make wrong in the setup of this project.
Are you using a no standart ionic blank proj?
Can you confirm the plugins exist? Can you confirm you have the same error in console?
Hi,
below you can found the console log from emulator (it's large):
and the plugins exists
max@u9200:~/ionic/e-rssreader-ionic$ ls plugins
android.json
cordova-plugin-network-information
cordova-plugin-inappbrowser
fetch.json
max@u9200:~/ionic/e-rssreader-ionic$ cat plugins/android.json | grep -A6 "installed_plugins"
"installed_plugins": {
"cordova-plugin-inappbrowser": {
"PACKAGE_NAME": "com.ionicframework.starter"
},
"cordova-plugin-network-information": {
"PACKAGE_NAME": "com.ionicframework.starter"
}
max@u9200:~/ionic/e-rssreader-ionic$
Here the log when I start the app Hellocordova (containing your rss-reader), but I can't interpretate it,
-------------
Console Log
--------------
W/AudioTrack( 1220): AUDIO_OUTPUT_FLAG_FAST denied by client
I/art ( 2126): Not late-enabling -Xcheck:jni (already on)
I/WebViewFactory( 2126): Loading com.android.webview version 39 (1737576-x86) (code 300007)
I/LibraryLoader( 2126): Time to load native libraries: 27 ms (timestamps 2192-2219)
I/LibraryLoader( 2126): Expected native library version number "",actual native library version number ""
V/WebViewChromiumFactoryProvider( 2126): Binding Chromium to main looper Looper (main, tid 1) {1a465765}
I/LibraryLoader( 2126): Expected native library version number "",actual native library version number ""
I/chromium( 2126): [INFO:library_loader_hooks.cc(104)] Chromium logging enabled: level = 0, default verbosity = 0
I/BrowserStartupController( 2126): Initializing chromium process, singleProcess=true
W/art ( 2126): Attempt to remove local handle scope entry from IRT, ignoring
W/chromium( 2126): [WARNING:resource_bundle.cc(304)] locale_file_path.empty()
I/chromium( 2126): [INFO:aw_browser_main_parts.cc(65)] Load from apk succesful, fd=30 off=46184 len=3037
I/chromium( 2126): [INFO:aw_browser_main_parts.cc(78)] Loading webviewchromium.pak from, fd:31 off:229484 len:1089587
W/AudioManagerAndroid( 2126): Requires BLUETOOTH permission
D/ ( 2126): HostConnection::get() New Host Connection established 0xb3fb9460, tid 2126
W/chromium( 2126): [WARNING:mailbox_synchronize...(41)] MailboxSync not supported due to missing EGL image/fence support
W/chromium( 2126): [WARNING:data_reduction_prox...(331)] SPDY proxy OFF at startup
W/art ( 2126): Attempt to remove local handle scope entry from IRT, ignoring
W/AwContents( 2126): onDetachedFromWindow called when already detached. Ignoring
D/SystemWebViewEngine( 2126): CordovaWebView is running on device made by: unknown
W/art ( 2126): Attempt to remove local handle scope entry from IRT, ignoring
W/art ( 2126): Attempt to remove local handle scope entry from IRT, ignoring
D/OpenGLRenderer( 2126): Use EGL_SWAP_BEHAVIOR_PRESERVED: true
D/Atlas ( 2126): Validating map...
V/WindowManager( 1220): Adding window Window{2c1b28d7 u0 com.ionicframework.starter/com.ionicframework.starter.MainActivity} at 5 of 9 (before Window{2f9eaf01 u0 Starting com.ionicframework.starter})
I/OpenGLRenderer( 2126): Initialized EGL, version 1.4
D/ ( 2126): HostConnection::get() New Host Connection established 0xa54578a0, tid 2166
D/OpenGLRenderer( 2126): Enabling debug mode 0
W/EGL_emulation( 2126): eglSurfaceAttrib not implemented
W/OpenGLRenderer( 2126): Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5528ec0, error=EGL_SUCCESS
I/ActivityManager( 1220): Displayed com.ionicframework.starter/.MainActivity: +982ms
D/JsMessageQueue( 2126): Set native->JS mode to OnlineEventsBridgeMode
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
D/CordovaNetworkManager( 2126): Connection Type: 3g
D/CordovaNetworkManager( 2126): Connection Extra Info: epc.tmobile.com
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
D/CordovaNetworkManager( 2126): Connection Type: 3g
D/CordovaNetworkManager( 2126): Connection Extra Info: epc.tmobile.com
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
I/chromium( 2126): [INFO:CONSOLE(43)] "Uncaught TypeError: Cannot read property 'Keyboard' of undefined", source: file:///android_asset/www/js/app.js (43)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon( 2126): glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
E/eglCodecCommon( 2126): **** ERROR unknown type 0x0 (glSizeof,72)
D/TaskPersister( 1220): removeObsoleteFile: deleting file=14_task.xml
D/TaskPersister( 1220): removeObsoleteFile: deleting file=14_task_thumbnail.png
^AI/UsageStatsService( 1220): User[0] Flushing usage stats to disk
------------
Do not use the log from the emulator - rather - connect to the emulator with Chrome Remote Debugging. That will give you a much smaller log to work with.
Ok, it looks to be this: 'Keyboard' of undefined. Ensure you have the Ionic Keyboard plugin. It is supposed to be added by default.
I have installed the keyboard plugins with:
$ cordova plugin add https://github.com/driftyco...
...but the app still not working, and the chrome log is telling me something strange:
----------------------------
https://www.google.com/jsapi Failed to load resource: the server responded with a status of 404 (Not Found)
controllers.js:15 Started up!!
services.js:13 getEntries for http://feeds.feedburner.com...
services.js:18 Uncaught ReferenceError: google is not defined
---------------------------
404 from https://www.google.com/jsapi??
...but as you can see in the picture in attachment, the emulator can found this javascript in internet
...and the error "google is not defined" ?
Just in case... you can found the project in my drive.
It's your rss-reader in a blank ionic projet with the plugins and android platform.
https://drive.google.com/fi...
I founded this http://stackoverflow.com/qu...
Oh.... that's different. So sure, you can search the content for an image. But the RSS spec itself supports an image property. That's what I thought you meant.
Hi
could tell me please, witch version of cordova-plugin-network-information are using you?
and witch ionic-cli version? (i'm using the 1.5.5 and it don't install the keyboard plugins as default)
with your app freezing in "loading", in the chrome console log I have this error:
TypeError: Cannot read property 'type' of undefined - ionic.bundle.js:20306
at Object.isOnline (ng-cordova.js:46)
at controllers.js:17
at ionic.bundle.js:44815
at Object.ionic.Platform.ready (ionic.bundle.js:2120)
at Object.IonicModule.constant.provider.$get.self.ready (ionic.bundle.js:44813)
at new <anonymous> (controllers.js:13)
at invoke (ionic.bundle.js:12884)
at Object.instantiate (ionic.bundle.js:12892)
at ionic.bundle.js:17161
at IonicModule.controller.self.appendViewElement (ionic.bundle.js:48253)
ionic.bundle.js:20306
I'm using the most recent network plugin and the most recent ionic (1.5.5). You are testing on a device or the emulator, right? For me, new Ionic projects add the keyboard plugin by default.
http://www.zazar.net/develo...
zrss feed do this, it mean you should load the json/XML to find all media and other stuff, enclosure, ect. in the rss.
i tested it here to load media enclosure with some modification in zrss to show it the way i wanted.
http://scripts.toolurl.com/...
Hi Raymond, Google has closed the google.feed api, so we can't use:
var feed = new google.feeds.Feed(url);
...anymore... do you know an alternative?
Unfortunately no. I'm going to start looking and worse comes to worse, start building my own.
diving into the sea of google, i have found this code, that is no using google.feeds, and is simple to run and fast to use.
If you publish a Entry in your blog, the feed will be displayed immediatly on the rss client. (with google.feeds, after 1 hours)
here the zip.
http://openaccess.uoc.edu/w...
I think that the code came from an university of spain and it's free.
The problem: It's in spanish but is quite simple to translate.
If you change the comments in js/presentacion.js, of the following lines:
//description:$.trim($(v).find("description").text()),
description:$.trim($(v).find("encoded").text()),
you can read the entire Entry of a Wordpress feed.
I hope that you can help and you can adapt it to your ionic proj,
regards
MaX
I've done a bit of research and I plan on blogging some options this week. I will probably forget to comment back, so please subscribe to the blog.
haw can i get get enclosure url like audio file
Did you look at the data returned by Google's Feeds API? It should be in there. If not, you need to parse the RSS yourself. You should also see this: http://www.raymondcamden.co...
I just found this api for converting RSS to JSON. http://rss2json.com
i am running the latest version of IONIC V2 and i am still geting the loading screen like the the other person
both plug-ins are in for me also ...
What do you see when you remote debug?