【问题标题】:How to launch Navigator in cordova in ios如何在 ios 的科尔多瓦启动 Navigator
【发布时间】:2016-07-18 15:30:36
【问题描述】:

我有一个应用程序(AngularJs+cordova),我需要获取用户的当前位置并使用谷歌地图导航到目的地。

我无法让它在 iOS 中运行:

我试过了:

/* $scope.launchNavigator = function() {
    
    console.log("$scope.launchNavigator...");
    
        var deviceType = (navigator.userAgent.match(/iPad/i))  == "iPad" ? "iPad" : (navigator.userAgent.match(/iPhone/i))  == "iPhone" ? "iPhone" : (navigator.userAgent.match(/Android/i)) == "Android" ? "Android" : (navigator.userAgent.match(/BlackBerry/i)) == "BlackBerry" ? "BlackBerry" : "null";
        
        cordova.plugins.diagnostic.isLocationEnabled(onRequestSuccess, onRequestFailure);
        
        if(deviceType === 'Android'){
          cordova.plugins.locationAccuracy.request(onRequestSuccess, onRequestFailure, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
        }
        else {
          // vm.showGPSAlert = true;
          // vm.GPSTextAlert = "Please enable Location Services in Settings and Try again"
          //function onDeviceReady() {
            cordova.plugins.diagnostic.switchToLocationSettings();
            //navigator.geolocation.getCurrentPosition(onSuccess, onError);
          //}
        }
    }

    function onRequestSuccess(success){
      function onDeviceReady() {
        navigator.geolocation.getCurrentPosition(onSuccess, onError);
      }
    }

      function onSuccess(position){
          console.log('Latitude: '          + position.coords.latitude          + '\n' +
          'Longitude: '         + position.coords.longitude         + '\n' +
          'Altitude: '          + position.coords.altitude          + '\n' +
          'Accuracy: '          + position.coords.accuracy          + '\n' +
          'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
          'Heading: '           + position.coords.heading           + '\n' +
          'Speed: '             + position.coords.speed             + '\n' +
          'Timestamp: '         + position.timestamp                + '\n');
        
            latitudeStart = position.coords.latitude;
            longitudeStart = position.coords.longitude;

            launchnavigator.isAppAvailable(launchnavigator.APP.GOOGLE_MAPS, function(isAvailable){
              var app;
              console.log("Location navigate .lat." + )
              if(isAvailable){
                  app = launchnavigator.APP.GOOGLE_MAPS;
              }else{
                  console.warn("Google Maps not available - falling back to user selection");
                  app = launchnavigator.APP.USER_SELECT;
              }
              launchnavigator.navigate([vm.dest.latitude,vm.dest.longitude], {
                  app: app,
                  start: [latitudeStart,longitudeStart]
              });
          });
        }
        
        function onError(){
          
      }

      function onRequestFailure(error){
            console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
            if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                if(window.confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                    cordova.plugins.diagnostic.switchToLocationSettings();
                }
            }
      }*/

对于 android,以下工作:

      /*Get Direction*/

    function onDeviceReady() {
      //window.open = cordova.InAppBrowser.open;
      console.log("Hello... Device redy");

      var latitudeStart = '';
      var longitudeStart = '';

      $scope.launchNavigator = function() {
        
        function onRequestSuccess(success){
            console.log("Successfully requested accuracy: "+success.message);

            if(navigator.geolocation){ 
              console.log("navigator.geolocation works well");
            }
            else{
             console.log("navigator.geolocation doesnt works well");
            }

        console.log("Luanch navigate..");

        var onSuccess = function(position) {
        console.log('Latitude: '          + position.coords.latitude          + '\n' +
              'Longitude: '         + position.coords.longitude         + '\n' +
              'Altitude: '          + position.coords.altitude          + '\n' +
              'Accuracy: '          + position.coords.accuracy          + '\n' +
              'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
              'Heading: '           + position.coords.heading           + '\n' +
              'Speed: '             + position.coords.speed             + '\n' +
              'Timestamp: '         + position.timestamp                + '\n');
            
            latitudeStart = position.coords.latitude;
            longitudeStart = position.coords.longitude;

            launchnavigator.isAppAvailable(launchnavigator.APP.GOOGLE_MAPS, function(isAvailable){
              var app;
              if(isAvailable){
                  app = launchnavigator.APP.GOOGLE_MAPS;
              }else{
                  console.warn("Google Maps not available - falling back to user selection");
                  app = launchnavigator.APP.USER_SELECT;
              }
              launchnavigator.navigate([vm.dest.latitude,vm.dest.longitude], {
                  app: app,
                  start: [latitudeStart,longitudeStart]
              });
          });
        };

        // onError Callback receives a PositionError object
        //
        function onError(erro) {
            console.log('code: '    + error.code    + '\n' +
                  'message: ' + error.message + '\n');
        }

        navigator.geolocation.getCurrentPosition(onSuccess, onError,{enableHighAccuracy:true});
      }

        function onRequestFailure(error){
            console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
            if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                if(window.confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                    cordova.plugins.diagnostic.switchToLocationSettings();
                }
            }
        }

        cordova.plugins.locationAccuracy.request(onRequestSuccess, onRequestFailure, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);


        
      }

【问题讨论】:

    标签: javascript android ios angularjs cordova


    【解决方案1】:

    以上不适用于 iOS 和 Android

    首先,我会使用cordova-plugin-device 来确定平台而不是用户代理嗅探——它更健壮。

    其次,您似乎有一个依赖于 deviceready 事件的函数,该事件在插件结果的成功结果上被调用:

    function onRequestSuccess(success){
      function onDeviceReady() {
        navigator.geolocation.getCurrentPosition(onSuccess, onError);
      }
    }
    

    Cordova 插件是在调用 deviceready 事件之前动态加载的,因此可能永远不会调用内部函数。

    第三,cordova.plugins.diagnostic.isLocationEnabled()cordova.plugins.locationAccuracy.request() 的成功回调函数似乎是onRequestSuccess()。 前者都是串行同步调用的,但是它们的回调是异步调用的,所以这很可能会导致问题。

    我会尝试这样的:

    function onDeviceReady(){
        console.log("onDeviceReady...");
    
        $scope.launchNavigator = function() {
            console.log("$scope.launchNavigator...");
    
            cordova.plugins.diagnostic.isLocationEnabled(function(enabled){
                if(!enabled){
                    if(device.platform === 'Android'){
                      cordova.plugins.locationAccuracy.request(getCurrentPosition, 
                        function(error){
                            console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
                            if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                                if(window.confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                                    cordova.plugins.diagnostic.switchToLocationSettings();
                                }
                            }
                        }, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
                    }
                    else {
                      // vm.showGPSAlert = true;
                      // vm.GPSTextAlert = "Please enable Location Services in Settings and Try again"
                      //function onDeviceReady() {
                        cordova.plugins.diagnostic.switchToLocationSettings();
                        //navigator.geolocation.getCurrentPosition(onSuccess, onError);
                      //}
                    }
                }else{
                    getCurrentPosition();
                }
    
            }, function onLocationEnabledFailure(error){
                console.error("Failed to check if location is enabled");
            });
    
            function getCurrentPosition(){
                navigator.geolocation.getCurrentPosition(onSuccess, onError);
            }
    
            function onSuccess(position){
              console.log('Latitude: '          + position.coords.latitude          + '\n' +
              'Longitude: '         + position.coords.longitude         + '\n' +
              'Altitude: '          + position.coords.altitude          + '\n' +
              'Accuracy: '          + position.coords.accuracy          + '\n' +
              'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
              'Heading: '           + position.coords.heading           + '\n' +
              'Speed: '             + position.coords.speed             + '\n' +
              'Timestamp: '         + position.timestamp                + '\n');
    
                latitudeStart = position.coords.latitude;
                longitudeStart = position.coords.longitude;
    
                launchnavigator.isAppAvailable(launchnavigator.APP.GOOGLE_MAPS, function(isAvailable){
                  var app;
                  console.log("Location navigate .lat." + )
                  if(isAvailable){
                      app = launchnavigator.APP.GOOGLE_MAPS;
                  }else{
                      console.warn("Google Maps not available - falling back to user selection");
                      app = launchnavigator.APP.USER_SELECT;
                  }
                  launchnavigator.navigate([vm.dest.latitude,vm.dest.longitude], {
                      app: app,
                      start: [latitudeStart,longitudeStart]
                  });
              });
            }
    
            function onError(positionError){
                // Handle Error
            }
    
        } //$scope.launchNavigator
    }// onDeviceReady
    

    一般来说,我强烈建议您分别在 iOS 和 Android 设备上运行时使用 Safari 远程调试和 Chrome 远程调试工具来调试您的应用。 使用带有适当断点的逐步调试器将突出显示代码 sn-p 中存在的问题。 有关详细信息,请参阅 Cordova 文档中的 Debugging Cordova apps 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多