2010-06-15 58 views
25

我需要在启动时确定用户所在的国家/地区,以用于iPhone应用程序。据推测,我将不得不打开位置服务并进行某种反向地理编码。如果可能,我真的不想使用第三方网络服务,还有其他建议可以从服务提供的位置来确定国家吗?确定iPhone用户的国家

最初,我只需要检查用户是否在美国境内,但这可能会在未来增加更多的国家。我了解,该位置不能总是确定,或者用户可能已关闭位置服务。基本上,我只需要知道用户是否被检测到在美国境内,以便关闭特定功能。

编辑:在进一步阅读,它看起来像MKReverseGeocoder将要走的路,除非我不希望在我的应用程序中显示任何地图,这意味着我不允许使用它。

回答

4

鉴于MKReverseGeocoder的限制,对我来说,实现我所追求的唯一可行的方式是使用第三方服务来执行反向地理编码。我选择使用GeoNames,因为它们似乎是标准选择。

1

如果你不想使用iPhone SDK提供的Google服务,难道你不能只存储美国的A边界坐标,并检查你是否在里面?

这里是在这种情况下 How can I determine whether a 2D Point is within a Polygon?

一个相关的问题。如果限制的目的是比用户体验等(例如,执行一些特定的美国法律complicance)的东西,即当用户无法我想说你需要一些更严格的检查(毕竟,用户会拒绝使用位置服务,否则他/她不会)?

一种这样的方法是进行IP查找,例如, http://www.maxmind.com/app/geoip_country

+0

目的是限制功能,如果用户被发现在美国境内。如果用户关闭了位置服务,或者他们被发现在美国境外,则功能不受限制。我知道这很容易解决,但这些都是我的要求 - 更偏向于功能受到限制,而不是每次都要求100%。 – 2010-06-15 11:15:16

+0

我当然很乐意使用iPhone SDK提供的Google服务。有什么能够给我以后的东西吗? – 2010-06-15 11:15:42

33

你可以尝试另一个窍门是检查运营商的MCC

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

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

不适用于iPod Touch,缺少电话 – JOM 2010-06-15 19:09:51

+3

当然,它只是一个额外的信息来源。 – zoul 2010-06-16 04:39:06

+6

Apple的文档说'CTTelephonyNetworkInfo'只提供有关提供SIM卡的运营商的信息。因此,无论您是否漫游,这段代码都会得到相同的结果? – phoenies 2011-08-05 14:25:32

2

的NSLocale对象,如[NSLocale systemLocale], and [NSLocale autoupdatingCurrentLocale]返回`)的值为NSLocaleCountryCode。在Apple文档中查看它。

+0

用户当然可以改变他们的语言环境? – 2010-06-16 05:00:57

+0

区域设置只是配置。它与实际位置无关。 – 2015-01-20 11:24:32

+0

这是用户设置,是的,但在很多情况下,这是程序员所期望的。例如,用户想要她的日期,时间和货币格式留她的首选区域设置,无论她是哪个国家在物理上,这取决于使用情况。 – 2015-03-31 17:08:40

23
NSLocale *locale = [NSLocale currentLocale]; 
NSString *countryCode = [locale objectForKey: NSLocaleCountryCode]; 

NSString *countryName = [locale displayNameForKey: NSLocaleCountryCode 
         value: countryCode]; 
+0

用户是否可以自己更改语言环境,使其变得不可靠?此外,区域设置与手机的“语言”设置相同还是不同? – 2012-07-19 08:40:22

+1

这可以由用户设置中>常规>国际>地区格式进行更改。有一个区域格式和一个语言设置。 – MonsieurDart 2013-04-10 22:55:16

+0

并不是所有用户都使用真实的居住区域。应该谨慎使用。 – AlexeyVMP 2015-01-19 17:34:49