MIT License

项目介绍

marmelroy/PhoneNumberKit 是一个托管在 GitHub 上的开源项目,主要使用 Swift 编写,采用 MIT License 许可证,目前获得 5.4k 个 Star、848 次 Fork。

仓库全名
marmelroy/PhoneNumberKit
开源许可证
MIT License
Star 数
5.4k
Fork 数
848
未关闭 Issue
20

README 摘要

⚠️ PhoneNumberKit has moved — this repository is no longer maintained Active development now lives in the PhoneNumberKit organization: Core (parsing / formatting / validation): PhoneNumberKit/PhoneNumberKit — 5.0.0+ UI (PhoneNumberTextField, country-code picker): PhoneNumberKit/PhoneNumberKitUI — 1.0.0+ This repository is frozen at 4.3.0 and no longer receives metadata updates, so its validation data will drift out…

完整内容见 GitHub 原始 README 或本页 。

常见问题

PhoneNumberKit 用什么语言开发?

主要使用 Swift 编写,采用 MIT License 许可证,目前有 5.4k 个 Star。

PhoneNumberKit 可以免费商用吗?

仓库采用 MIT License 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 PhoneNumberKit 的源码?

可以直接克隆仓库:git clone https://github.com/marmelroy/PhoneNumberKit.git,默认分支为 master;安装与运行步骤见仓库 README。

PhoneNumberKit 最近还在维护吗?

仓库最近一次更新为 5月26日,当前有 20 个未关闭 Issue;Star 数为 5.4k,可作为社区活跃度的参考。

关于

GitHub 原始描述(英文)

A Swift framework for parsing, formatting and validating international phone numbers. Inspired by Google's libphonenumber.

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
7157
价值分
3497
活跃状态
活跃

语言占比

C
Ruby
Shell
Swift

Release

README

⚠️ PhoneNumberKit has moved — this repository is no longer maintained

Active development now lives in the PhoneNumberKit organization:

This repository is frozen at 4.3.0 and no longer receives metadata updates, so its validation data will drift out of date over time. PhoneNumberKit was created and maintained here for years by Roy Marmelstein — thank you. Maintenance has moved to the organization to keep the metadata current and the project sustainable.

Migrating: point your package at https://github.com/PhoneNumberKit/PhoneNumberKit — the module name PhoneNumberKit is unchanged, so core usage needs no source changes. If you use the text field or picker, add the PhoneNumberKitUI package and import PhoneNumberKitUI. Full steps in the migration guide.


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

PhoneNumberKit

Swift 5.3 framework for parsing, formatting and validating international phone numbers. Inspired by Google’s libphonenumber.

Features

Features
:phone: Validate, normalize and extract the elements of any phone number string.
:100: Simple Swift syntax and a lightweight readable codebase.
:checkered_flag: Fast. 1000 parses -> ~0.4 seconds.
:books: Best-in-class metadata from Google’s libPhoneNumber project.
:trophy: Fully tested to match the accuracy of Google’s JavaScript implementation of libPhoneNumber.
:iphone: Built for iOS. Automatically grabs the default region code from the phone.
📝 Editable (!) AsYouType formatter for UITextField.
:us: Convert country codes to country names and vice versa

Usage

Import PhoneNumberKit at the top of the Swift file that will interact with a phone number.

import PhoneNumberKit

All of your interactions with PhoneNumberKit happen through a PhoneNumberUtility object. The first step you should take is to allocate one.

A PhoneNumberUtility instance is relatively expensive to allocate (it parses the metadata and keeps it in memory for the object’s lifecycle), you should try and make sure PhoneNumberUtility is allocated once and deallocated when no longer needed.

let phoneNumberUtility = PhoneNumberUtility()

To parse a string, use the parse function. The region code is automatically computed but can be overridden if needed. PhoneNumberKit automatically does a hard type validation to ensure that the object created is valid, this can be quite costly performance-wise and can be turned off if needed.

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")
}

If you need to parse and validate a large amount of numbers at once, PhoneNumberKit has a special, lightning fast array parsing function. The default region code is automatically computed but can be overridden if needed. Here you can also ignore hard type validation if it is not necessary. Invalid numbers are ignored in the resulting array.

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 objects are immutable Swift structs with the following properties:

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

Formatting a PhoneNumber object into a string is also very easy

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

To use the AsYouTypeFormatter, just replace your UITextField with a PhoneNumberTextField (if you are using Interface Builder make sure the module field is set to PhoneNumberKit).

You can customize your TextField UI in the following ways

  • withFlag will display the country code for the currentRegion. The flagButton is displayed in the leftView of the text field with it’s size set based off your text size.
  • withExamplePlaceholder uses attributedPlaceholder to show an example number for the currentRegion. In addition when withPrefix is set, the country code’s prefix will automatically be inserted and removed when editing changes.

PhoneNumberTextField automatically formats phone numbers and gives the user full editing capabilities. If you want to customize you can use the PartialFormatter directly. The default region code is automatically computed but can be overridden if needed (see the example given below).

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

You can also query countries for a dialing code or the dialing code for a given country

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

Customize Country Picker

You can customize colors and fonts on the Country Picker View Controller by overriding the property “withDefaultPickerUIOptions”

let headerOptions = CountryCodePickerOptions.CountryCodePickerHeaderOptions(
    textLabelColor: .blue,
    textLabelFont: .boldSystemFont(ofSize: 18),
    backgroundColor: nil,
    cellType: .cellNib(headerNib, identifier: CustomHeaderView.reuseIdentifier),
    height: CustomHeaderView.defaultHeight
)

let cellOptions = CountryCodePickerOptions.CountryCodePickerCellOptions(
    textLabelColor: nil,
    textLabelFont: nil,
    detailTextLabelColor: nil,
    detailTextLabelFont: nil,
    backgroundColor: nil,
    backgroundColorSelection: nil,
    cellType: .cellNib(cellNib, identifier: CustomCell.reuseIdentifier),
    height: CustomCell.defaultHeight
)
let options = CountryCodePickerOptions(
    backgroundColor: .systemGroupedBackground,
    separatorColor: .opaqueSeparator,
    tintColor: UIView().tintColor,
    cellOptions: cellOptions,
    headerOptions: headerOptions
)
textField.withDefaultPickerUIOptions = options

Or you can change it directly:

textField.withDefaultPickerUIOptions.backgroundColor = .red

Please refer to CountryCodePickerOptions for more information about usage and how it affects the view.

Need more customization?

You can access the metadata powering PhoneNumberKit yourself, this enables you to program any behaviours as they may be implemented in PhoneNumberKit itself. It does mean you are exposed to the less polished interface of the underlying file format. If you program something you find useful please push it upstream!

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

[Preferred] Setting up with Swift Package Manager

The Swift Package Manager is now the preferred tool for distributing PhoneNumberKit.

From Xcode 11+ :

  1. Select File > Swift Packages > Add Package Dependency. Enter https://github.com/marmelroy/PhoneNumberKit.git in the “Choose Package Repository” dialog.
  2. In the next page, specify the version resolving rule as “Up to Next Major” from “4.0.0”.
  3. After Xcode checked out the source and resolving the version, you can choose the “PhoneNumberKit” library and add it to your app target.

For more info, read Adding Package Dependencies to Your App from Apple.

Alternatively, you can also add PhoneNumberKit to your Package.swift file:

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

Setting up with Carthage

Carthage is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

To integrate PhoneNumberKit into your Xcode project using Carthage, specify it in your Cartfile:

github "marmelroy/PhoneNumberKit"

Setting up with CocoaPods

pod 'PhoneNumberKit', '~> 4.0'

评论

暂无评论