Reputation: 2387
I know there is a lot of questions and answers about this in Stackoverflow
, I read a lot of them, but none of them work.
I clarified in the title Android WebView
because it is the most important target, but I would like this works in other devices too. I tested the following code on a app built with Intel XDK
installed on a SM-G355M
with Android 4.4.2
and on Safari
installed on an iPhone 5C
with iOS 9.3.4
;
All I get in both cases is the same value, true
(sometimes I get false
even I have an internet connection).
I tried:
navigator.onLine
, it gives always the same value.document.addEventListener("online", ...
doesn't triggerajax
doesn't work, anyway doesn't affect to the server?Code: https://nanilab.com/stackoverflow/webview-internet-connection.php(This link is now broken)
Option 1:
function option1(){
var isOffline = 'onLine' in navigator && !navigator.onLine,
text = isOffline == true ? ' without connection ' : ' connected ';
$('.option-one span').text(text);
$('.option-one i').text('checked').hide().fadeIn(200);
setTimeout(function(){
option1();
}, 1000);
}
Option 2:
window.addEventListener("offline", function(){ $('.option-two span').text(' without connection'); }, false);
window.addEventListener("online", function(){ $('.option-two span').text(' connected'); }, false);
Option 3:
function option3(){
$.ajax({
url: '/stackoverflow/blank.php',
success: function(data){
print(' connected ');
},
error: function(jqXHR, textStatus, error) {
print(' without connection ');
}
});
function print(text){
$('.option-three span').text(text);
$('.option-three i').text('checked').hide().fadeIn(200);
setTimeout(function(){
option3();
}, 2000);
}
}
app built with Intel XDK
installed on a SM-G355M with Android 4.4.2
What I am doing wrong?
Upvotes: 12
Views: 2646
Reputation: 9153
Apache Cordova (was called PhoneGap
) is an open-source mobile development framework. It allows you to use standard web technologies - HTML5
, CSS3
, and JavaScript
for cross-platform
development. Applications execute within wrappers targeted to each platform, and rely on standards-compliant API
bindings to access each device's capabilities such as sensors, data, network status, etc.
document reference cordova
In your problem (Option 1):
navigator.onLine
...is not working because (on android
) it is broken {the "raw" version, Cordova
enabled webview
is different}(as you have found out), you have to built your WebView
App with the Cordova Framework
. Cordova
was developed EXACTLY to solve this problem. The GAP in PhoneGap
is the gap between the "virtual machine", "sandbox" and access to the hardware, AND it's cross-platform.
Android Permissions: app/AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Cordova Permissions: app/res/xml/config.xml
<feature name="NetworkStatus">
<param name="android-package" value="org.apache.cordova.networkinformation.NetworkManager" />
</feature>
Cordova
installationhttps://cordova.apache.org/docs/en/latest/guide/cli/
https://nodejs.org/en/download/
node-v4.5.0-x86.msi
success.
C:\>npm install -g cordova
And away you go!
I have built your code into cordova
, I'm getting there (hopefully, hard problem), here's some image's of what I have so far [not in WebView
exactly yet, {see the navigator.userAgent
output in the second image}] (notice the event listener is working ;O), but not good enough:o( ).
Upvotes: 8
Reputation:
In Chrome and Safari, if the browser is not able to connect to a local area network (LAN) or a router, it is offline; all other conditions return true. So while you can assume that the browser is offline when it returns a false value, you cannot assume that a true value necessarily means that the browser can access the internet. You could be getting false positives, such as in cases where the computer is running a virtualization software that has virtual ethernet adapters that are always "connected." Therefore, if you really want to determine the online status of the browser, you should develop additional means for checking. To learn more, see the HTML5 Rocks article, http://www.html5rocks.com/en/mobile/workingoffthegrid/
Upvotes: 1