iOS: ¿es un usuario en los Estados Unidos?

¿Hay alguna forma de que yo pueda detectar si un usuario está en los Estados Unidos sin preguntar por su location? Por ejemplo, cuando voy a Fandango en mi computadora, sabe en qué condado y estado estoy basado simplemente en mi WiFi.

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 un iPhone y estaba conectado con 3G y quería asegurarme de que los usuarios estuvieran en los Estados Unidos, ¿hay alguna manera de que pueda verificar esa información sin la pequeña vista de alerta " __ desea usar su location actual"? No necesito coorderadas exactas, solo tengo que confirmar que estos usuarios se encuentran en los EE. UU. (Incluyendo Hawai y Alaska) … locale?

Primero intentaré verificar el Código de país mobile del operador. Le dirá el código de país mobile numérico para el proveedor de services celulares del usuario y el usuario no puede cambiarlo a less que cambien a un proveedor de services 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 funcionará con dispositivos que no están conectados a un operador de telefonía mobile (iPod Touch, algunos iPads, etc.). Por lo tanto, como un retroceso, usaría o crearía mi propia API de geolocation de IP . Puede get una database gratuita que sea 99.5% precisa a nivel de país. Esto funcionará muy bien para detectar el país de un dispositivo que no tiene un proveedor de services mobilees.

Ok, como haces eso con la IP.

Por lo tanto, geoplugin.net tiene su sorprendente JSON API, por defecto la IP a la connection actual, por lo que lo que tiene que hacer es solicitar esta dirección:

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

¡Asombroso! Vuelve, para mí, esta información:

 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 tienes que hacer es analizar este "JSON". En realidad, no es un JSON, ya que tiene este geoplugin( {data} ) . Por lo que podría ejecutar perezosamente un poco de filtrado, eliminando esas partes de un NSSTring, tal vez.

Veo que tienes prisa, así que tomé mi time libre para escribir un código para ti. Es muy poco estándar, ya que no sé si está utilizando algún marco REST que pueda ayudar, 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. } 

En un entorno de networking, la location del usuario generalmente se "identifica" a través de la dirección IP.

¿Cuál es el propósito de la determinación dentro / fuera de los EE. UU.? ¿Qué tan preciso y seguro es? ¿Cuáles son las consecuencias, cuando un usuario se identifica erróneamente como estando dentro de los EE. UU.? ¿Cuáles son las consecuencias cuando produce un falso negativo? ¿Estás violando contratos o licencias, cuando tienes un falso positivo? ¿O incluso cometer un crimen? ¿O simplemente no le gustan 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 es esta confiabilidad suficiente para su propósito?

Como tiene una manera de get un código de país para una dirección IP determinada, solo tiene que compararlo con el set de códigos permitidos y ya está listo. Si, es decir, la calidad de la fuente de dicho código cumple con sus requisitos.

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

Tenga en count que esto es meramente una muestra (debe consultar el service web de manera 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 podría adquirir una database (gratuita) desde http://www.maxmind.com/app/installation y crear un service web o includelo en su aplicación (no recomendado).

tenga alook en geoPlugin , tiene varios web services que puede usar para get la location de los usuarios basada en la IP y es gratuita.

Si no puede solicitar la location del usuario, usar el service de geolocation inversa basado en IP es el único path a seguir. Nunca he usado ningún service público, por lo que desafortunadamente no puedo comentar sobre la calidad de ninguno de ellos. Esto puede ser inexacto 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 ocasional.

Por supuesto, sofisticados 'atacantes' conseguirán esto fácilmente con un proxy. Parece que hay forms de detectar si las requestes provienen de proxies, pero tampoco parecen ser 100%.

Si usar la location del usuario se convierte en una opción, entonces puede usar CLGeocoder o usar un service web que invierta la geoencoding a partir de los valores de latitud y longitud recostackdos a través de la location principal. Para un nivel de security aún mayor, firme los valores de latitud y longitud para ayudar a garantizar su integridad. Creo que esa es probablemente la mejor opción si realmente necesitas tener la mejor protección posible de los usuarios internacionales que participan.

Espero que esto te ayude a ponerte en el path correcto. Hay muchas opciones por ahí, así que estoy seguro de que según tus necesidades podrás encontrar una buena solución.

si desea get información sobre su ciudad actual, país, etc. con su información de location actual (latitud, longitud), puede usar esto

La esperanza funciona para ti. buena suerte.

EDITAR:

Perdón, no vi la información sobre el GPS.

Encontrará fácilmente la database en la web que le informará sobre el país del usuario según su IP y luego hará un service web que detectará la IP del usuario y devolverá la bandera para EE. UU.

Dijiste que no puedes pedirle al usuario la location. ¿Eres capaz de usar CoreLocation para services de location? Si lo es, entonces es muy probable que pueda get su location sin preguntarles, simplemente mediante el uso de services de location. No se requiere GPS, siempre que Wi-Fi esté habilitado. Hay varios puntos buenos sobre esto en este hilo .

Una vez que haya obtenido la location, puede usar un geocodificador para determinar si está ubicado en los EE. UU.

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