如何在ios中在cordova中启动Navigator

How to launch Navigator in cordova in ios

本文关键字:启动 Navigator cordova 中在 ios      更新时间:2023-09-26

我有一个应用程序,其中(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();
                }
            }
      }*/

&lt--以上内容不适用于iOS和Android-->

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

以上内容不适用于iOS和Android

首先,我会使用cordova插件设备来确定平台,而不是用户代理嗅探——它更健壮。

其次,您似乎有一个依赖于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远程调试工具来调试应用程序。使用带有适当断点的分步调试程序将突出显示代码片段中存在的问题。有关详细信息,请参阅Cordova文档中的调试Cordova应用程序部分。