2012-08-30 2 views
7

ユーザーが自分の場所を尋ねずに米国にいるかどうかを検出する方法はありますか?たとえば、私がコンピュータ上でファンダンゴに行くとき、私は自分のWiFiに基づいている郡と州を知っています。iOS - 米国のユーザーですか?

GPSが搭載されていない可能性があるiPod Touchのデバイスがあり、それが米国にあることを確認したい場合、に接続されています。 ...または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を使用または作成します。国レベルで正確な99.5%のfree databaseを得ることができます。これは、モバイルプロバイダを持たないデバイスの国を検出するのに効果的です。

+0

これは、キャリア情報が利用できないときのフォールバックとしてのIPロケーションマッチングと組み合わせて、良い解決策のように思えます。 携帯電話のモバイル国コードは、携帯端末に接続されているデバイスを確認する非常に正確な方法です。次に、キャリア情報が利用できない場合、または非携帯デバイスが使用されている場合は、IPロケーションマッチングに戻ります。 –

+1

MCCについての1つの質問:国外のローミング中に、ベースキャリアまたはローミングキャリアのMCCに提供されるMCCがありますか? –

+4

@ScottLemmon [appleの文書](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 "ipAddressの": "************"、 \t "国番号": "US"、 \t "COUNTRYNAME":" UNITED STATES " }と、国コードがUS、UMまたはVIと表示されていることを確認したいのですが、どうすればいいですか? –

+0

私の遅い応答に申し訳ありません、週末はあまりにも早く私を打つ。したがって、特定のIPアドレスに対して国コード(私は2文字のISO 3166-1アルファ2コードと見なします)を持っています。私はあなたの要求を正しく理解していれば、許されたコードのセットとそれを比較しなければなりません。 –

0

ユーザーの場所を尋ねることができない場合は、IPベースの逆ジオロケーションサービスを使用することが唯一の方法です。私は公共サービスを一度も使用していないので、残念ながらそれらのいずれかの品質についてコメントすることはできません。これは、米国内の地域(私は3G接続からのIPが途絶えているのを見てきました)までは間違っている可能性があります。これはおそらくカジュアルなユーザーを倒すでしょう。

もちろん、洗練された「攻撃者」はこれをプロキシで簡単に回避できます。 ways of detecting if requests come from proxiesがあるようですが、これも100%ではないようです。

ユーザーの場所を使用する場合はCLGeocoderを使用するか、Core Location経由で収集した緯度と経度の値から逆ジオコーディングを行うWebサービスを使用します。セキュリティレベルをさらに高めるには、緯度と経度の値に署名して、完全性を確保してください。参加している国際ユーザーからの最高の保護を本当に必要とするなら、これはおそらく最良の選択だと思います。

うまくいけば、これは正しい軌道に乗るのに役立ちます。そこにはたくさんのオプションがありますので、あなたのニーズに応じて確信しています。良い解決策を見つけることができます。

1

最も簡単な解決策はhostip.infoのように、既存のWebサービスを照会することです。

(あなたは異なった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

希望があなたのために働く。がんばろう。

編集:

おお申し訳ありませんが、私はGPSに関する情報を参照してくださいdidntの。

0

あなたは簡単に、ユーザーのIPを検出し、米国のフラグを返します。ウェブサービスを作る彼らのIPに基づいてユーザーの国について教えてくれますウェブ上のデータベースを検索します。

1

geoPluginでalookを持っている、それはあなたがIPとその自由のもと、ユーザーの位置を取得するために使用できるいくつかのWebサービスがあります。

0

あなたはその場所をユーザーに尋ねることはできないと言いました。ロケーションサービスにCoreLocationを使用できますか?もしあなたがそうであれば、位置情報サービスを使うだけで、あなたは彼らに尋ねることなく自分の場所を得ることができるでしょう。 Wi-Fiが有効になっている限り、GPSは必須ではありません。これについては、this threadでいくつかの良い点があります。あなたが場所を取得したら

、あなたはそれが米国に位置していますかどうかを判断するためにジオコーダを使用することができます。

はあなただけ聞いて、より多くの詳細が必要な場合は、この方法は実際には非常に簡単です。

6

[OK]をIPでどのように行うのですか?

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

Astunishing:

ので、geoplugin.netはそれは素晴らしいのJSON APIのしている、現在たっがデフォルトIPは、だから何あなたがしなければならないことは、このアドレスへのリクエストを作るです!私にとってこのデータは返されます:

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"を解析するだけです。このgeoplugin({data})ラッパーを持っているので、実際にはJSONではありません。だから、遅延を緩和してNSSTringの部分を削除することもできます。

私はあなたが急いでいる参照してくださいので、私はあなたのためにいくつかのコードを書くために、私の暇な時間を要しました。あなたが助けるRESTフレームワークを使用しているかどうかわからないので、非常に非標準ですが、ここに行く:

関連する問題