iOS 系统语言导致定位反编码问题

2021-12-24  本文已影响0人  ShawnAlex

今天做项目突然发现App系统语言变了竟然会影响定位反编码信息, emmm.... -_-

问题场景:

以这段反编码代码举例

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    CLLocation *newLocation = locations[0];
    //  获取当前所在的城市名
         CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    //  根据经纬度反向地理编译出地址信息
         [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){
             if (array.count > 0){
                 CLPlacemark *placemark = [array objectAtIndex:0];
                 //获取城市
                 NSString *city = placemark.locality;
                 if (!city) {
                     //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
                     city = placemark.administrativeArea;
                 }
                 NSLog(@"location -- 省:%@, 市:%@, 区:%@ 街道:%@", placemark.administrativeArea, city, placemark.subLocality, placemark.name);
              
             } 
         }];
    //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新
    [manager stopUpdatingLocation];
}

ios系统为中文时

中文反编码

反编码显示为中文信息

ios系统为英文/韩文..国际化语言时

image.png

反编码显示为英文信息

这样的话有些情况下就会影响一些业务功能的实现

解决方法

关键代码

// 保存当前语言 (英文/韩文 ......)
NSMutableArray *defaultLanguages = [[NSUserDefaults standardUserDefaults]
                                        objectForKey:@"AppleLanguages"];

// 强制成简体中文
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-hans",nil]  forKey:@"AppleLanguages"];


//还原之前设置的语言
[[NSUserDefaults standardUserDefaults] setObject: defaultLanguages forKey:@"AppleLanguages"];

设置位置

位置1

我们可以放在反编码位置

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    
    CLLocation *newLocation = locations[0];
    // 停止位置更新
    [manager stopUpdatingLocation];
    
    // 保存
    NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults]
    objectForKey:@"AppleLanguages"];
    
    // 修改
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-hans",nil]
    forKey:@"AppleLanguages"];

    // 逆地理编码
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
        if(!error){
            for (CLPlacemark * placemark in placemarks) {
                NSString *cityName = [placemark locality];
                NSLog(@"cityName===》%@", cityName);//这里可看到输出为中文
                break;
            }
        }
        // 还原
        [[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"];
    }];
    
}

位置2

我们可以放在AppDelegate中, 保证使用App整个过程都是简体中文


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-hans",nil]  forKey:@"AppleLanguages"];
   return YES;
}
上一篇 下一篇

猜你喜欢

热点阅读