title: Unable to send ajax get requests with Meteor on Android *only*
body: <p>I’ve got several Meteor apps that heavily rely on ajax get requests. At some point, one of these apps stopped being able to send ajax get requests, on recent versions of Android, only.
  The same app works in the browser, on iOS, and on older versions of Android. (Or rather, on a Fire tablet.) So, I take this to mean this is not a CORS issue.
  Other apps, using the same code, are not affected, on any platform.</p>
  
  <p>It appears to me that Android is blocking the requests, and I don’t understand how to make this work.</p>
  
  <p>Also, I've not found a device with recent version of Android where this <em>does</em> work, meaning it's not just my phone.</p>
  
  <p>This is an example request:</p>
  
  <pre><code>$.ajax({
      type: "GET",
      traditional: true,
      url: url,
      contentType: 'application/json; charset=utf-8',
      dataType: "json",
      data: {},
      success: function (result) {
          ...
      },
      error: function (xhr) {
      var propValue;
      for(var propName in xhr) {
          propValue = xhr[propName]
  
          $("#log").prepend(propName + ": " + propValue + "&lt;br /&gt;");
      }
  
      }
  });
  </code></pre>
  
  <p>This is the output:</p>
  
  <pre><code>statusText: error
  status: 0
  responseText:
  error: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  success: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  complete: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  progress: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  fail: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  done: function(){return o&amp;&amp;(n&amp;&amp;!t&amp;&amp;(s=o.length-1,a.push(n)),function t(n){p.each(n,(function(n,r){p.isFunction®?e.unique&amp;&amp;l.has®||o.push®:r&amp;&amp;r.length&amp;&amp;“string”!==p.type®&amp;&amp;t®}))}(arguments),n&amp;&amp;!t&amp;&amp;u()),this}
  pipe: function(){var e=arguments; return p.Deferred((function(n){p.each(t,(function(t,o){var a=p.isFunction(e[t])&amp;&amp;e[t]; i[o[1]]((function(){var e=a&amp;&amp;a.apply(this,arguments); e&amp;&amp;p.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):no[0]+“With”}))})),e=null})).promise()} promise: function(e){return null!=e?p.extend(e,r):r}
  then: function(){var e=arguments; return p.Deferred((function(n){p.each(t,(function(t,o){var a=p.isFunction(e[t])&amp;&amp;e[t]; i[o[1]]((function(){var e=a&amp;&amp;a.apply(this,arguments); e&amp;&amp;p.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):no[0]+“With”}))})),e=null})).promise()}
  always: function(){return i.done(arguments).fail(arguments),this}
  state: function(){return n}
  abort: function(e){var t=e||w; return l&amp;&amp;l.abort(t),C(0,t),this}
  statusCode: function(e){var t; if(e)if(b&lt;2)for(t in e)v[t]=[v[t],e[t]]; else T.always(e[T.status]); return this}
  overrideMimeType: function(e){return b||(f.mimeType=e),this}
  setRequestHeader: function(e,t){var n=e.toLowerCase(); return b||(e=x[n]=x[n]||e,y[e]=t),this}
  getAllResponseHeaders: function(){return 2===b?a:null}
  getResponseHeader: function(e){var t; if(2===b){if(!c)for(c={}; t=Pt.exec(a); )c[t[1].toLowerCase()]=t[2]; t=c[e.toLowerCase()]}return null==t?null:t}
  readyState: 0
  </code></pre>
  
  <p>Any insight would be greatly appreciated.</p>