$http.get doesn't work when live-testing on iOS


#1

My app works great on Android and in the browser, but on my iPhone 4s running iOS 9.2.1, my initial $http.get doesn’t complete, nor does it throw an error.

I’ve read about needing to install the whitelist plugin, which I did. I also installed an npm package (https://www.npmjs.com/package/cordova-plugin-transport-security) which added the required lines into AppName-info.plist just fine, but no matter what I do, my $http.get simply won’t run, even though the website in question is https.

Full disclosure: Tonight is the second time I’ve ever touched Xcode, my first time being about five years prior to fiddle with Objective-C

Here’s the code in question that doesn’t run:

.factory('aceFactory', ["$http", "$q", function($http, $q, $rootScope) {
  return {
    service: "https://api.example.com/v1/?type=all",
    loadData: function(lat, long) {
      var deferred = $q.defer()
      $http.get(this.service + "&source=app&lat=" + lat + "&long=" + long + "&tz=" + new Date().getTimezoneOffset(), {
        timeout: 15000
      }).then(function(data) {
        deferred.resolve(data.data)
      }, function(err) {
        alert(err.data.message)
      });
      return deferred.promise
    }
  }
}])

The code code doesn’t even time out after 15 seconds, it just sits there with the spinner (that is shown before the $http.get call) and never progresses, even after half an hour of waiting.

Anyone come across this issue yet?


#2

#3

So my plist file is fine (contains the same lines as what is shown in the gist you posted), but my $http.get still won’t complete.


#4

Right, so I’ve made some progress on this. I discovered that if I manually call the function that does the $http.get call (it currently runs $ionicPlatform.ready), then my app actually does load. The $http.get call simply wasn’t firing on ready(), but runs just fine when I run it myself

For reference, I set Mobile Safari to allow remote debugging, then went into Safari, turned on developer mode, then opened the web inspector for the iPhone, on my Mac. Then I manually ran: angular.element($0).scope().loadData() which actually tried to load my data, then succeeded

But any explanations as to why I have to do that and why $ionicPlatform.ready doesn’t work as expected, would be greatly appreciated.


#5

After hours of fiddling, working with remote debugging in Safari and tons of console.log calls, plus barking up several wrong trees, I figured out that my geolocation calls were failing and not raising an error. I installed the cordova geolocation plugin (instead of using the browser implementation) and immediately got asked if I wanted to allow the app to use my location.

Now my data loads perfectly every time.