1

AIR for iOS アプリを開発していますが、修正すべきバグのリストにこの 1 つの問題だけが残っています。基本的に、特定のウィンドウが開かれると、ユーザーは現在の位置を使用して検索できます。これには 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を取得する代わりにnew をインスタンス化しています。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 に答える