1

我正在开发一个 AIR for iOS 应用程序,我的错误列表中只剩下一个问题要修复。基本上,当打开某个窗口时,用户可以使用他们当前的位置进行搜索。我为此使用了 Geolocation 类,它工作正常,除了 StatusEvent.STATUS 没有触发。提示用户授予使用其当前位置的权限,这是应该的,但是当他们选择时,我的 StatusEvent 处理程序永远不会被调用。

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;
}

我唯一能想到的是,在我添加事件侦听器之前,使用 new Geolocation() 打开了警报窗口(冻结应用程序执行)。但如果是这种情况,直到用户关闭警报之后才会手动调用处理程序(它大致同时发生。那里的断点会在警报打开时停止应用程序)

有解决方案吗?我总是可以将提示移到应用程序的开头,但我个人更喜欢在需要之前不提示。

细节:

  • 使用 AIR 3.6 SDK 构建的 ActionScript Mobile 项目
  • 在运行 iOS 6.1.3 的 iPad 2、3 和 Mini 上测试
  • 在发布和调试模式下测试
4

1 回答 1

2

监听GeolocationEvent.UPDATE事件。

此外,您似乎在侦听器之后立即手动调用处理程序;那么你的处理程序正在实例化一个新Geolocation的而不是获取GeolocationEvent纬度和经度。

使用XpenseIt教程中的 Google Geocoding API 的示例实现:

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);
                }));
        }

    }
}
于 2013-05-09T21:26:42.193 回答