Ionic:使用 Cordova 检查 Internet 连接
Ionic: Check Internet Connection using Cordova
我正在研究 Ionic Framework,在使用 Apache Cordova Network API 检测 Android 应用程序中的互联网连接时遇到问题。
我参考了 this 教程并创建了一个演示项目,效果很好。
我已按照以下步骤操作。 [来自教程]
ionic start testApp sidemenu
ionic platform add android
打开testApp/www/js/app.js
复制粘贴此代码
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');
}
安装 Cordova 插件 cordova plugin add org.apache.cordova.network-information
建造ionic build android
运行 ionic run android
这个很好用
问题
- 将
www
从 mainproject
复制粘贴到 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.js
和 controllers.js
到 testApp/www/js
目录时,整个事情就爆炸了。
非常感谢调试方面的任何帮助。
谢谢,
备注
我在 index.html
中有 cordova.js
。
我在复制粘贴后也重新安装了 platforms
和 plugins
。
我使用 ngcordova 解决了类似的问题。它为您提供了一个 angular 围绕实现承诺的插件的包装器。
当您尝试调用 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);
});
对于任何新来访者和在使用 Armed10 的答案时遇到问题的人,您可能需要查看我写的 post,它逐字逐句地告诉您在哪里以及为什么应该放置一些代码(如果您刚开始使用 Ionic,可能会有用):http://www.nikola-breznjak.com/blog/codeproject/check-network-information-change-with-ionic-famework/.
此外,我在 Github 上免费提供了示例代码:https://github.com/Hitman666/IonicNetworkInfo。
编辑: 根据 Whosebug 的规则,我也在此处添加 post 内容:
逐步了解如何自己制作这个
开始一个新的 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>
通过在 Terminal/Command 提示符下执行以下命令来安装 ngCordova 网络插件(您应该从应用程序的根目录执行此操作;因此,在我们的例子中是 IonicNetworkInfo 目录):
cordova plugin add org.apache.cordova.network-information
要检查您是否已成功安装插件,您可以 运行 以下命令(从根目录 - 我不会再重复了;当我说你应该 运行来自 Terminal/Command 提示的一些命令,在这种情况下,意味着来自应用程序的根目录):
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);
})
在此控制器中,您在设备就绪事件上附加了一个事件侦听器(因为当此代码 运行s 时设备可能尚未初始化)并且您通过以下方式获取网络信息:
$cordovaNetwork.getNetwork();
有关您连接到互联网的天气信息是通过以下行获取的:
$scope.isOnline = $cordovaNetwork.isOnline();
然后,您注册两个事件 $cordovaNetwork:online 和 $cordovaNetwork:online,当设备获得 online/offline 时触发。在它们中,您只需更新 $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
只要在你的app.js里面使用这段代码.运行
if (window.Connection) {
if (navigator.connection.type == Connection.NONE) {
toast.show("Internet is disconnected on your device");
};
};
如果您最近更新了 (运行 cordova 5.0),我的猜测是需要安装 cordova-plugin-whitelist
。安装后,将此添加到 config.xml 以允许所有 http/s 请求:
allow-intent href="http://\*/\*"
allow-intent href="https://\*/\*"
Shell:
ionic plugin add https://github.com/apache/cordova-plugin-whitelist.git
Config.xml:
<allow-navigation href="*" />
在调用 "connection" 之前,您需要检查设备:
document.addEventListener("deviceready", function () {
...
});
我正在研究 Ionic Framework,在使用 Apache Cordova Network API 检测 Android 应用程序中的互联网连接时遇到问题。 我参考了 this 教程并创建了一个演示项目,效果很好。
我已按照以下步骤操作。 [来自教程]
ionic start testApp sidemenu
ionic platform add android
打开
testApp/www/js/app.js
复制粘贴此代码
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'); }
安装 Cordova 插件
cordova plugin add org.apache.cordova.network-information
建造
ionic build android
运行
ionic run android
这个很好用
问题
- 将
www
从mainproject
复制粘贴到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.js
和 controllers.js
到 testApp/www/js
目录时,整个事情就爆炸了。
非常感谢调试方面的任何帮助。
谢谢,
备注
我在 index.html
中有 cordova.js
。
我在复制粘贴后也重新安装了 platforms
和 plugins
。
我使用 ngcordova 解决了类似的问题。它为您提供了一个 angular 围绕实现承诺的插件的包装器。
当您尝试调用 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);
});
对于任何新来访者和在使用 Armed10 的答案时遇到问题的人,您可能需要查看我写的 post,它逐字逐句地告诉您在哪里以及为什么应该放置一些代码(如果您刚开始使用 Ionic,可能会有用):http://www.nikola-breznjak.com/blog/codeproject/check-network-information-change-with-ionic-famework/.
此外,我在 Github 上免费提供了示例代码:https://github.com/Hitman666/IonicNetworkInfo。
编辑: 根据 Whosebug 的规则,我也在此处添加 post 内容:
逐步了解如何自己制作这个
开始一个新的 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>
通过在 Terminal/Command 提示符下执行以下命令来安装 ngCordova 网络插件(您应该从应用程序的根目录执行此操作;因此,在我们的例子中是 IonicNetworkInfo 目录):
cordova plugin add org.apache.cordova.network-information
要检查您是否已成功安装插件,您可以 运行 以下命令(从根目录 - 我不会再重复了;当我说你应该 运行来自 Terminal/Command 提示的一些命令,在这种情况下,意味着来自应用程序的根目录):
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);
})
在此控制器中,您在设备就绪事件上附加了一个事件侦听器(因为当此代码 运行s 时设备可能尚未初始化)并且您通过以下方式获取网络信息:
$cordovaNetwork.getNetwork();
有关您连接到互联网的天气信息是通过以下行获取的:
$scope.isOnline = $cordovaNetwork.isOnline();
然后,您注册两个事件 $cordovaNetwork:online 和 $cordovaNetwork:online,当设备获得 online/offline 时触发。在它们中,您只需更新 $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
只要在你的app.js里面使用这段代码.运行
if (window.Connection) {
if (navigator.connection.type == Connection.NONE) {
toast.show("Internet is disconnected on your device");
};
};
如果您最近更新了 (运行 cordova 5.0),我的猜测是需要安装 cordova-plugin-whitelist
。安装后,将此添加到 config.xml 以允许所有 http/s 请求:
allow-intent href="http://\*/\*"
allow-intent href="https://\*/\*"
Shell:
ionic plugin add https://github.com/apache/cordova-plugin-whitelist.git
Config.xml:
<allow-navigation href="*" />
在调用 "connection" 之前,您需要检查设备:
document.addEventListener("deviceready", function () {
...
});