PhoneNumberKit
Swift 5.3 框架,用于解析、格式化和验证国际电话号码。灵感来自 Google 的 libphonenumber。
功能
功能 | |
---|---|
验证、归一化和提取任何电话号码字符串的元素。 | |
简单的 Swift 语法和轻量级的易于阅读的代码库。 | |
快速。1000 次解析 -> 大约 0.4 秒。 | |
来自 Google 的 libPhoneNumber 项目的最佳级元数据。 | |
完全测试以确保与 Google 的 JavaScript 实现 libPhoneNumber 的准确性匹配。 | |
为 iOS 构建。自动从手机获取默认区域代码。 | |
可编辑的 (!) AsYouType 格式化器为 UITextField。 | |
将国家代码转换为国家名称,反之亦然 |
用法
在将交互电话号码的Swift文件顶部导入PhoneNumberKit。
import PhoneNumberKit
您所有与PhoneNumberKit的交互都通过PhoneNumberKit对象完成。您应该采取的第一步是分配一个。
PhoneNumberKit实例的分配相对昂贵(它解析元数据并在对象的生命周期内将其保留在内存中),您应该确保PhoneNumberKit一旦分配就不再需要时进行释放。
let phoneNumberKit = PhoneNumberKit()
要解析字符串,请使用parse函数。区域代码会自动计算,但可以在需要时覆盖。PhoneNumberKit自动执行硬类型验证以确保创建的对象有效,这在性能上可能相当昂贵,如需可关闭此功能。
do {
let phoneNumber = try phoneNumberKit.parse("+33 6 89 017383")
let phoneNumberCustomDefaultRegion = try phoneNumberKit.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 = phoneNumberKit.parse(rawNumberArray)
let phoneNumbersCustomDefaultRegion = phoneNumberKit.parse(rawNumberArray, withRegion: "DE", ignoreType: true)
PhoneNumber对象是不可变的Swift结构体,具有以下属性
phoneNumber.numberString
phoneNumber.countryCode
phoneNumber.nationalNumber
phoneNumber.numberExtension
phoneNumber.type // e.g Mobile or Fixed
将PhoneNumber对象格式化为字符串也非常简单
phoneNumberKit.format(phoneNumber, toType: .e164) // +61236618300
phoneNumberKit.format(phoneNumber, toType: .international) // +61 2 3661 8300
phoneNumberKit.format(phoneNumber, toType: .national) // (02) 3661 8300
PhoneNumberTextField
要使用AsYouTypeFormatter,只需将您的UITextField替换为PhoneNumberTextField(如果您正在使用Interface Builder,请确保模块字段已设置为PhoneNumberKit)。
您可以通过以下方式自定义TextField UI
withFlag
会显示当前区域的国家代码。flagButton
将显示在文本框的leftView
中,其大小根据您的文本大小设置。withExamplePlaceholder
使用attributedPlaceholder
来显示当前区域的示例号码。此外,当withPrefix
设置时,国家代码的前缀将自动插入和删除。
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
您还可以查询国家的区号或将给定国家的区号查询出来
phoneNumberKit.countries(withCode: 33)
phoneNumberKit.countryCode(for: "FR")
需要更多自定义?
您可以访问驱动PhoneNumberKit的元数据,这使得您能够编程实现 PhoneNumberKit 自身可能实现的行为。但这意味着您将暴露于底层文件格式不太完善的接口。如果您编程了有用的内容,请将其推向上游!
phoneNumberKit.metadata(for: "AU")?.mobile?.exampleNumber // 412345678
[推荐] 使用 Swift Package Manager 配置
Swift Package Manager 现在是 PhoneNumberKit 的首选分发工具。
从 Xcode 11+ 开始
- 选择文件 > Swift 包 > 添加包依赖。在“选择包仓库”对话框中输入
https://github.com/marmelroy/PhoneNumberKit.git
。 - 在下一页,将版本解析规则指定为“到下一个主要版本”从“3.6.0”。
- 在 Xcode 检出源并解析版本后,您可以选择“PhoneNumberKit”库并将其添加到您的应用程序目标中。
有关更多信息,请阅读 Apple 的将包依赖项添加到您的应用程序。
或者,您也可以将 PhoneNumberKit 添加到您的 Package.swift
文件中
dependencies: [
.package(url: "https://github.com/marmelroy/PhoneNumberKit", from: "3.6.0")
]
使用 Carthage 配置
Carthage 是一个去中心化的依赖管理器,它可以自动化将框架添加到您的 Cocoa 应用程序的过程。
您可以使用以下命令通过 Homebrew 安装 Carthage:
$ brew update
$ brew install carthage
要使用 Carthage 将 PhoneNumberKit 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "marmelroy/PhoneNumberKit"
CocoaPods 配置
使用pod 'PhoneNumberKit', '~> 3.6'