今天,接手项目的时候。有个需求,根据用户的位置不同,进行切换不同的服务器,以保证数据传输的质量。在大型网游的话,很有必要根据不同服务器的承载能力进行匹配用户最佳的服务器。至于我这app上的项目的话,区分的就是国内和国外的服务器。
一、根据IP进行判断当前的位置
我觉得这是一个比较稳定的判断方式,因为能准确知道用户当前位置的一个是app抓取的定位信息,另外一个就是你的IP地址。然而位置服务不是所有用户都会打开的。所以这个方法比较可行。
至于这个方法,首先要获取当前手机的IP地址,这中间有涉及到当前的网络格式,当然在我们国内大部分都是ipv4,在国外ipv6也是比较多的。所以流程大致这样:判断网络格式(是否是ipv6)->得出网络地址->调用接口去查询当前所在的区域。
二、根据系统的Region来处理
这个方法是通过获取系统的Region来获取,不过该region是用户自己设置的,并不是根据地理位置实时改变的。
//测试系统Region
NSLocale *locale = [NSLocale currentLocale];
NSLog(@"%@",[locale objectForKey:NSLocaleCountryCode]);//US:美国 CN:中国
三、根据定位来处理
如果用户打开了定位服务,这就非常好办了,比如你是一个天气或者导航,相信用户都会给你开放location。使用定位的流程就是:获取系统授权->打开定位服务->位置反编码获取当前区域
#import <CoreLocation/CoreLocation.h>
@property (nonatomic,strong)CLLocationManager * manager;
-(CLLocationManager *)manager
{
if (_manager == nil)
{
_manager = [CLLocationManager new];
//异步返回用户当前位置
_manager.delegate = self;
_manager.distanceFilter = kCLLocationAccuracyThreeKilometers;
//定位效果
_manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[_manager requestWhenInUseAuthorization];
}
}
return _manager;
}
#pragma mark - 定位代理
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"定位成功...");
CLLocation *location = locations[0];
[self.manager stopUpdatingLocation];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark * mark = placemarks[0];
[PublicFunction saveCity:mark.locality];
}];
}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"定位失败...");
}
同时,注意下info.plist中的定位的配置。
四、根据国际化来处理
这个方法是根据用户的使用习惯来处理的,但是很不靠谱。因为中国人也有很多使用英文语言的,这样国内的用户就访问了国外的服务器了。但是这种方法是最简单的...黑黑
NSArray *languages = [NSLocale preferredLanguages];
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"%@" , currentLanguage);//注意中文的一些简体和繁体