2012-08-30 15 views
7

我有沒有什麼方法可以檢測用戶是否在美國而不詢問他們的位置?例如,當我在我的電腦上去Fandango時,它知道我所在的縣和州只是基於我的WiFi。iOS - 是美國的用戶嗎?

如果我有一個設備,也許是一個iPod Touch,沒有GPS,我想驗證它是在美國,並且它們連接到WiFi ...或者如果我有iPhone和它3G被連接,我想確保用戶是在美國,是有辦法,我可以檢查不小的警報視圖的信息「__想用你的當前位置」?我不需要確切的座標,我只需要確認這些用戶在美國(包括夏威夷和阿拉斯加)...區域設置?

+0

現在我可以檢測「EN_US」與區域...這在美國會是這樣嗎? –

+2

區域設置是用戶可配置的。例如,居住在美國的講中文的人可能會將其手機的語言和語言環境設置爲中國。您不應該使用用戶的區域設置來確定它們的位置;它應該用於確定如何本地化他們的內容。 –

回答

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。你可以得到一個free database,在國家級別上準確率爲99.5%。這對於檢測沒有移動提供商的設備的國家將很有幫助。

+0

當運營商信息不可用時,這與IP位置匹配作爲回退相結合似乎是一個很好的解決方案。 運營商的移動國家代碼將是檢查任何蜂窩連接設備的非常準確的方法。然後,當載波信息不可用或正在使用非蜂窩設備時,您將回退到IP位置匹配。 –

+1

有關MCC的一個問題:在國家漫遊之外,是提供基礎運營商的MCC還是漫遊運營商的MCC? –

+4

來自[apple's文檔]的@ScottLemmon(http://developer.apple.com/library/ios/DOCUMENTATION/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1-SW1 ) - 「如果用戶正在漫遊,則值不會更改;它始終代表與用戶擁有帳戶的提供商。」 –

3

在用戶的location is usually "identified"通過IP地址的網絡環境。

什麼是裏面的目的/在美國以外的決心?它是如何準確/失敗的? 當用戶被錯誤地認定爲在美國境內時,會產生什麼後果?當你產生假陰性時,會產生什麼後果?當你有誤報時,你是否違反合同或許可證?甚至犯下罪行?或者你只是不喜歡外國人,這是你的(或你的僱主)的尊嚴受傷?

真正的問題是:如何可靠信息,您可以通過本地化的IP地址來的信息,併爲這種可靠性足以讓你的目的是什麼?

當你有辦法讓一個國家代碼對於一個給定的IP地址,你就必須把它比作給定集合允許代碼和你做。如果這就是說,代碼的來源質量符合您的要求。

+0

它必須是非常準確的,我在NDA的目的下。如果我有通過WiFi的IP地址,我可以檢測用戶的城市和國家,如果我只有通過3G的IP地址,我應該仍然能夠檢查用戶國家的權利?我試圖做研究,顯然有辦法檢查一個IP地址的國家,但他們涉及到找到IP地址,將其從一個地址轉換爲一個IP號碼,然後檢查我似乎無法找到的最後一件事.. –

+0

好的我能找到一個產生IP信息JSON的服務(api.ipinfodb.com)..所以如果我的JSON返回一個包含所有這些東西的字符串:{ \t「statusCode」:「OK 「 \t 」statusMessage「: 」「, \t 」ip地址「: 」************「, \t 」COUNTRYCODE「: 」US「, \t 」國家名稱「:」 UNITED國家「 }我只想檢查國家代碼說美國,UM或VI我該怎麼做? –

+0

對不起,我遲到了,週末打得太早。所以你有一個給定IP地址的國家代碼(我認爲是一個兩字母ISO 3166-1 alpha-2代碼)。你只需要將它與給定的允許代碼集進行比較,如果我正確理解了你的需求,你就完成了。 –

0

如果您不能要求用戶的位置,使用基於IP的反向地理定位服務是唯一的出路。不幸的是,我從未使用任何公共服務,所以我不能評論其中任何一個的質量。就美國境內的地區而言,這可能是不準確的(我已經看到3G連接的IP地址應該離開)。這可能會打敗臨時用戶。

當然,複雜的「攻擊者」會用代理輕鬆解決這個問題。似乎有ways of detecting if requests come from proxies,但這些似乎也不是100%。

如果使用用戶的位置成爲選項,那麼您可以使用CLGeocoder或使用通過核心位置收集的緯度和經度值反轉地理編碼的Web服務。要獲得更高級別的安全性,請簽署經緯度值以確保其完整性。如果你真的需要從國際用戶那裏獲得最好的保護,我認爲這可能是最好的選擇。

希望這可以幫助你走上正確的軌道。有很多選擇,所以我有信心根據您的需求,您將能夠找到一個好的解決方案。

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服務或將其包含在你的應用程序

0

如果你想達到你的當前城市信息(不推薦) - 國家等。與您的當前位置信息(緯度,經度),可以使用this

希望

適合你。祝你好運。

EDİT:

ohh對不起,我沒有看到關於GPS的信息。

0

您可以在網上輕鬆找到基於IP的用戶所在國家/地區的數據庫,然後製作網絡服務,檢測用戶IP並返回美國國旗。

1

已登錄geoPlugin,它有幾個web服務,您可以使用它來獲取基於IP及其免費的用戶位置。

0

你說你不能要求用戶的位置。你能夠使用CoreLocation進行定位服務嗎?如果你是,那麼你很有可能能夠在不詢問他們的情況下獲得他們的位置,只需使用位置服務即可。只要啓用wifi,GPS不是必需的。 this thread有幾個好處。

獲得位置後,您可以使用地理編碼器確定它是否位於美國。

如果您需要更多詳細信息,只需詢問,但這種方法確實非常簡單。

6

好的,你如何做到這一點與知識產權。

所以,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&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 
}) 

那麼,現在你所要做的只是解析這個「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. 
    } 
相關問題