2013-05-09 6 views
1

Я разрабатываю приложение AIR для iOS, и у меня есть только одна проблема, оставленная в моем списке ошибок для исправления. В принципе, при открытии определенного окна пользователь может использовать свою текущую позицию для поиска. Для этого я использую класс Geolocation, и он отлично работает, за исключением того факта, что StatusEvent.STATUS не срабатывает. Пользователю будет предложено дать разрешение на использование своего текущего местоположения, как и должно быть, но когда они выберут, мой обработчик StatusEvent никогда не вызывается.Geolocation StatusEvent Never Fires

if (Geolocation.isSupported) { 
    var geo:Geolocation = new Geolocation(); 
    geo.addEventListener(StatusEvent.STATUS, this.geolocationStatusHandler); 
    this.geolocationStatusHandler(); 
} 

protected function geolocationStatusHandler(e:StatusEvent = null):void{ 
    var geo:Geolocation = new Geolocation(); 
    this.gpsButton.enabled = !geo.muted; 
} 

Единственное, что я могу думать о том, что окно предупреждения (которое замораживает выполнение приложения) открывается с новой геолокации(), прежде чем я добавить слушателя событий. Но если бы это было так, вызов обработчика вручную не произошел бы до тех пор, пока пользователь не закроет предупреждение (это происходит в то же время, примерно). Точка останова останавливает приложение, когда предупреждение открыто)

Есть ли решение для этого? Я всегда мог переместить подсказку в самое начало приложения, но лично я предпочитаю не запрашивать ее до тех пор, пока она не понадобится.

Детали:

  • ActionScript Мобильный проект построен с AIR 3.6 SDK
  • Испытано на Ipad 2, 3 и Mini, все работает IOS 6.1.3
  • Испытано в обоих выпуска и отладки режимов

ответ

2

Слушайте событие GeolocationEvent.UPDATE.

Кроме того, похоже, что вы вручную вызываете обработчик сразу после слушателя; то ваш обработчик создает экземпляр нового Geolocation вместо получения GeolocationEvent широты и долготы.

Пример реализации с использованием Google API геокодирования из XpenseIt урока:

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.GeolocationEvent; 
    import flash.sensors.Geolocation; 

    import mx.rpc.AsyncResponder; 
    import mx.rpc.AsyncToken; 
    import mx.rpc.events.FaultEvent; 
    import mx.rpc.events.ResultEvent; 
    import mx.rpc.http.HTTPService; 

    [Event(name="locationUpdate", type="flash.events.Event")] 
    public class GeolocationUtil extends EventDispatcher 
    { 
     protected var geo:Geolocation; 
     public var updateCount:int; 
     protected var service:HTTPService = new HTTPService(); 

     public var location:String; 
     public var longitude:Number; 
     public var latitude:Number; 

     public function GeolocationUtil() 
     { 
      service.url = "https://maps.googleapis.com/maps/api/geocode/xml"; 
     } 

     public function geoCodeAddress(address: String):AsyncToken 
     { 
      return service.send({address: address, sensor: Geolocation.isSupported}); 
     } 

     public function getLocation():void 
     { 
      if (Geolocation.isSupported) 
      { 
       geo = new Geolocation(); 
       geo.setRequestedUpdateInterval(500); 
       updateCount = 0; 
       geo.addEventListener(GeolocationEvent.UPDATE, locationUpdateHandler);     
      } 
     } 

     protected function locationUpdateHandler(event:GeolocationEvent):void 
     { 
      // Throw away the first location event because it's almost always the last known location, not current location 
      updateCount++; 
      if (updateCount == 1) return; 

      if (event.horizontalAccuracy <= 150) 
      { 
       trace("lat:" + event.latitude + " long:" + event.longitude + " horizontalAccuracy:" + event.horizontalAccuracy); 
       geo.removeEventListener(GeolocationEvent.UPDATE, locationUpdateHandler); 
       geo = null; 
      } 

      longitude = event.longitude; 
      latitude = event.latitude; 

      var token:AsyncToken = service.send({latlng: latitude+","+longitude, sensor: Geolocation.isSupported}); 
      token.addResponder(new AsyncResponder(
       function(event:ResultEvent, token:AsyncToken):void 
       { 
        // Map the location to city and state from the response address component 
        location = event.result.GeocodeResponse.result[0].address_component[3].long_name + ', '+ event.result.GeocodeResponse.result[0].address_component[5].long_name; 
        dispatchEvent(new Event("locationUpdate")); 
       }, 
       function (event:FaultEvent, token:AsyncToken):void 
       { 
        // fail silently 
        trace("Reverse geocoding error: " + event.fault.faultString); 
       })); 
     } 

    } 
} 
+0

Что вы знаете. Создание второго объекта геолокации перекрывало слушателей на первом объекте. Переключение на один объект зафиксировало это. Теперь я должен был подумать об этом. И да, UPDATE предназначен исключительно для получения позиции lat/long и не отправляет, когда пользователь меняет настройки местоположения. Спасибо, что указал на мою глупость. –