2016-04-29 11 views
0

Ich erstelle eine Webanwendung, und damit sie ausgeführt werden kann, muss Ihr Gerät registriert sein. Der Registrierungsprozess umfasst die Eingabe der IPv4-Adresse des Geräts, das Sie verwenden möchten, in ein Feld, das die Datenbank aktualisiert.

Beim Zugriff auf die Anwendung wird eine window.webkitRTCPeerConnection oder window.mozRTCPeerConnection Prüfung durchgeführt, um die IP-Adresse zu erhalten. Dies funktioniert auf den neuesten Versionen von Chrome und Firefox, aber nicht IE. Also musste ich ActiveX verwenden, wenn die IP nicht von der RTCPeerConnection-Prüfung erhalten wurde.

Mein Problem ist, dass ich möchte, dass Safari die Anwendung ausführen kann, aber ich kann anscheinend nichts finden, wie man die IPv4-Adresse für Geräte, auf denen Safari läuft, bekommt.

Um zu verdeutlichen, ist diese Webanwendung nicht öffentlich zugänglich und wir haben die vollständige Kontrolle darüber, was auf Geräten installiert ist, auf denen die Anwendung ausgeführt wird. (Das ist meine Rechtfertigung für die Verwendung von ActiveX).

Irgendwelche Vorschläge und/oder Hinweise darauf, wie ich so etwas tun könnte, würden geschätzt.IPv4-Adresse mit JavaScript auf Safari abrufen

Antwort

0

Diese API kann Ihre IP-Adresse erhalten.

https://l2.io/

Fortgeschrittenere Lösung: http://dev.maxmind.com/geoip/geoip2/javascript/

Dieses unterstützt auch Safari, nach dieser: http://dev.maxmind.com/geoip/geoip2/javascript/#Browser_Support

Der letzte ist meiner Meinung nach die beste. Ich benutze das in einem meiner Projekte.

EDIT: Auf Safari gibt es noch keine Unterstützung für WebRTC-Verbindungen. Daher ist es nicht möglich, die lokale IP-Adresse auf Safari zu erhalten.

+0

Dies scheint wirklich gut, aber es wird die öffentliche IP-Adresse und nicht als das, was für die ich suche die lokale Adresse des Gerätes ist (192.168.x.x). – Nathangrad

+0

Antwort aktualisiert. – Red

+0

Ich habe bereits RTCPeerConnection versucht, die in Chrome und Firefox funktioniert. Aber leider funktioniert es in Safari nicht, daher kann ich diese Methode nicht verwenden. – Nathangrad

0

Bitte versuchen Sie es auf diese Weise.

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
 
    </head> 
 
    <body> 
 
     <h4> 
 
      Demo for: 
 
      <a href="https://github.com/diafygi/webrtc-ips"> 
 
       https://github.com/diafygi/webrtc-ips 
 
      </a> 
 
     </h4> 
 
     <p> 
 
      This demo secretly makes requests to STUN servers that can log your 
 
      request. These requests do not show up in developer consoles and 
 
      cannot be blocked by browser plugins (AdBlock, Ghostery, etc.). 
 
     </p> 
 
     <h4>Your local IP addresses:</h4> 
 
     <ul></ul> 
 
     <h4>Your public IP addresses:</h4> 
 
     <ul></ul> 
 
     <h4>Your IPv6 addresses:</h4> 
 
     <ul></ul> 
 
     <iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe> 
 
     <script> 
 
      //get the IP addresses associated with an account 
 
      function getIPs(callback){ 
 
       var ip_dups = {}; 
 
       //compatibility for firefox and chrome 
 
       var RTCPeerConnection = window.RTCPeerConnection 
 
        || window.mozRTCPeerConnection 
 
        || window.webkitRTCPeerConnection; 
 
       var useWebKit = !!window.webkitRTCPeerConnection; 
 
       //bypass naive webrtc blocking using an iframe 
 
       if(!RTCPeerConnection){ 
 
        //NOTE: you need to have an iframe in the page right above the script tag 
 
        // 
 
        //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe> 
 
        //<script>...getIPs called in here... 
 
        // 
 
        var win = iframe.contentWindow; 
 
        RTCPeerConnection = win.RTCPeerConnection 
 
         || win.mozRTCPeerConnection 
 
         || win.webkitRTCPeerConnection; 
 
        useWebKit = !!win.webkitRTCPeerConnection; 
 
       } 
 
       //minimal requirements for data connection 
 
       var mediaConstraints = { 
 
        optional: [{RtpDataChannels: true}] 
 
       }; 
 
       var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}; 
 
       //construct a new RTCPeerConnection 
 
       var pc = new RTCPeerConnection(servers, mediaConstraints); 
 
       function handleCandidate(candidate){ 
 
        //match just the IP address 
 
        var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/ 
 
        var ip_addr = ip_regex.exec(candidate)[1]; 
 
        //remove duplicates 
 
        if(ip_dups[ip_addr] === undefined) 
 
         callback(ip_addr); 
 
        ip_dups[ip_addr] = true; 
 
       } 
 
       //listen for candidate events 
 
       pc.onicecandidate = function(ice){ 
 
        //skip non-candidate events 
 
        if(ice.candidate) 
 
         handleCandidate(ice.candidate.candidate); 
 
       }; 
 
       //create a bogus data channel 
 
       pc.createDataChannel(""); 
 
       //create an offer sdp 
 
       pc.createOffer(function(result){ 
 
        //trigger the stun server request 
 
        pc.setLocalDescription(result, function(){}, function(){}); 
 
       }, function(){}); 
 
       //wait for a while to let everything done 
 
       setTimeout(function(){ 
 
        //read candidate info from local description 
 
        var lines = pc.localDescription.sdp.split('\n'); 
 
        lines.forEach(function(line){ 
 
         if(line.indexOf('a=candidate:') === 0) 
 
          handleCandidate(line); 
 
        }); 
 
       }, 1000); 
 
      } 
 
      //insert IP addresses into the page 
 
      getIPs(function(ip){ 
 
       var li = document.createElement("li"); 
 
       li.textContent = ip; 
 
       //local IPs 
 
       if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) 
 
        document.getElementsByTagName("ul")[0].appendChild(li); 
 
       //IPv6 addresses 
 
       else if (ip.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/)) 
 
        document.getElementsByTagName("ul")[2].appendChild(li); 
 
       //assume the rest are public IPs 
 
       else 
 
        document.getElementsByTagName("ul")[1].appendChild(li); 
 
      }); 
 
     </script> 
 
    </body> 
 
</html>

+0

Das hat leider nicht auf Safari funktioniert. Ich habe bereits versucht, RTCPeerConnection zu verwenden, aber es funktioniert nicht wie es in Chrome und Firefox auf Safari funktioniert. – Nathangrad