在cordova网络信息插件中没有定义连接



我一直在看这篇文章:

在ionic app中获取设备的网络信息。

它在浏览器上工作得很好,但当我在android手机上安装编译后的apk时,它给出了一个错误,说Reference error : Connection is not defined.在我使用$cordovaNetwork.isOnline();的行

我一直在绞尽脑汁,做了应有的研究,试着按照建议的顺序卸载和安装,但没有帮助。

帮我解决这个问题。这个问题可能不是代码的问题,可能需要一些巧妙的修复才能使其工作。

同样的问题也在这里讨论,但我还没有真正理解给定的代码片段是从哪里来的。

index . html:

<!DOCTYPE html>
<html ng-app="starter" >
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
    <title></title>
    <link href="lib/ionic/css/ionic.css" rel="stylesheet">
  <!--   <link href="lib/ionic/css/angular-datepicker.min.css" rel="stylesheet"> -->
    <link href="css/style.css" rel="stylesheet">
    <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
    <link href="css/ionic.app.css" rel="stylesheet">
    -->
    <!-- angular date picker css-->
    <link href="lib/datePicker/css/angular-pickadate.css" rel="stylesheet">
    <script src="lib/ionic/js/ionic.bundle.js"></script>
    <script src="lib/ionic/js/highcharts-ng.js"></script>
    <script src="lib/ionic/js/jquery.min.js"></script>
    <script src="lib/ionic/js/highcharts.js"></script>
     <script src="lib/ionic/js/ngStorage.min.js"></script>
    <script src="lib/ngCordova/dist/ng-cordova.min.js"></script>

    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>
    <!-- your app's js -->
    <script src="js/app.js"></script>
       <script src="js/controllers.js"></script>


  </head>
  <body ng-controller="LoginCtrl">
     <ion-nav-bar class="mob-bar-balanced">
     <!--  <ion-nav-back-button>
      </ion-nav-back-button> -->
    </ion-nav-bar>
    <ion-nav-view></ion-nav-view>
  </body>
</html>

app.js:

app.factory('ConnectivityMonitor', ['$rootScope', '$cordovaNetwork', function($rootScope, $cordovaNetwork){
  return {
    isOnline: function(){
      if(ionic.Platform.isWebView()){
       $rootScope.online = $cordovaNetwork.isOnline();
        return $cordovaNetwork.isOnline();    
      } else {
        $rootScope.online = navigator.onLine;
        return navigator.onLine;
      }
    },
    isOffline: function(){
      if(ionic.Platform.isWebView()){
        $rootScope.online = $cordovaNetwork.isOnline();   
        return !$cordovaNetwork.isOnline();    
      } else {
        $rootScope.online = navigator.onLine;
        return !navigator.onLine;
      }
    },
    startWatching: function(){
        if(ionic.Platform.isWebView()){
          $rootScope.$on('$cordovaNetwork:online', function(event, networkState){
            $rootScope.online =true;
            console.log("went online");
          });
          $rootScope.$on('$cordovaNetwork:offline', function(event, networkState){
             $rootScope.online =false;
            console.log("went offline");
          });
        }
        else {
          window.addEventListener("online", function(e) {
            $rootScope.online =true;
            console.log("went online");
          }, false);    
          window.addEventListener("offline", function(e) {
            $rootScope.online =false;
            console.log("went offline");
          }, false);  
        }       
    }
  }
}]);
.config(function($stateProvider,$urlRouterProvider){
  $stateProvider
  .state('Login',{
    url:'/login',
    onEnter:["$state","$localStorage", '$rootScope' , '$ionicViewSwitcher',function($state,$localStorage, $rootScope, $ionicViewSwitcher){
        if((typeof($localStorage.userInfo)!== 'undefined') && (Object.keys($localStorage.userInfo).length !== 0)) {
                       $ionicViewSwitcher.nextTransition('none');
                       $state.go("Deployment");
        }
    }],
    templateUrl:'templates/login.html',
    controller:'LoginCtrl',
    resolve: {
            online: function(ConnectivityMonitor){
                return ConnectivityMonitor.isOnline();
        }
      }
  })

我不知道你提到的教程,但是,你可能想检查我写的帖子,逐字逐句地告诉你在哪里以及为什么你应该放一些代码(如果你刚开始使用Ionic可能很有用):http://www.nikola-breznjak.com/blog/codeproject/check-network-information-change-with-ionic-famework/.

另外,我在Github上免费提供了示例代码:https://github.com/Hitman666/IonicNetworkInfo。您可以下载该项目(如果您不想自己经历这些步骤)为您的设备构建它并在设备上进行测试。

以下是博客文章中的步骤:

启动一个新的Ionic项目:

ionic start IonicNetworkInfo blank

然后,将目录更改为新创建的IonicNetworkInfo:

cd IonicNetworkInfo

安装ngCordova:

bower install ngCordova

如果碰巧你没有安装,你可以使用npm:

npm install bower -g

在你最喜欢的编辑器中打开www/index.html文件,并添加对ngCordova的引用(就在cordova.js脚本的上方):

<!-- This is what you should add, the cordova below you'll already have -->
<script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
<!-- cordova script (this will be a 404 during development) -->
<script src="cordova.js"></script>

通过在终端/命令提示符中执行以下命令来安装ngCordova网络插件(你应该从你的应用的根目录;因此,在我们的例子中是IonicNetworkInfo目录):

cordova plugin add org.apache.cordova.network-information

检查你是否已经成功安装了插件,你可以运行以下命令(从根目录-我不会再重复这个了;当我说您应该从终端/命令提示符(在这种情况下,意味着从应用程序的根目录)运行某些命令时:

cordova plugin list

您应该看到以下输出:

> cordova plugin list                                                                                                                           
com.ionic.keyboard 1.0.4 "Keyboard"
org.apache.cordova.network-information 0.2.15 "Network Information"

打开www/js/app.js文件,将ngCordova添加到依赖列表中,所以基本上第一行看起来像这样:

angular.module('starter', ['ionic', 'ngCordova'])

在www/js/app.js文件中创建一个名为MyCtrl的新控制器,内容如下:

.controller('MyCtrl', function($scope, $cordovaNetwork, $rootScope) {
    document.addEventListener("deviceready", function () {
        $scope.network = $cordovaNetwork.getNetwork();
        $scope.isOnline = $cordovaNetwork.isOnline();
        $scope.$apply();
        // listen for Online event
        $rootScope.$on('$cordovaNetwork:online', function(event, networkState){
            $scope.isOnline = true;
            $scope.network = $cordovaNetwork.getNetwork();
            $scope.$apply();
        })
        // listen for Offline event
        $rootScope.$on('$cordovaNetwork:offline', function(event, networkState){
            console.log("got offline");
            $scope.isOnline = false;
            $scope.network = $cordovaNetwork.getNetwork();
            $scope.$apply();
        })
  }, false);
})

在此控制器中,您可以在deviceready事件上附加一个事件侦听器(因为当此代码运行时,设备可能尚未初始化),并使用以下命令获取网络信息:

$cordovaNetwork.getNetwork();

有关您连接到互联网的天气信息是通过以下行获得的:

$scope.isOnline = $cordovaNetwork.isOnline();

然后,你注册两个事件$cordovaNetwork:online和$cordovaNetwork:online,当设备在线/离线时触发。在它们中,您只需更新$scope变量()。仅供参考,www/js/app.js文件的全部内容应为:

// Ionic Starter App
// angular.module is a global place for creating, registering and retrieving Angular modules
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)
// the 2nd parameter is an array of 'requires'
angular.module('starter', ['ionic', 'ngCordova'])
.run(function($ionicPlatform, $cordovaNetwork, $rootScope) {
  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if(window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }
  });
})
.controller('MyCtrl', function($scope, $cordovaNetwork, $rootScope) {
    document.addEventListener("deviceready", function () {
        $scope.network = $cordovaNetwork.getNetwork();
        $scope.isOnline = $cordovaNetwork.isOnline();
        $scope.$apply();
        // listen for Online event
        $rootScope.$on('$cordovaNetwork:online', function(event, networkState){
            $scope.isOnline = true;
            $scope.network = $cordovaNetwork.getNetwork();
            $scope.$apply();
        })
        // listen for Offline event
        $rootScope.$on('$cordovaNetwork:offline', function(event, networkState){
            console.log("got offline");
            $scope.isOnline = false;
            $scope.network = $cordovaNetwork.getNetwork();
            $scope.$apply();
        })
  }, false);
});

在index.html文件中,在ion-content标签中粘贴以下内容:

<div class="card">
    <div class="item item-text-wrap">
        <h1>Network: {{network}}</h1>
    </div>
</div>

<div class="card">
    <div class="item item-text-wrap">
        <ion-toggle ng-model="isOnline" ng-checked="item.checked">
            <h1 ng-show="isOnline">I'm online</h1>
            <h1 ng-show="! isOnline">I'm offline</h1>
        </ion-toggle>
    </div>
</div>

基本上,我们在这里所做的是显示网络变量的内容(通过控制器附加到$作用域)。此外,通过使用离子切换组件,我们可以显示"我在线"/"我离线"通知。

作为参考,整个index.html文件的内容应该是这样的:

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title></title>
    <link href="lib/ionic/css/ionic.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">
    <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
    <link href="css/ionic.app.css" rel="stylesheet">
    -->
    <!-- ionic/angularjs js -->
    <script src="lib/ionic/js/ionic.bundle.js"></script>
    <script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>
    <!-- your app's js -->
    <script src="js/app.js"></script>
</head>
<body ng-app="starter" ng-controller="MyCtrl">
    <ion-pane>
        <ion-header-bar class="bar-stable">
            <h1 class="title">Ionic Blank Starter</h1>
        </ion-header-bar>
        <ion-content padding="true">
            <div class="card">
                <div class="item item-text-wrap">
                    <h1>Network: {{network}}</h1>
                </div>
            </div>
            <div class="card">
                <div class="item item-text-wrap">
                    <ion-toggle ng-model="isOnline" ng-checked="item.checked">
                        <h1 ng-show="isOnline">I'm online</h1>
                        <h1 ng-show="! isOnline">I'm offline</h1>
                    </ion-toggle>
                </div>
            </div>
        </ion-content>
    </ion-pane>
</body>
</html>

为了测试这个应用,你应该在你的设备上运行它(因为你不能在iOS模拟器中禁用网络)。如果你有一个Android设备插入到你的电脑上(并且所有的sdk都在适当的位置),你可以运行以下命令来让你的应用程序在你的Android设备上运行:

ionic build android && ionic run android

可能您没有安装Network-Plugin。

现在,我认为使用

将是更好的方法
$ionicPlatform.ready(function()  {
     $scope.network = $cordovaNetwork.getNetwork();
     $scope.isOnline = $cordovaNetwork.isOnline();
     $scope.$apply();
});

而不是document。addEventListener("deviceready", function () {

最新更新