【问题标题】:Ionic: Check Internet Connection using CordovaIonic:使用 Cordova 检查 Internet 连接
【发布时间】:2015-01-13 07:30:14
【问题描述】:

我正在开发 Ionic 框架,并在使用 Apache Cordova Network API 检测 Android 应用程序中的互联网连接时遇到问题。 我参考了this 教程,还创建了一个演示项目,效果很好。

我已按照以下步骤操作。 [来自教程]

  1. ionic start testApp sidemenu

  2. ionic platform add android

  3. 打开testApp/www/js/app.js

  4. 复制粘贴这段代码

    if(window.Connection) {
    
      if(navigator.connection.type == Connection.NONE) {
          alert('There is no internet connection available');
      }else{
          alert(navigator.connection.type);
      }
    }else{
          alert('Cannot find Window.Connection');
    }
    
  5. 安装 Cordova 插件cordova plugin add org.apache.cordova.network-information

  6. 构建ionic build android

  7. 运行ionic run android

这很好用

问题

  1. wwwmainproject 复制到 testApp 并执行步骤 6 和 7

我收到警报Cannot find Window.Connection

之后复制粘贴app.js看起来像这样

.run(function($ionicPlatform) {
  $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) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }
    // check internet connection
    //alert(window.Connection);
    alert('Hi')
    try {
       alert('Naviagtor says'+navigator.connection.type);
     }
    catch(err) {
       alert( 'Error '+ err.message) 
       //here i get 'Error cannot read property type of undefined'
     }

if(window.Connection) {
    if(navigator.connection.type == Connection.NONE) {
        alert('There is no internet connection available');
    }else{
        alert(navigator.connection.type);
    }
}else{
    alert('Cannot find Window.Connection');
}

  });
})

我将app.jscontrollers.js 复制粘贴到testApp/www/js 目录的那一刻,整个事情都炸了。

非常感谢任何调试帮助。

谢谢,

注意

我在index.html 中有cordova.js

复制粘贴后我也重新安装了platformsplugins

【问题讨论】:

  • 您是否在检查 window.Connection 之前尝试打印 navigator.connection.type?它说什么?
  • 感谢回复,我已经更新了上面的代码。正如你所说,我尝试打印navigator.connection.type,但看起来对象未定义。
  • run cordova plugins ls.. 列出了短信插件。如果不删除平台 android/ios 并重新添加它们
  • 请确保主项目中的 www 包含 plugins 文件夹以及您安装的插件。
  • www 文件夹不包含 plugins 文件夹。它位于mainproject 中的 www 文件夹之外

标签: angularjs cordova ionic-framework ionic cordova-plugins


【解决方案1】:

我使用ngcordova 解决了类似的问题。它为您提供了一个围绕实现承诺的插件的角度包装器。

当您尝试调用 Cordova 插件时,它们通常还没有准备好,使用 promise 接口可以避免出现未定义的错误。

我从网络插件 here 的 ngcordova 页面上窃取了示例。

module.controller('MyCtrl', function($scope, $rootScope, $cordovaNetwork) {

 document.addEventListener("deviceready", function () {

    var type = $cordovaNetwork.getNetwork()

    var isOnline = $cordovaNetwork.isOnline()

    var isOffline = $cordovaNetwork.isOffline()


    // listen for Online event
    $rootScope.$on('networkOffline', function(event, networkState){
      var onlineState = networkState;
    })

    // listen for Offline event
    $rootScope.$on('networkOffline', function(event, networkState){
      var offlineState = networkState;
    })

  }, false);
});

【讨论】:

  • 您好,感谢您的回复,$cordovaNetwork.getNetwork() 返回 0 而不是 Connection.NONE$cordova.isOnline() 返回错误。我仍然坚持这一点。
  • 您是否仔细按照安装说明进行操作,您是在设备上还是在 AVD 上运行它?我个人使用了对我的服务器的测试调用来查看我是否有连接。因为有wifi并不意味着可以上网。也许写一个对服务器的调用并处理返回以查看您是否有连接。
  • 使用 $rootScope.$on('$cordovaNetwork:offline'$rootScope.$on('$cordovaNetwork:online' 代替你的听众
【解决方案2】:

对于任何新访问并在让 Armed10 的答案正常工作时遇到问题的人,您可能需要查看我写的帖子,该帖子逐字逐句地告诉您应该在哪里以及为什么应该放置一些代码(如果您可能会很有用)刚刚从 Ionic 开始):http://www.nikola-breznjak.com/blog/codeproject/check-network-information-change-with-ionic-famework/.

另外,我在 Github 上免费提供了示例代码:https://github.com/Hitman666/IonicNetworkInfo

编辑:根据 StackOverflow 的规则,我也在此处添加帖子内容:

一步一步自己做这个

通过以下方式开始一个新的 Ionic 项目:

ionic start IonicNetworkInfo blank

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

cd IonicNetworkInfo

使用 Bower 安装 ngCordova:

bower install ngCordova

如果你没有安装 bower,你可以使用 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>

基本上我们在这里所做的是显示网络变量的内容(通过控制器附加到 $scope)。此外,通过使用 ion-toggle 组件,我们可以显示“我在线”/“我离线”通知。

仅供参考,整个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

【讨论】:

  • @kleopatra:感谢您的提醒。但是,基本上也“允许”在这里发布我的帖子的全部内容吗?我的意思是,我对此没有任何问题,我只是问一下 - 如果是这样,谢谢,我会尽快更新。
  • 嗨@Nikola,我遇到了同样的问题,但我的代码结构有点不同。只是想问一下如何将其实现为服务/工厂。我在这里包含了一些关于我的特定问题的更多细节:stackoverflow.com/questions/40123495/…。我很矮,我想为我的应用程序创建一个实时连接状态监视器,但除了 setinerval(如这里所示:stackoverflow.com/a/40201808),我真的不知道。请帮忙!
【解决方案3】:

只需在 app.js 中的 .run 中使用此代码即可

if (window.Connection) {
       if (navigator.connection.type == Connection.NONE) {
         toast.show("Internet is disconnected on your device");
       };
     };

【讨论】:

    【解决方案4】:

    在调用“连接”之前,需要检查设备:

    document.addEventListener("deviceready", function () {
        ...
    });
    

    【讨论】:

    • 您将如何在工厂/服务中实现这一点?
    【解决方案5】:

    如果您最近更新了(运行cordova 5.0),我的猜测是需要安装cordova-plugin-whitelist。安装后,将其添加到 config.xml 以允许所有 http/s 请求:

    allow-intent href="http://\*/\*"
    
    allow-intent href="https://\*/\*"
    

    壳牌:

    ionic plugin add https://github.com/apache/cordova-plugin-whitelist.git
    

    Config.xml:

    <allow-navigation href="*" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多