PhoneNumberKit Platform GitHub Workflow Status (with branch) Version Carthage compatible

PhoneNumberKit

Swift 5.3 框架,用于解析、格式化和验证国际电话号码。灵感来源于 Google 的 libphonenumber。

特性

特性
☎️ 验证、规范化并提取任何电话号码字符串的元素。
💯 简单的 Swift 语法和轻量级的可读代码库。
🏁 速度快。1000 次解析 -> ~0.4 秒。
📚 来自 Google libPhoneNumber 项目的最佳元数据。
🏆 经过全面测试,与 Google JavaScript 实现的 libPhoneNumber 的准确性相匹配。
📱 专为 iOS 构建。自动从手机获取默认地区代码。
📝 适用于 UITextField 的可编辑 (!) AsYouType 格式化器。
🇺🇸 转换国家代码为国家名称,反之亦然。

用法

在与电话号码交互的 Swift 文件顶部导入 PhoneNumberKit。

import PhoneNumberKit

您与 PhoneNumberKit 的所有交互都通过 PhoneNumberUtility 对象进行。您应该采取的第一步是分配一个对象。

分配 PhoneNumberUtility 实例的成本相对较高(它会解析元数据并将其保存在内存中以供对象生命周期使用),您应该尽量确保 PhoneNumberUtility 只分配一次,并在不再需要时释放。

let phoneNumberUtility = PhoneNumberUtility()

要解析字符串,请使用 parse 函数。 区域代码会自动计算,但可以根据需要覆盖。 PhoneNumberKit 自动执行硬类型验证,以确保创建的对象有效,这在性能方面可能会非常昂贵,并且可以根据需要关闭。

do {
    let phoneNumber = try phoneNumberUtility.parse("+33 6 89 017383")
    let phoneNumberCustomDefaultRegion = try phoneNumberUtility.parse("+44 20 7031 3000", withRegion: "GB", ignoreType: true)
}
catch {
    print("Generic parser error")
}

如果您需要一次解析和验证大量号码,PhoneNumberKit 有一个特殊的,闪电般快速的数组解析函数。 默认区域代码会自动计算,但可以根据需要覆盖。 在这里,如果不需要,您也可以忽略硬类型验证。 无效号码将在结果数组中被忽略。

let rawNumberArray = ["0291 12345678", "+49 291 12345678", "04134 1234", "09123 12345"]
let phoneNumbers = phoneNumberUtility.parse(rawNumberArray)
let phoneNumbersCustomDefaultRegion = phoneNumberUtility.parse(rawNumberArray, withRegion: "DE",  ignoreType: true)

PhoneNumber 对象是不可变的 Swift 结构体,具有以下属性

phoneNumber.numberString
phoneNumber.countryCode
phoneNumber.nationalNumber
phoneNumber.numberExtension
phoneNumber.type // e.g Mobile or Fixed

将 PhoneNumber 对象格式化为字符串也非常容易

phoneNumberUtility.format(phoneNumber, toType: .e164) // +61236618300
phoneNumberUtility.format(phoneNumber, toType: .international) // +61 2 3661 8300
phoneNumberUtility.format(phoneNumber, toType: .national) // (02) 3661 8300

PhoneNumberTextField

AsYouTypeFormatter

要使用 AsYouTypeFormatter,只需将 UITextField 替换为 PhoneNumberTextField(如果您使用 Interface Builder,请确保模块字段设置为 PhoneNumberKit)。

您可以通过以下方式自定义您的 TextField UI

PhoneNumberTextField 自动格式化电话号码并为用户提供完整的编辑功能。 如果您想自定义,您可以直接使用 PartialFormatter。 默认区域代码会自动计算,但可以根据需要覆盖(请参阅下面给出的示例)。

class MyGBTextField: PhoneNumberTextField {
    override var defaultRegion: String {
        get {
            return "GB"
        }
        set {} // exists for backward compatibility
    }
}
let textField = PhoneNumberTextField()

PartialFormatter().formatPartial("+336895555") // +33 6 89 55 55

您还可以查询国家/地区的拨号代码或给定国家/地区的拨号代码

phoneNumberUtility.countries(withCode: 33)
phoneNumberUtility.countryCode(for: "FR")

自定义国家/地区选择器

您可以通过覆盖属性 "withDefaultPickerUIOptions" 来自定义国家/地区选择器视图控制器上的颜色和字体

let options = CountryCodePickerOptions(
    backgroundColor: UIColor.systemGroupedBackground
    separatorColor: UIColor.opaqueSeparator
    textLabelColor: UIColor.label
    textLabelFont: .preferredFont(forTextStyle: .callout)
    detailTextLabelColor: UIColor.secondaryLabel
    detailTextLabelFont: .preferredFont(forTextStyle: .body)
    tintColor: UIView().tintColor
    cellBackgroundColor: UIColor.secondarySystemGroupedBackground
    cellBackgroundColorSelection: UIColor.tertiarySystemGroupedBackground
)
textField.withDefaultPickerUIOptions = options

或者您可以直接更改它

textField.withDefaultPickerUIOptions.backgroundColor = .red

请参阅 CountryCodePickerOptions,了解有关用法以及它如何影响视图的更多信息。

需要更多自定义?

您可以自己访问为 PhoneNumberKit 提供支持的元数据,这使您可以编程 PhoneNumberKit 本身可能实现的任何行为。 这确实意味着您将暴露于底层文件格式的不太完善的界面。 如果您编程了一些有用的东西,请将其推送到上游!

phoneNumberUtility.metadata(for: "AU")?.mobile?.exampleNumber // 412345678

[首选] 使用 Swift Package Manager 进行设置

Swift Package Manager 现在是分发 PhoneNumberKit 的首选工具。

来自 Xcode 11+

  1. 选择 File > Swift Packages > Add Package Dependency。 在“选择 Package Repository”对话框中输入 https://github.com/marmelroy/PhoneNumberKit.git
  2. 在下一页中,将版本解析规则指定为“Up to Next Major”,从“3.7.0”开始。
  3. 在 Xcode 签出源代码并解析版本后,您可以选择“PhoneNumberKit”库并将其添加到您的应用目标。

有关更多信息,请阅读 Apple 的 Adding Package Dependencies to Your App

或者,您也可以将 PhoneNumberKit 添加到您的 Package.swift 文件

dependencies: [
    .package(url: "https://github.com/marmelroy/PhoneNumberKit", from: "3.7.0")
]

使用 Carthage 设置

Carthage 是一个去中心化的依赖管理器,可自动执行将框架添加到 Cocoa 应用程序的过程。

您可以使用 Homebrew 使用以下命令安装 Carthage

$ brew update
$ brew install carthage

要使用 Carthage 将 PhoneNumberKit 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它

github "marmelroy/PhoneNumberKit"

使用 CocoaPods 设置

pod 'PhoneNumberKit', '~> 3.7'