2012-08-30 21 views
7

¿Hay alguna forma de que yo detecte si un usuario está en los Estados Unidos sin preguntar su ubicación? Por ejemplo, cuando voy a Fandango en mi computadora, sé en qué condado y estado estoy basado solo en mi WiFi.iOS: ¿es un usuario en los Estados Unidos?

Si tengo un dispositivo, tal vez un iPod Touch, que no tiene GPS, y quería verificar que está en los Estados Unidos, y están conectados a WiFi ... o si tenía una iPhone y estaba conectado con 3G y quería asegurarme de que los usuarios estuvieran en EE. UU., ¿hay alguna manera de verificar esa información sin la pequeña alerta de vista "__ desea utilizar su ubicación actual"? No necesito coordenadas exactas, solo necesito confirmar que estos usuarios se encuentran en los EE. UU. (Incluidos Hawái y Alaska) ... ¿localidad?

+0

Ahora puedo detectar "en_US" con la configuración regional ...¿Esto SIEMPRE será el caso en los Estados Unidos? –

+2

La configuración regional es configurable por el usuario. Por ejemplo, alguien que vive en los Estados Unidos que habla chino podría tener el idioma y el lugar de su teléfono configurado en China. No debe usar la configuración regional de un usuario para determinar dónde se encuentran; debería usarse para determinar cómo localizar su contenido. –

Respuesta

5

Primero trataría de verificar el Mobile Country Code del operador. Le indicará el código de país móvil numérico para el proveedor de servicio celular del usuario y el usuario no puede cambiarlo a menos que se cambie a un proveedor de servicio en un país diferente.

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 
#import <CoreTelephony/CTCarrier.h> 

CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init]; 
CTCarrier *carrier = [netInfo subscriberCellularProvider]; 
NSString *mcc = [carrier mobileCountryCode]; 

Por supuesto, esto no va a funcionar con dispositivos que no están conectados a un operador de telefonía móvil (iPod Touch, algunos iPads, etc.). Por lo tanto, como retroceso, usaría o crearía mi propia API IP geolocation. Puede obtener un free database con una precisión del 99.5% a nivel de país. Esto funcionará muy bien para detectar el país de un dispositivo que no tiene un proveedor de servicios móviles.

+0

Esto en combinación con la coincidencia de ubicación de IP como un retroceso cuando la información del operador no está disponible parece una buena solución. El código de país móvil del operador sería una forma muy precisa de verificar si hay algún dispositivo celular conectado. Entonces, cuando la información de la empresa no está disponible o se está utilizando un dispositivo no celular, recurrirá a la coincidencia de ubicación IP. –

+1

Una pregunta sobre el MCC: cuando está fuera del país en itinerancia, ¿el MCC que se proporciona es el del operador base o el MCC del operador itinerante? –

+4

@ScottLemmon de [la documentación de apple] (http://developer.apple.com/library/ios/DOCUMENTATION/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1-SW1) - "El valor no cambia si el usuario está en itinerancia, siempre representa al proveedor con el que el usuario tiene una cuenta". –

3

En un entorno de red, el usuario location is usually "identified" a través de la dirección IP.

¿Cuál es el propósito de la determinación dentro/fuera de los Estados Unidos? ¿Qué tan preciso/fall seguro debe ser? ¿Cuáles son las consecuencias cuando se identifica erróneamente que un usuario está dentro de los EE. UU.? ¿Cuáles son las consecuencias cuando produces un falso negativo? ¿Estás violando contratos o licencias cuando tienes un falso positivo? ¿O incluso cometiendo un crimen? ¿O simplemente le disgustan los extranjeros y es su dignidad (o la de su empleador) la que está lesionada?

La verdadera pregunta es: ¿Qué tan confiable es la información que obtiene al localizar una dirección IP y esta confiabilidad es suficiente para su propósito?

Como usted tiene una manera de obtener un código de país para una dirección IP dada, solo tiene que compararlo con el conjunto dado de códigos permitidos y listo. Si, es decir, la calidad de la fuente de dicho código cumple con sus requisitos.

+0

Tiene que ser muy preciso y estoy bajo NDA por ello. Si tengo la dirección IP a través de WiFi, puedo detectar la ciudad y el país de los usuarios, si solo tengo la dirección IP a través de 3g, aún podría verificar el país de los usuarios, ¿verdad? Intenté investigar y aparentemente hay formas de verificar el país de una dirección IP, pero implican encontrar la dirección IP, convertirla de una dirección a un número IP, y luego verificar una última cosa que no puedo encontrar. –

+0

Bien, pude encontrar un servicio (api.ipinfodb.com) que produce un JSON de la información de IP ... así que si mi JSON devuelve una cadena que tiene todas estas cosas: { \t "statusCode": "OK " \t "StatusMessage": "", \t "ipAddress": "************", \t "countryCode": "Estados Unidos", \t "countryName":" ESTADOS STATES " } y solo quiero verificar que el código de país diga US, UM o VI ¿cómo puedo hacer eso? –

+0

Lo siento por mi respuesta tardía, el fin de semana me golpeó demasiado temprano. Entonces usted tiene el código de país (supongo que es un código de dos letras ISO 3166-1 alpha-2) para una dirección IP determinada. Solo tienes que compararlo con el conjunto de códigos permitidos y listo, si entiendo tus requisitos correctamente? –

0

Si no puede solicitar la ubicación del usuario, usar un servicio de geolocalización inversa basado en IP es el único camino a seguir. Nunca utilicé ningún servicio público, así que no puedo comentar la calidad de ninguno de ellos, desafortunadamente. Esto puede ser impreciso en cuanto a las regiones dentro de los EE. UU. (He visto que las IP de las conexiones 3G están muy lejos). Esto probablemente derrotará al usuario casual.

Por supuesto, los sofisticados 'atacantes' sortearán esto fácilmente con un proxy. Parece que hay ways of detecting if requests come from proxies, pero estos tampoco parecen ser del 100%.

Si usa la ubicación del usuario se convierte en una opción, puede usar CLGeocoder, o utilizar un servicio web que hace una geocodificación inversa de valores de latitud y longitud recopilados a través de Core Location. Para un nivel aún mayor de seguridad, firme los valores de latitud y longitud para ayudar a garantizar su integridad. Creo que esa es probablemente la mejor opción si realmente necesita la mejor protección posible de los usuarios internacionales que participan.

Esperamos que esto lo ayude a encaminarse por el buen camino. Hay muchas opciones disponibles, por lo que estoy seguro de que, dependiendo de sus necesidades, podrá encontrar una buena solución.

1

La solución más simple es consultar un servicio web existente, como hostip.info.

Tenga en cuenta que esto no es más que una muestra (que debe consultar el servicio web de forma diferente), pero en aras de la simplicidad:

NSError* error = nil; 
NSString* country = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://api.hostip.info/country.php"] encoding:NSUTF8StringEncoding error:&error]; 
//will show US if user is in the United States 
NSLog(@"%@", country); 

También tendría adquirir una (libre) de base de datos a sí mismo de http://www.maxmind.com/app/installation y o bien crear un servicio web o incluirlo en su aplicación

0

si quiere llegar a la información sobre su ciudad actual (no se recomienda.) - país, etc., con la información de su ubicación actual (latitud, longitud) que puede utilizar this

Espero que funcione para usted. buena suerte.

EDIT:

ohh lo siento, no llegué a ver la información sobre GPS.

0

Encontrará fácilmente la base de datos en la web que le informará sobre el país del usuario en función de su IP y luego creará un servicio web que detectará la IP del usuario y le devolverá la bandera a EE. UU.

1

tiene alook en geoPlugin, tiene varios servicios web que puede utilizar para obtener la ubicación de los usuarios de la IP y es gratis.

0

Dijiste que no puedes preguntarle al usuario la ubicación. ¿Eres capaz de usar CoreLocation para servicios de localización? Si es así, es muy probable que pueda obtener su ubicación sin consultarlo, simplemente mediante el uso de servicios de localización. No se requiere GPS, siempre que wifi esté habilitado. Hay varios puntos buenos acerca de esto en this thread.

Una vez que haya obtenido la ubicación, puede usar un geocodificador para determinar si se encuentra en los EE. UU.

Si necesita más detalles, solo pregunte, pero este método es realmente muy simple.

6

Bien, ¿cómo se hace eso con la IP?

Así, geoplugin.net tiene es increíble API JSON, el valor predeterminado es la IP al momento de conexión, por lo que lo que tiene que hacer es hacer una petición a la siguiente dirección:

http://www.geoplugin.net/json.gp 

Astunishing! Vuelve, para mí, estos datos:

geoPlugin({ 
    "geoplugin_request":"201.6.226.233", 
    "geoplugin_status":200, 
    "geoplugin_city":null, 
    "geoplugin_region":"S&atilde;o Paulo", 
    "geoplugin_areaCode":0, 
    "geoplugin_dmaCode":0, 
    "geoplugin_countryCode":"BR", 
    "geoplugin_countryName":"Brazil", 
    "geoplugin_continentCode":"SA", 
    "geoplugin_latitude":-23.473301, 
    "geoplugin_longitude":-46.665798, 
    "geoplugin_regionCode":27, 
    "geoplugin_regionName":"S&atilde;o Paulo", 
    "geoplugin_currencyCode":"BRL", 
    "geoplugin_currencySymbol":"&#82;&#36;", 
    "geoplugin_currencyConverter":2.0198 
}) 

Bueno, ahora lo que tiene que hacer es analizar esta "JSON". En realidad no es un JSON ya que tiene este contenedor geoplugin({data}). Entonces podrías ejecutar algunos filtros de forma perezosa, eliminando esas partes de un NSSTring, tal vez.

Veo que tiene prisa, así que tomé mi tiempo libre para escribir un código para usted. No es muy estándar, ya que no sé si está utilizando un marco REST que ayudaría, pero aquí va:

NSString *url = [NSString stringWithFormat:@"http://www.geoplugin.net/json.gp"]; 


    NSString *locationData = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]] 
               encoding:NSUTF8StringEncoding]]; 

    locationData = [locationData stringByReplacingOccurrencesOfString:@"geoPlugin(" withString:@""]; 
    locationData = [locationData stringByReplacingOccurrencesOfString:@")" withString:@""]; 

    //user some json parser here. 
    if([[[locationData JSONValue] valueForkey:@"geoplugin_countryCode"] isEqualToString:@"US"]){ 

     //proceed. 
    } 
Cuestiones relacionadas