【问题标题】:iOS Force geolocation to return city name in a specific languageiOS强制地理定位以特定语言返回城市名称
【发布时间】:2013-08-21 00:56:57
【问题描述】:

我遇到了一个相当奇怪的情况,后端开发人员要求我强制执行地理定位返回的城市名称为特定语言?例如,无论 iOS 使用哪种语言,都让它返回哥本哈根而不是哥本哈根。我在网上找不到任何关于此的内容。您的帮助将不胜感激。谢谢

【问题讨论】:

  • 我对这个问题有点困惑。您是否尝试对位置进行反向地理编码(即,给定一个位置,以特定语言获取该位置的城市名称)?
  • 类似的东西。我正在尝试对地址进行地理编码并让核心位置框架以特定语言向我返回城市。但从我所见,该框架正在使用语言环境以用户在手机上设置的语言返回城市。我只需要它在例如无论用户在他的 ios 上设置什么语言,丹麦语

标签: ios geolocation core-location


【解决方案1】:

不确定这是否是最好和最安全的解决方案,但您可以在进行反向地理代码调用时临时更改区域设置,然后在完成后将其重置。

NSArray *defaultLanguages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
NSArray *languages = [NSArray arrayWithObject:@"da"];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        CLPlacemark *placemark = placemarks[0];
        NSString *danish = placemark.country;
        [[NSUserDefaults standardUserDefaults] setObject:defaultLanguages forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];
}];

【讨论】:

  • 让我在这里补充一下,建议的解决方案有一个非常糟糕的错误:它有效地将语言存储在应用程序域中,因此会覆盖系统中 AppleLanguages 的任何进一步更改(例如,当用户更改 iOS 的语言时) device 到其他一些值 - 结果应用程序 UI 不会考虑这些语言更改)。让我建议使用[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"] 来恢复覆盖。
  • @GrigoryEntin 是的,我曾提到您可能希望在完成地理编码后重置区域设置,但强调不这样做的危害也无妨。谢谢
  • 好吧,我不确定我是否理解正确。问题是您的解决方案(在完成处理程序中)中的 [[NSUserDefaults standardUserDefaults] setObject:defaultLanguages forKey:@"AppleLanguages"] 在完成后不会正确重置语言环境。它有效地将 defaultLanguages 的当前值存储在应用程序域中,而不是删除自定义的值。因此,如果 AppleLanguages 的系统范围值发生更改,它将不会反映在应用程序默认值中,因为它将被存储的值覆盖(不再匹配当前/系统范围的值)。
  • @GrigoryEntin 啊,所以你是说默认情况下 [[NSUserDefaults standardUserDefaults] setObject:defaultLanguages forKey:@"AppleLanguages"] 返回系统语言环境,但如果你覆盖它,它将返回任何无论用户是否在设置中更改它,都将其设置为值。如果您从标准用户默认值中删除 AppleLanguages,那么 [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"] 将始终返回系统区域设置?我尚未对其进行测试,但如果这是真的,那么您是正确的重置语言环境的正确方法就是您建议的方式
  • 是的,完全正确。这就是我所面临的,这就是 NSUserDefaults 域的工作方式。根据Apple docs -setObject:forKey: “在标准应用程序域中设置指定默认键的值”。但是(系统范围的)“AppleLanguages”是在 NSGlobalDomain 中设置的。应用程序域在用户默认搜索列表中优先于 NSGlobalDomain,因此使用 -setObject:forKey: 设置值将覆盖 NSGlobalDomain 中值的任何进一步更改。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多