Getting country code (ISO-3166-alpha2 standard) for iOS >= 16 after deprecated Locale.isoRegionCodes API?

179 views Asked by At

We are facing the following issue with the following API Locale.isoRegionCodes which has been deprecated from iOS >= 16. The new API is the following Locale.Region.isoRegions but when doing a mapping like the following the region.identifier returns the code 001.

if #available(iOS 16, *) {
            
           let CountryCodeWithNewApi = Locale.Region.isoRegions.map { region in
                CustomCountry(value: "", key: region.identifier)
            }.sorted(by: { $0.value < $1.value })
            
        } else {
            // Fallback on earlier versions
        }

How do we get the old country codes of 2 letters by deriving it from this code? is it possible or we are required to do a manual mapping of the ISO-3166-alpha 2 codes to be able to display all the country codes to the user?

1

There are 1 answers

5
HangarRash On BEST ANSWER

The expression:

Locale.Region.isoRegions.filter { $0.subRegions.isEmpty }.map { $0.identifier }

gives the same list as the deprecated:

Locale.isRegionCodes

The following code:

let oldCodes = Locale.isoRegionCodes.sorted()
let newCodes = Locale.Region.isoRegions.filter { $0.subRegions.isEmpty }.map { $0.identifier }.sorted()
print(oldCodes == newCodes)

prints:

true

when run on a macOS Swift Playground in Xcode 15.2 under macOS 14.3.1. It should also be true under iOS (but I haven't confirmed).

Your code then becomes something like the following:

if #available(iOS 16, *) {
    let countries = Locale.Region.isoRegions.compactMap {
        $0.subRegions.isEmpty ? CustomCountry(value: "", key: $0.identifier) : nil
    }.sorted(by: { $0.value < $1.value })
} else {
    let countries = Locale.isoRegionCodes.map { CustomCountry(value: "", key: $0) }
}