# libPhoneNumber-iOS: thirteen products, thirteen podspecs, and a homepage that ends in latestc

> An Apple platform port of Google's libphonenumber with an Objective-C core and a layer of Swift facades, where the release titles carry the upstream metadata version and the deployment targets are set by what Xcode 27 accepts. The naming asymmetry between products, pods and the repository is the part that costs time.

**iziz/libPhoneNumber-iOS** — iOS port of Google's libphonenumber with Objective-C core, Swift facade, SwiftUI input, and CocoaPods/SPM support

- Repository: https://github.com/iziz/libPhoneNumber-iOS
- Website: https://github.com/iziz/libPhoneNumber-iOS/releases/latestc
- Stars: 2,382 · Forks: 483
- Language: Objective-C
- License: Apache-2.0
- Published: 2026-09-28 · Updated: 2026-09-28 · Language: en
- Canonical page: https://hysenlabs.com/projects/iziz-libphonenumber-ios

## The homepage field ends in the letters latestc

The recorded homepage is https://github.com/iziz/libPhoneNumber-iOS/releases/latestc. The releases path is right and the letters latest are right, but a c is welded onto the end of them, so the URL does not resolve to a releases page. It is a small thing to notice and a small thing to fix, and it is the kind of detail that survives in metadata long after it was introduced, because nothing validates the field except a human following the link. Everything else about the metadata is coherent: the default branch is master, the license is Apache-2.0, the primary language is Objective-C even though the Swift facade layer is the part most apps will touch, and the repository is not archived.

## Release titles carry the upstream metadata version

Three of the listed releases were cut within two weeks, and each title says what changed rather than just repeating the number. 2.1.1 is titled with Google metadata v9.0.40 and is dated 2026-09-25. 2.1.0 is titled Swift 6, visionOS, and metadata v9.0.39, dated 2026-09-17, so one release carried a toolchain change, a new platform and a metadata bump together. 2.0.1 is titled an Xcode 27 metadata bundle fix and is dated 2026-09-12. Putting the metadata version in the title is the useful habit here, because the library's behavior is upstream's data: a patch release that only advances metadata can change parse results for numbers you thought were settled. The documentation says updates are tracked against Google libphonenumber with parity checks and review artifacts, so the tracking is a stated process rather than a promise.

## The deployment floors are set by Xcode 27, not by the library

The requirements table lists iOS 15.0, macCatalyst 15.0, tvOS 15.0, watchOS 9.0, macOS 12.0 and visionOS 1.0, and the sentence under it says these are the lowest deployment targets Xcode 27 accepts. So the numbers describe the toolchain's floor, not a decision about the code. The alternative is stated in the same paragraph: version 1.7.x supports iOS 12, tvOS 12, watchOS 4 and macOS 10.13, but cannot be built with Xcode 27. That is the trade in one sentence. An app that still has to deploy to older systems has a working library line available and no way to build it on a current Xcode, so the choice is between an old toolchain and a raised deployment target.

## Thirteen products, and three different naming conventions

The products table has thirteen rows and every one of them has to be named differently depending on where you are. Under Swift Package Manager the Swift facades are libPhoneNumberSwiftCore, libPhoneNumberSwiftGeocoding, libPhoneNumberSwiftShortNumber, libPhoneNumberSwiftCarrier, libPhoneNumberSwiftTimeZones, libPhoneNumberSwiftUI and libPhoneNumberSwiftUIEnrichment, with the package itself called libPhoneNumber even though the repository is libPhoneNumber-iOS. Under CocoaPods the same modules are libPhoneNumber-iOS-SwiftCore and the rest of the -Swift family, plus an umbrella pod named libPhoneNumber-iOS-Swift, while the Objective-C pods drop the iOS segment entirely and are named libPhoneNumberGeocoding, libPhoneNumberShortNumber, libPhoneNumberCarrier and libPhoneNumberTimeZones. The tree carries thirteen podspec files, one per product.

## The SwiftUI module is kept out of the umbrella on purpose

Most products are additions. One is a deliberate exclusion. The umbrella module, libPhoneNumberIOSSwift under Swift Package Manager and libPhoneNumber-iOS-Swift under CocoaPods, exists to give one non UI import covering core, geocoding and short numbers. The SwiftUI input is deliberately outside it, because it is UI specific and requires SwiftUI runtime availability, and the same reasoning appears higher up as an opt in module rather than something bundled into the core parser. Two umbrella entry points are documented for completeness: the umbrella product for Swift Package Manager, and the import line for CocoaPods, which is libPhoneNumberIOSSwift with the IOS spelled in capitals even though the pod is hyphenated and lower case. The optional enrichment module then attaches carrier and timezone metadata to SwiftUI field state.

## Carrier names are assignment hints and timezones are possibilities

Two caveats appear in the products section and both are about user facing text. Carrier names are original assignment hints and may be misleading in mobile number portable regions, which is why a safe display API exists for labels you put in front of a user. Timezone lookup returns possible CLDR timezone IDs from prefix metadata, not the user's current location, so a timezone from this library is a candidate rather than an answer. A third point explains the module split: geocoding, carrier and timezone modules are opt in because they ship metadata bundles, which is the cost the smallest product avoids. The core facade is what you get for parsing, formatting, validation and as you type formatting, and offline geocoding sits on top of it rather than inside it.

## Carthage and manual setup reach the Objective-C core only

Four installation routes are given and they do not cover the same ground. Swift Package Manager takes the repository URL:

```text
https://github.com/iziz/libPhoneNumber-iOS
```

and then a chosen list of products. CocoaPods takes the matching pod names. Carthage takes one line in a Cartfile:

```ogdl
github "iziz/libPhoneNumber-iOS"
```

with no product selection, since the products table marks only the Objective-C core as available through Carthage and manual integration. Manual integration means adding the source files from the modules you need and linking Contacts.framework for the core library, which is the one system framework the core requires. The core product row is the only one that lists Carthage and manual as options; every Swift facade and every optional module is Swift Package Manager and CocoaPods only. An app that has to stay on Carthage therefore stays on the Objective-C API.

## Swift 6 for the package, Swift 5.9 or 6.0 for the pods

The toolchain requirement differs by route. The Swift package requires Swift 6 tools and builds in the Swift 6 language mode, which is a hard floor for anyone on an older Xcode. The CocoaPods specs are more forgiving and accept Swift 5.9 or 6.0. So the same source can be consumed under two different language mode rules depending on whether the dependency arrives through the package manager or the podspec. The rest of the repository follows the same modular shape as the products: one directory per module, a parallel test directory for most of them, separate metadata directories for carrier, geocoding and timezone data written as libPhoneNumberCarrierMetaData and its two siblings, a generatedJSON directory, a libPhoneNumber-Demo application, an Xcode project, and the usual CHANGELOG, CONTRIBUTING, SECURITY and AUTHORS files.

## Conclusion

Use libPhoneNumber-iOS when you are on Apple platforms and need parsing, formatting and validation against current metadata, and you are writing Swift rather than maintaining an Objective-C integration. Check four things first. The minimum deployment targets are set by the toolchain rather than by the library, so iOS 15 and macOS 12 are floors unless you stay on the 1.7.x line, which Xcode 27 cannot build. The three names for the same module differ across package manager, product and pod, so pin the one you actually mean. The optional modules carry caveats that matter for user facing text: carrier names are original assignment hints, and timezone lookup returns possible IDs rather than a location. And Carthage and manual integration reach only the Objective-C core.

## FAQ

### What are the minimum deployment targets for libPhoneNumber-iOS?

iOS 15.0, macCatalyst 15.0, tvOS 15.0, watchOS 9.0, macOS 12.0 and visionOS 1.0, which are the lowest targets Xcode 27 accepts. Version 1.7.x goes lower, to iOS 12 and macOS 10.13, but cannot be built with Xcode 27.

### Which package managers does libPhoneNumber-iOS support?

Swift Package Manager and CocoaPods for every module, plus Carthage and manual integration for the Objective-C core. Manual integration means adding the source files from the modules you need and linking Contacts.framework.

### What Swift version does libPhoneNumber-iOS need?

The Swift package requires Swift 6 tools and builds in the Swift 6 language mode. The CocoaPods specs are more permissive and accept Swift 5.9 or 6.0.

### Why is the SwiftUI module not part of the libPhoneNumber-iOS umbrella?

It is UI specific and requires SwiftUI runtime availability, so it ships as an opt in module instead of being bundled into the core parser or the umbrella facade.

### What does the carrier module in libPhoneNumber-iOS return?

Carrier names are original assignment hints and may be misleading in mobile number portable regions, so a safe display API is provided for user facing labels. Timezone lookup returns possible CLDR timezone IDs from prefix metadata rather than the user's location.

### How does libPhoneNumber-iOS track upstream metadata?

Updates are tracked against Google libphonenumber with parity checks and review artifacts. The release titles carry the metadata version, for example 2.1.1 with Google metadata v9.0.40.

## Sources

- [iziz/libPhoneNumber-iOS on GitHub](https://github.com/iziz/libPhoneNumber-iOS)
- [License: Apache-2.0](https://github.com/iziz/libPhoneNumber-iOS/blob/master/LICENSE)
- [Project website](https://github.com/iziz/libPhoneNumber-iOS/releases/latestc)
- [README](https://github.com/iziz/libPhoneNumber-iOS/blob/master/README.md)
- [Releases](https://github.com/iziz/libPhoneNumber-iOS/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/iziz-libphonenumber-ios
