7

我有什么方法可以在不询问用户位置的情况下检测用户是否在美国?例如,当我在计算机上访问 Fandango 时,它仅根据我的 WiFi 就知道我在哪个县和州。

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

4

9 回答 9

7

好的,您如何使用 IP 来做到这一点。

所以,geoplugin.net 有它很棒的 JSON api,它默认 IP 为当前连接,所以你要做的就是向这个地址发出请求:

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

惊人!对我来说,它返回以下数据:

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.
    }
于 2012-09-13T02:50:44.080 回答
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 地理定位API。您可以获得一个在国家一级准确率为 99.5% 的免费数据库。这对于检测没有移动提供商的设备所在的国家/地区非常有用。

于 2012-09-11T22:59:18.823 回答
3

在网络环境中,用户的位置通常通过 IP 地址来“识别”。

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

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

由于您有办法获取给定 IP 地址的国家/地区代码,因此您只需将其与给定的一组允许代码进行比较即可完成。也就是说,如果所述代码的源代码质量符合您的要求。

于 2012-09-06T06:36:59.460 回答
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 服务或将其包含在您的应用程序中(不推荐。)

于 2012-09-12T11:46:19.797 回答
1

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

于 2012-09-12T17:55:48.463 回答
0

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

当然,老练的“攻击者”可以通过代理轻松绕过这个问题。似乎有办法检测请求是否来自代理,但这些似乎也不是 100%。

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

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

于 2012-09-11T23:32:13.333 回答
0

如果您想使用当前位置信息(纬度、经度)获取有关当前城市 - 国家/地区等的信息,您可以使用

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

编辑:

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

于 2012-09-12T11:56:02.800 回答
0

您将很容易在网络上找到数据库,该数据库会根据用户的 IP 告诉您用户所在的国家/地区,然后创建一个网络服务来检测用户 IP 并返回美国的标志。

于 2012-09-12T14:02:15.280 回答
0

您说您不能向用户询问位置。您可以使用 CoreLocation 进行定位服务吗?如果您是,那么您很可能无需询问他们就可以获取他们的位置,只需使用定位服务即可。只要启用了wifi,就不需要GPS。在这个线程中有几个很好的观点。

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

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

于 2012-09-13T00:41:29.933 回答