Как узнать страну пользователя

Я создаю приложение Cordova для платформы Android.

Мне нужно получить страну пользователя.

Я знаю, что геолокация дает координаты GPS.

Есть ли способ получить страну без использования внешнего API? если это невозможно, что является лучшим решением?


person Cabtine Yassine    schedule 05.01.2015    source источник


Ответы (4)


Есть важное отличие от UX и юридической перспективы в том, какая страна вам нужна:

  1. Страна текущего местоположения: используйте API геолокации и любое картографическое решение. Это единственный надежный способ определить страну местонахождения, так как обнаружение по IP или SIM-карте может определить только страну оператора связи. Обратите внимание, что страна текущего местонахождения не является страной гражданства и не позволяет определять язык пользователя или предпочтения локали.
  2. Страна в качестве контекста для локализации: используйте ECMAScript Internationalization API[1] и cordova-globalization-plugin[2] в качестве запасного варианта. Обратите внимание, что эти API вообще не предоставляют информацию о местоположении: информация о языке и локали не совпадает со страной пользователя (например, пользователь может выбрать французскую локаль и язык en_US, живя в Монако и будучи гражданином России).
  3. Страна гражданства. В некоторых случаях это критическая информация для вашего сервиса (например, когда персональные данные пользователя, собранные клиент-серверной системой, должны быть физически обработаны в стране гражданства в соответствии с требованиями законодательства). Единственный способ определить это — спросить пользователя и потребовать от него честного ответа в соответствии с вашими Условиями обслуживания. Обратите внимание, что страна гражданства не определяет настройки локализации или текущее местоположение пользователя.

[1] http://www.ecma-international.org/ecma-402/ 1.0/

[2] https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-globalization/

person Ivan Gammel    schedule 18.12.2016

Я могу придумать несколько вариантов. Список представлен ниже, и он упорядочен по минимуму необходимых усилий, а с другой стороны, насколько точной будет информация.

  1. Используйте строку локали пользователя, предоставленную плагином глобализации, она может содержать код страны рядом с кодом языка, например «en-US» или «en-GB».

использование

function successCallback(obj) {
    var locale = obj.value;
}
navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
  1. Только для Android: используйте плагин, например плагин информации об устройстве, который позволяет получить доступ информацию Диспетчера телефонии Android. Из этой информации вы можете получить

Страна ISO вашего оператора телефонной сети

по словам автора плагина. Чтобы использовать плагин, ваш код будет выглядеть примерно так

deviceInfo.get(function(result) {
    console.log("result = " + result); 
}, function() {
    console.log("error");
});

где результат будет содержать вызываемое поле netCountry как часть возвращаемой строки.

  1. Определите преобразование GPS в страну самостоятельно, основываясь на границах страны как GPS. Одна возможная карта (набор данных) доступна [здесь] (набор данных World Borders). Я бы порекомендовал просто использовать какой-то внешний API, чтобы предоставить вам эту информацию.
person Roope Hakulinen    schedule 05.01.2015
comment
Спасибо за ваш ответ: 1- Нельзя доверять, я провел тест из Марокко и вижу, что он дает en-US, я думаю, что эта информация связана с настройками, а не с местоположением. 2- Это решение мне помогло, но я вижу, когда пользователь отключает свою сеть, мне нужно получить информацию о стране. 3- Может быть решение, я надеялся, что это уже кто-то сделал, но не могу найти. - person Cabtine Yassine; 06.01.2015
comment
Ну, никто не говорил, что будет легко, если вам действительно нужно сделать его надежным. Я не знаю, как работает геокодер, упомянутый iwen, но если он не использует онлайн-соединение (как я предполагаю), он решит вариант 3 локально. Единственное, чего здесь не хватает, так это плагина Cordova, который кому-то нужно будет написать. По крайней мере, я не видел ни одного для этой цели. - person Roope Hakulinen; 06.01.2015
comment
Плагин глобализации не следует использовать для определения страны пользователя, за исключением единственного случая, когда целью является локализация UX, а информация о стране на самом деле не нужна. Ни плагин глобализации, ни API ECMAScript I18n не предоставляют информацию о стране. Язык, выбранный пользователем, может быть совершенно не связан с его страной, поэтому его расшифровка — пустая трата времени. - person Ivan Gammel; 18.12.2016

Если ваше приложение предназначено только для телефона или устройства с SIM-картой, вы можете использовать плагин информации о SIM-карте, https://github.com/dtmtec/cordova-plugin-carrier.

person sulaiman sudirman    schedule 06.10.2015

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

try {
   Geocoder gcd = new Geocoder(this, Locale.getDefault());
   List<Address> addresses = gcd.getFromLocation(latitude, longitude, 1);
         if (addresses.size() > 0)
         String cityname = addresses.get(0).getLocality();
         String country = addresses.get(0).getCountryName();
} catch (IOException e) {
     e.printStackTrace();
}
person Ivan    schedule 05.01.2015
comment
Спасибо за ваш ответ, проблема с геокодером в том, что для использования этого сервиса отображение карты обязательно, а мне не нужно отображать эту карту. - person Cabtine Yassine; 06.01.2015
comment
вам не нужно отображать карту, я использовал ее без карты - person Ivan; 06.01.2015
comment
На этой странице: developers.google.com/maps/documentation/geocoding. API можно использовать только вместе с картой Google; результаты геокодирования без отображения их на карте запрещены. Полную информацию о разрешенном использовании см. в Условиях использования Maps API. Лицензионные ограничения. - person Cabtine Yassine; 06.01.2015
comment
Может я ошибаюсь (подскажите плиз), но ваша ссылка не правильная. Веб-API геокодирования хочет, чтобы карта отображалась, но если вы посмотрите пример внутри ссылки, есть веб-вызов для преобразования или другая библиотека Java. В этой ссылке developer.android.com/reference/android/location/Geocoder.html (документ об объекте Geocoder) я не вижу обязательной карты... Еще один момент, если вы посмотрите java-библиотеку внутри вашей ссылки, я вижу GeoApiContext контекст = новый GeoApiContext().setApiKey(AIza...);. Приведенный выше код (мой) не требует никакого apikey, поэтому, возможно, я ошибаюсь, но я думаю, что ваша ссылка касается другого API, что вы думаете? - person Ivan; 06.01.2015
comment
Извините, Ивен, я думал, вы имели в виду API карт Google для Интернета. Так что мы говорим не об одном и том же. И я думаю, что решение, которое вы предлагаете, также может помочь (хотя я не привык к разработке плагинов, но я могу его рассмотреть). Спасибо! - person Cabtine Yassine; 07.01.2015