2012-08-30 33 views
7

Có cách nào để tôi phát hiện xem người dùng có ở Hoa Kỳ mà không hỏi vị trí của họ không? Ví dụ, khi tôi đi đến Fandango trên máy tính của tôi nó biết hạt và tiểu bang tôi chỉ trong dựa trên WiFi của tôi.iOS - là người dùng ở Hoa Kỳ?

Nếu tôi có thiết bị, có lẽ iPod Touch không có GPS và tôi muốn xác minh thiết bị đó ở Hoa Kỳ và chúng được kết nối với WiFi ... hoặc nếu tôi có iPhone và nó được kết nối với 3G và tôi muốn đảm bảo rằng người dùng ở Hoa Kỳ, có cách nào để tôi có thể kiểm tra thông tin đó mà không có chế độ xem cảnh báo nhỏ "__ muốn sử dụng vị trí hiện tại của bạn" không? Tôi không cần tọa độ chính xác, tôi chỉ cần xác nhận rằng những người dùng này ở Hoa Kỳ (bao gồm Hawaii và Alaska) ... miền địa phương?

+0

Ngay bây giờ tôi có thể phát hiện "en_" với ngôn ngữ ...Điều này sẽ luôn luôn là trường hợp ở Hoa Kỳ? –

+2

Locale là người dùng có thể cấu hình. Ví dụ: một người sống ở Hoa Kỳ nói tiếng Trung Quốc có thể có ngôn ngữ và ngôn ngữ của điện thoại được đặt ở Trung Quốc. Bạn không nên sử dụng ngôn ngữ của người dùng để xác định vị trí của họ; nó nên được sử dụng để xác định cách bản địa hóa nội dung của chúng. –

Trả lời

5

Trước tiên, tôi sẽ thử kiểm tra số điện thoại Mobile Country Code của nhà cung cấp dịch vụ. Nó sẽ cho bạn biết mã quốc gia di động dạng số cho nhà cung cấp dịch vụ di động của người dùng và không thể thay đổi bởi người dùng trừ khi họ chuyển sang nhà cung cấp dịch vụ ở một quốc gia khác.

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

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

Điều này tất nhiên sẽ không hoạt động với các thiết bị không được kết nối với nhà cung cấp dịch vụ di động (iPod Touch, một số iPad, vv). Do đó, khi thu gọn, tôi sẽ sử dụng hoặc tạo API IP geolocation của riêng mình. Bạn có thể nhận được free database có độ chính xác 99,5% ở cấp quốc gia. Điều này sẽ hoạt động tốt để phát hiện quốc gia của thiết bị không có nhà cung cấp dịch vụ di động.

+0

Điều này kết hợp với tính năng khớp với vị trí IP làm giảm thời gian khi thông tin của nhà cung cấp dịch vụ không khả dụng giống như một giải pháp tốt. Mã quốc gia trên thiết bị di động của nhà cung cấp dịch vụ di động là cách rất chính xác để kiểm tra mọi thiết bị được kết nối di động. Sau đó, khi thông tin của nhà cung cấp dịch vụ không khả dụng hoặc thiết bị không phải là thiết bị di động đang được sử dụng, bạn sẽ quay trở lại kết hợp vị trí IP. –

+1

Một câu hỏi về MCC: khi ra khỏi quốc gia chuyển vùng, MCC có được cung cấp cho nhà cung cấp dịch vụ cơ bản hay MCC của nhà cung cấp dịch vụ chuyển vùng không? –

+4

@ScottLemmon từ [tài liệu của apple] (http://developer.apple.com/library/ios/DOCUMENTATION/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1-SW1) - "Giá trị không thay đổi nếu người dùng đang chuyển vùng; nó luôn đại diện cho nhà cung cấp mà người dùng có tài khoản". –

3

Trong môi trường được kết nối mạng của người dùng location is usually "identified" thông qua địa chỉ IP.

Mục đích của quyết định bên trong/bên ngoài Hoa Kỳ là gì? Làm thế nào chính xác/không an toàn có nó được? Hậu quả là gì, khi người dùng bị xác định sai là ở bên trong Hoa Kỳ? Hậu quả là gì, khi bạn tạo ra một âm tính giả? Bạn có vi phạm hợp đồng hoặc giấy phép, khi bạn có dương tính giả không? Hoặc thậm chí phạm tội? Hay bạn không thích người nước ngoài và đó là phẩm giá của bạn (hoặc chủ nhân của bạn) bị thương?

Câu hỏi thực sự là: Mức độ tin cậy mà bạn đạt được bằng cách bản địa hóa địa chỉ IP và độ tin cậy này đủ cho mục đích của bạn?

Khi bạn có cách để lấy mã quốc gia cho một địa chỉ IP cụ thể, bạn chỉ cần so sánh nó với tập hợp các mã được cho phép và bạn đã hoàn tất. Nếu, có nghĩa là, chất lượng của mã nguồn nói trên đáp ứng các yêu cầu của bạn.

+0

Nó phải rất chính xác và tôi đang theo NDA cho mục đích của nó. Nếu tôi có địa chỉ IP qua WiFi, tôi có thể phát hiện thành phố và quốc gia của người dùng, nếu tôi chỉ có địa chỉ IP qua 3g, tôi vẫn có thể kiểm tra quốc gia của người dùng đúng không? Tôi đã thử làm nghiên cứu và dường như có nhiều cách để kiểm tra quốc gia của một địa chỉ IP nhưng họ liên quan đến việc tìm địa chỉ IP, chuyển đổi nó từ địa chỉ thành số ip, sau đó kiểm tra một điều cuối cùng mà tôi dường như không thể tìm thấy .. –

+0

Được rồi tôi đã có thể tìm thấy một dịch vụ (api.ipinfodb.com) tạo ra JSON của Thông tin IP .. vì vậy nếu JSON của tôi trả về một chuỗi có tất cả nội dung sau: { \t "statusCode": "OK " \t "statusMessage": "", \t "ipaddress": "************", \t "countryCode": "Mỹ", \t "COUNTRYNAME":" United STATES " } và tôi chỉ muốn kiểm tra xem mã quốc gia có nói US, UM hoặc VI không? Làm thế nào để tôi làm điều đó? –

+0

Xin lỗi vì câu trả lời muộn của tôi, cuối tuần đã đánh tôi quá sớm. Vì vậy, bạn có mã quốc gia (tôi giả sử là mã hai ký tự ISO 3166-1 alpha-2) cho một địa chỉ IP đã cho. Bạn chỉ cần so sánh nó với tập hợp các mã được cho phép và bạn đã hoàn thành, nếu tôi hiểu chính xác yêu cầu của bạn ?! –

0

Nếu bạn không được phép yêu cầu vị trí của người dùng, sử dụng dịch vụ vị trí địa lý đảo ngược dựa trên IP là cách duy nhất để thực hiện. Tôi chưa bao giờ sử dụng bất kỳ dịch vụ công cộng nào vì vậy tôi không thể nhận xét về chất lượng của bất kỳ dịch vụ nào, thật không may. Điều này có thể không chính xác như xa như các khu vực trong nước Mỹ (tôi đã nhìn thấy IP từ kết nối 3G được cách tắt). Điều này có thể sẽ đánh bại người dùng bình thường.

Tất nhiên, những kẻ tấn công tinh vi sẽ dễ dàng thực hiện việc này với proxy. Dường như có ways of detecting if requests come from proxies nhưng chúng dường như không phải là 100%.

Nếu sử dụng vị trí của người dùng trở thành tùy chọn, bạn có thể sử dụng CLGeocoder hoặc sử dụng dịch vụ web đảo ngược mã hóa địa lý từ các giá trị vĩ độ và kinh độ được thu thập thông qua Vị trí chính. Để có mức bảo mật cao hơn, hãy ký các giá trị vĩ độ và kinh độ để giúp đảm bảo tính toàn vẹn của chúng. Tôi nghĩ đó có lẽ là lựa chọn tốt nhất nếu bạn thực sự cần sự bảo vệ tốt nhất có thể từ những người dùng quốc tế tham gia.

Hy vọng điều này sẽ giúp bạn đi đúng hướng. Có rất nhiều lựa chọn để tôi tự tin tùy thuộc vào nhu cầu của bạn, bạn sẽ có thể tìm ra giải pháp tốt.

1

Giải pháp đơn giản nhất là truy vấn dịch vụ web hiện có, như hostip.info.

Xin lưu ý rằng đây chỉ đơn thuần là một mẫu (bạn nên truy vấn dịch vụ web khác nhau), nhưng vì lợi ích của sự đơn giản:

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

Bạn cũng muốn có được một (miễn phí) cơ sở dữ liệu cho mình từ http://www.maxmind.com/app/installation và hoặc tạo ra một dịch vụ web hoặc bao gồm nó trong ứng dụng của bạn

0

nếu bạn muốn tiếp cận thông tin về thành phố hiện tại của bạn (không khuyến khích). - đất nước, vv với thông tin của bạn hiện tại vị trí (vĩ độ, kinh độ), bạn có thể sử dụng this

hy vọng hoạt động cho bạn. chúc may mắn.

EDİT:

ohh xin lỗi, tôi không thấy thông tin về GPS.

0

Bạn sẽ dễ dàng tìm thấy cơ sở dữ liệu trên web sẽ cho bạn biết về quốc gia người dùng dựa trên IP của họ, sau đó tạo một dịch vụ web sẽ phát hiện IP người dùng và trả cờ cho Hoa Kỳ.

1

đã bẻ khóa tại geoPlugin, nó có một số dịch vụ web mà bạn có thể sử dụng để có được vị trí người dùng dựa trên IP và miễn phí của nó.

0

Bạn đã nói bạn không thể yêu cầu người dùng cho vị trí đó. Bạn có thể sử dụng CoreLocation cho các dịch vụ định vị không? Nếu bạn đang có, sau đó bạn rất có thể sẽ có thể có được vị trí của họ mà không yêu cầu họ, chỉ đơn giản bằng cách sử dụng dịch vụ định vị. Không yêu cầu GPS, miễn là bật wifi. Có một số điểm tốt về việc này được thực hiện trong this thread.

Khi bạn đã có được vị trí, bạn có thể sử dụng trình mã hóa địa lý để xác định xem nó có nằm ở Hoa Kỳ hay không.

Nếu bạn cần thêm chi tiết, chỉ cần hỏi, nhưng phương pháp này thực sự rất đơn giản.

6

Ok, bạn làm như thế nào với IP.

Vì vậy, geoplugin.net có thật đáng ngạc nhiên JSON api, nó mặc định địa chỉ IP đến hiện conection, vì vậy những gì bạn phải làm là thực hiện một yêu cầu đến địa chỉ này:

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

Astunishing! Nó trả lại, cho tôi, dữ liệu này:

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

Vâng, bây giờ những gì bạn phải làm là phân tích cú pháp "JSON" này. Nó không thực sự là một JSON vì nó có trình bao bọc geoplugin({data}) này. Vì vậy, bạn có thể uể oải thực hiện một số lọc, loại bỏ những phần của một NSSTring, có thể.

Tôi thấy bạn đang vội vàng, vì vậy tôi đã dành thời gian rảnh rỗi của tôi để viết một số mã cho bạn. Nó rất không chuẩn vì tôi không biết liệu bạn có đang sử dụng bất kỳ khung công tác REST nào có thể trợ giúp hay không, nhưng ở đây:

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. 
    } 
Các vấn đề liên quan