Подтвердить что ты не робот

Как использовать геолокацию HTML5 в приложении С#

Я разрабатываю противоугонное программное обеспечение, чтобы получить точное местоположение компьютеров. Ноутбуки со встроенными GPS очень редки в моей стране, поэтому я должен использовать HTML5 Geolocation в своем приложении.

Для Internet Explorer 9+ существует раздел реестра, в котором вы можете добавить URL-адреса, чтобы разрешить URL-адрес без проверки пользователя. Если вы добавите значение REG_DWORD с именем domain.com под HKCU\Software\Microsoft\Internet Explorer\Geolocation\HostConsent, браузер путей автоматически выполнит запрос геолокации. Однако я не могу запустить Internet Explorer, чтобы он не работал у меня, так как вор не должен понимать и видеть, что происходит.

  • Мне нужно как-то запустить Internet Explorer
  • ... или мне нужно встроить webkit или что-то в мое приложение, но я не знаю, как его использовать или как разрешить этот запрос программным способом.

Я предпочитаю второй способ, потому что Internet Explorer теперь прекращен Microsoft, и я думаю, что следующая версия будет иметь разную структуру.

Как я могу вставлять и использовать Webkit или GeckoFX в свое приложение? Как разрешить программный запрос геолокации в этом приложении?

4b9b3361

Ответ 1

Опираясь на скрытый браузер, это рискованное решение, и оно неизбежно сломается в какой-то момент в будущем.

Вместо этого вы хотите создать геолокационную функциональность в своем приложении. Двумя основными источниками информации о местоположении являются ваш IP-адрес (который затем вы подаете в любой из поставщиков GeoIP) и видимые сотовые/Wi-Fi-станции (которые вы загружаете в API геолокации Google).

Ответ 2

Посмотрите на класс GeoCoordinateWatcher, который определен в сборке System.Device

Класс GeoCoordinateWatcher поставляет данные местоположения на основе координат от текущего поставщика местоположения. Поставщик текущего местоположения имеет приоритет как самый высокий на компьютере, исходя из ряда факторов, таких как возраст и точность данных от всех поставщиков, точность, запрашиваемая приложениями местоположения, и потребление энергии и влияние на производительность, связанные с провайдера. Текущий провайдер местоположения может меняться со временем, например, когда устройство GPS теряет свой спутниковый сигнал в помещении, а поставщик триангуляции Wi-Fi становится наиболее точным поставщиком на компьютере.

Пример использования:

static void Main(string[] args)
{
    GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();

    watcher.StatusChanged += (sender, e) =>
    {
        Console.WriteLine("new Status : {0}", e.Status);
    };

    watcher.PositionChanged += (sender, e) =>
    {
        Console.WriteLine("position changed. Location : {0}, Timestamp : {1}",
            e.Position.Location, e.Position.Timestamp);
    };

    if(!watcher.TryStart(false, TimeSpan.FromMilliseconds(5000)))
    {
         throw new Exception("Can't access location"); 
    }

    Console.ReadLine();
}

Я думаю, что этот класс полагается на тот же механизм, что и один Internet Explorer.

Когда вы будете использовать его, у вас будет значок в системном лотке уведомлений о том, что в последнее время было обнаружено местоположение.

enter image description here

У вас также будет добавлена ​​запись в журналах Windows.

Ответ 3

Если вы развертываетесь в современной версии Windows, вы можете использовать родную библиотеку для .NET System.Device.Location, которая позволяет вам получать информацию о местоположении устройства.

Вот ссылка на MSDN для использования GeoCoordinate Class

Если вы используете XAML, вы также можете попробовать этот метод. Обнаружение местоположения пользователей с помощью XAML

Ответ 4

Вы можете встроить браузер webkit в свое приложение, используя PhantomJS. PhantomJS является браузером без браузера и может быть добавлен в ваше приложение через поиск NuGet или в командной строке NuGet PM> Install-Package PhantomJS. Когда PhantomJS добавлен в ваш проект, вы захотите создать файл для управления phantom чем-то вроде:

 public string PhantomJson(string phantomControlFile, params string[] arguments)
        {
            string returnJsonString = String.Empty;

            if (!String.IsNullOrEmpty(URL))
            {
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    CreateNoWindow = true,
                    RedirectStandardError = true,
                    RedirectStandardOutput = true,
                    FileName = Path.Combine(PhantomExecutionPath, "phantomjs.exe"),
                    UseShellExecute = false,
                    WorkingDirectory = PhantomExecutionPath,
                    Arguments = @"--proxy-type=none --ignore-ssl-errors=true {1} ""{0}"" {2}".FormatWith(URL, phantomControlFile, 
                        arguments.Any() ? String.Join(" ", arguments) : String.Empty)
                };

                StringBuilder receivedData = new StringBuilder();
                using (Process p = Process.Start(startInfo))
                {
                    p.OutputDataReceived += (o, e) =>
                    {
                        if (e.Data != null && e.Data != "failed")
                        {
                            //returnJsonString = e.Data;
                            receivedData.AppendLine(e.Data);
                        }
                    };
                    p.BeginOutputReadLine();
                    p.WaitForExit();
                }
                returnJsonString = receivedData.ToString();

                if (!String.IsNullOrEmpty(returnJsonString))
                {
                    return returnJsonString;
                }
                else
                {
                    throw new ArgumentNullException("Value returned null. Unable to retrieve data from server");
                }
            }
            else
            {
                throw new ArgumentNullException("Url cannot be null");
            }
        }

Затем вы захотите создать управляющий файл, чтобы сообщить phantomjs, куда идти; что-то вроде:

var args, myurl, page, phantomExit, renderPage, system;

system = require("system");
args = system.args;
page = null;
myurl = args[1];

phantomExit = function(exitCode) { // this is needed as there are time out issues when it tries to exit.
  if (page) {
    page.close();
  }
  return setTimeout(function() {
    return phantom.exit(exitCode);
  }, 0);
};

renderPage = function(url) {
  page = require("webpage").create();
    return page.open(url, function(status) {
      if (status === 'success') {
         // Process Page and console.log out the values
         return phatomExit(0);
      } else {
         console.log("failed");
         return phantomExit(1);
      }
     });
   };
  renderPage(myurl);