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
要使用 AsYouTypeFormatter,只需将 UITextField 替换为 PhoneNumberTextField(如果您使用 Interface Builder,请确保模块字段设置为 PhoneNumberKit)。
您可以通过以下方式自定义您的 TextField UI
withFlag
将显示 currentRegion
的国家代码。flagButton
显示在文本字段的 leftView
中,其大小根据您的文本大小设置。withExamplePlaceholder
使用 attributedPlaceholder
为 currentRegion
显示一个示例号码。 此外,当设置 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
您还可以查询国家/地区的拨号代码或给定国家/地区的拨号代码
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 现在是分发 PhoneNumberKit 的首选工具。
来自 Xcode 11+
https://github.com/marmelroy/PhoneNumberKit.git
。有关更多信息,请阅读 Apple 的 Adding Package Dependencies to Your App。
或者,您也可以将 PhoneNumberKit 添加到您的 Package.swift
文件
dependencies: [
.package(url: "https://github.com/marmelroy/PhoneNumberKit", from: "3.7.0")
]
Carthage 是一个去中心化的依赖管理器,可自动执行将框架添加到 Cocoa 应用程序的过程。
您可以使用 Homebrew 使用以下命令安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 PhoneNumberKit 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "marmelroy/PhoneNumberKit"
pod 'PhoneNumberKit', '~> 3.7'