iOS - 是美国的用户?

时间:2012-08-30 21:07:06

标签: ios location wifi locale

有没有办法让我检测用户是否在美国而不询问他们的位置?例如,当我在计算机上访问Fandango时,它会根据我的WiFi知道我所在的县和州。

如果我有一台设备,也许是没有GPS的iPod Touch,我想验证它是在美国,并且它们连接到 WiFi ......或者如果我有iPhone并且它与 3G 连接并且我想确保用户在美国,我是否有办法在没有小警报视图的情况下检查该信息“ __ 想要使用您当前的位置“?我不需要确切的坐标,我只需要确认这些用户是在美国(包括夏威夷和阿拉斯加州)......当地?

9 个答案:

答案 0 :(得分:6)

好的,你是怎么用IP做到的。

因此,geoplugin.net拥有令人惊叹的JSON api,它将IP默认为当前连接,因此您需要做的是向此地址发出请求:

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

Astunishing!对我来说,它返回了这些数据:

geoPlugin({
  "geoplugin_request":"201.6.226.233",
  "geoplugin_status":200,
  "geoplugin_city":null,
  "geoplugin_region":"Sã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ão Paulo",
  "geoplugin_currencyCode":"BRL",
  "geoplugin_currencySymbol":"R$",
  "geoplugin_currencyConverter":2.0198
})

好吧,现在你要做的就是解析这个“JSON”。它实际上不是JSON,因为它有这个geoplugin( {data} )包装器。所以你可以懒惰地执行一些过滤,删除NSSTring的那些部分,也许。

我看到你很匆忙,所以我利用业余时间为你写了一些代码。这是非标准的,因为我不知道你是否使用任何有用的REST框架,但是这里有:

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.
    }

答案 1 :(得分:5)

我首先尝试检查运营商的Mobile Country Code。它将告诉您用户的蜂窝服务提供商的数字移动国家/地区代码,除非用户切换到其他国家/地区的服务提供商,否则用户无法更改。

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

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

这当然不适用于未连接到移动运营商(iPod Touch,某些iPad等)的设备。因此,作为后退,我会使用或创建自己的IP geolocation API。您可以在国家/地区级别获得99.5%准确率的free database。这样可以很好地检测没有移动提供商的设备的国家/地区。

答案 2 :(得分:3)

在网络环境中,用户通过IP地址location is usually "identified"

美国内部/外部决定的目的是什么?它有多准确/失败? 当用户被错误地识别为在美国境内时会产生什么后果?当你产生假阴性时会产生什么后果?当你有误报时,你是否违反了合同或许可证?甚至犯罪?或者你只是不喜欢外国人,你的(或你的雇主)的尊严受伤了吗?

真正的问题是:通过本地化IP地址获得的信息有多可靠,这种可靠性是否足以达到您的目的?

由于您可以获取给定IP地址的国家/地区代码,因此您只需将其与给定的允许代码集进行比较即可完成。如果,即所述代码的来源质量符合您的要求。

答案 3 :(得分:1)

最简单的解决方案是查询现有的Web服务,例如hostip.info。

请注意,这只是一个示例(您应该以不同方式查询Web服务),但为了简单起见:

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);

您还可以自http://www.maxmind.com/app/installation获取(免费)数据库,并创建一个Web服务或将其包含在您的应用程序中(不推荐)。

答案 4 :(得分:1)

查看geoPlugin,它有几个网络服务,您可以使用这些服务来获取基于IP及其免费的用户位置。

答案 5 :(得分:0)

如果不允许您询问用户的位置,则使用基于IP的反向地理定位服务是唯一的方法。我从来没有使用任何公共服务,所以我不能评论其中任何一个的质量。就美国境内的地区而言,这可能是不准确的(我已经看到过来自3G连接的IP)。这可能会打败临时用户。

当然,复杂的“攻击者”会通过代理轻松解决这个问题。似乎有ways of detecting if requests come from proxies,但这些似乎也不是100%。

如果使用用户的位置成为一个选项,那么您可以使用CLGeocoder,或使用通过Core Location收集的纬度和经度值进行反向地理编码的Web服务。为了更高级别的安全性,请签署纬度和经度值以帮助确保其完整性。我认为如果你真的需要得到国际用户最好的保护,这可能是最好的选择。

希望这有助于您走上正轨。有很多选择,所以我有信心根据您的需求,您将能够找到一个好的解决方案。

答案 6 :(得分:0)

如果您想使用当前位置信息(纬度,经度)获取有关当前城市的信息,请访问this

希望对你有用。祝你好运。

编辑:

对不起,我没看到有关GPS的信息。

答案 7 :(得分:0)

您可以轻松地在网络上找到基于其IP告诉您用户国家/地区的数据库,然后创建一个检测用户IP并返回美国国旗的网络服务。

答案 8 :(得分:0)

你说你不能要求用户提供该位置。您是否可以将CoreLocation用于位置服务?如果您是,那么您很可能只需使用位置服务就可以获得他们的位置而无需询问他们。只要启用了wifi,就不需要GPS。在this thread中有几个好点。

获得位置后,您可以使用地理编码器确定它是否位于美国。

如果您需要更多详细信息,请问,但这种方法非常简单。