44

So, i have cloned the tutorial app repo from ionic. I ran

ionic start conference sidemenu

and then i added a simple $http.get('myserver')(I tried with ngResources too).

It worked perfect on chrome, I got all the data back but on angular i only got null data and 404 status on any request I tried to do.

Note: I tried with my hosted server and with a local one. Both fail on Android. Server is a node.js REST API.

Nothing is printed on the console, so the request does not even get to the server.

Has anyone experienced that or could tell me how can I debug Android apps built with Ionic?

EDIT 1: I don`t know why do you need it but here it is

$http.get('http://server.com/route').success(function (data) {
            //handle success
        }).error(function (data, status) {
            // handle error
        });
Victor Balan
  • 1,482
  • 1
  • 10
  • 12

4 Answers4

91

The thing is that there were some major changes in Cordova 4.0.0:

Major Changes [...] - Whitelist functionality is now provided via plugin (CB-7747) The whitelist has been enhanced to be more secure and configurable Setting of Content-Security-Policy is now supported by the framework (see details in plugin readme) You will need to add the new cordova-plugin-whitelist plugin Legacy whitelist behaviour is still available via plugin (although not recommended).

So I installed the Cordova Whitelist plugin. And added

<allow-navigation href="http://*/*" />

in my config.xml file.

Huey
  • 5,110
  • 6
  • 32
  • 44
Victor Balan
  • 1,482
  • 1
  • 10
  • 12
  • 5
    Thanks. I searched for this solution more than 2 days. I cannot understand, why the Cordova is not throwing exception if access origin is not defined. – redrom May 11 '15 at 22:50
  • 2
    I found that I also had to add a Content-Security-Policy meta tag, as per http://stackoverflow.com/a/30209484/498949 – Chris Rae May 19 '15 at 00:03
  • 2
    I upvoted because it gave me definitely the push in the direction that I needed, the fix works but obviously still had to adjust it to not go all in with a wildcard. For security reasons obviously. – Segers-Ian Aug 05 '16 at 01:43
7

In my case, the problem was with cordova-plugin-whitelist plugin. I just removed the plugin and added it. Also enabled any requests by adding this code <access origin="*" /> in config.xml. Please find below commands:

You need to remove existing plugin by using below command:

ionic cordova plugin rm cordova-plugin-whitelist

Then just add it by using below command:

ionic cordova plugin add cordova-plugin-whitelist

Hope it helps.

Sandy.....
  • 2,833
  • 2
  • 15
  • 26
1

If the solutions before doesn't work on ionic 3. Thanks @rickie finally a real solution three days of maddness!!! and now is ok. Go to \platforms\android\CordovaLib\src\org\apache\cordova\engine\SystemWebViewClient.java and comment this rows:

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    try {
        // Check the against the whitelist and lock out access to the WebView directory
        // Changing this will cause problems for your application
      /*  if (!parentEngine.pluginManager.shouldAllowRequest(url)) {
            LOG.w(TAG, "URL blocked by whitelist: " + url);
            // Results in a 404.
            return new WebResourceResponse("text/plain", "UTF-8", null);
        }*/

        CordovaResourceApi resourceApi = parentEngine.resourceApi;
        Uri origUri = Uri.parse(url);
        // Allow plugins to intercept WebView requests.
        Uri remappedUri = resourceApi.remapUri(origUri);

        if (!origUri.equals(remappedUri) || needsSpecialsInAssetUrlFix(origUri) || needsKitKatContentUrlFix(origUri)) {
            CordovaResourceApi.OpenForReadResult result = resourceApi.openForRead(remappedUri, true);
            return new WebResourceResponse(result.mimeType, "UTF-8", result.inputStream);
        }
        // If we don't need to special-case the request, let the browser load it.
        return null;
    } catch (IOException e) {
        if (!(e instanceof FileNotFoundException)) {
            LOG.e(TAG, "Error occurred while loading a file (returning a 404).", e);
        }
        // Results in a 404.
        return new WebResourceResponse("text/plain", "UTF-8", null);
    }
}
Jin Lee
  • 3,194
  • 12
  • 46
  • 86
0

The local content you should, when cordova compile is a www folder, they are there assets and other folder for you implement the apk or equivalent iOS

i.e

<img src="assets/images/{your-file-name}">
Ivan Fretes
  • 668
  • 7
  • 11