Convert Figma logo to code with AI

iziz logolibPhoneNumber-iOS

iOS port from libphonenumber (Google's phone number handling library)

2,355
463
2,355
116

Top Related Projects

Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.

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

Generate Java types from JSON or JSON Schema and annotate those types for data-binding with Jackson, Gson, etc

PHP version of Google's phone number handling library

Quick Overview

libPhoneNumber-iOS is a port of Google's libphonenumber library for iOS. It provides functionality for parsing, formatting, and validating international phone numbers. This library is essential for developers working with phone numbers in iOS applications, offering a robust solution for handling various phone number formats across different countries.

Pros

  • Comprehensive phone number handling for multiple countries
  • Regular updates to keep pace with changing phone number formats
  • Well-documented and easy to integrate into iOS projects
  • Supports both Objective-C and Swift

Cons

  • Large library size may increase app bundle size
  • Occasional discrepancies with the original Google libphonenumber library
  • May require frequent updates to stay current with phone number changes
  • Performance can be slower for bulk operations

Code Examples

  1. Parsing a phone number:
let phoneUtil = NBPhoneNumberUtil()
do {
    let phoneNumber = try phoneUtil.parse("+1 650 253 0000", defaultRegion: "US")
    print(phoneNumber)
} catch {
    print("Error parsing number: \(error)")
}
  1. Formatting a phone number:
let phoneUtil = NBPhoneNumberUtil()
do {
    let phoneNumber = try phoneUtil.parse("+1 650 253 0000", defaultRegion: "US")
    let formattedNumber = try phoneUtil.format(phoneNumber, numberFormat: .INTERNATIONAL)
    print(formattedNumber) // Output: +1 650-253-0000
} catch {
    print("Error formatting number: \(error)")
}
  1. Validating a phone number:
let phoneUtil = NBPhoneNumberUtil()
do {
    let phoneNumber = try phoneUtil.parse("+1 650 253 0000", defaultRegion: "US")
    let isValid = phoneUtil.isValidNumber(phoneNumber)
    print("Is valid: \(isValid)") // Output: Is valid: true
} catch {
    print("Error validating number: \(error)")
}

Getting Started

  1. Add the library to your project using CocoaPods:
pod 'libPhoneNumber-iOS', '~> 0.9'
  1. Import the library in your Swift file:
import libPhoneNumber
  1. Create an instance of NBPhoneNumberUtil and start using the library:
let phoneUtil = NBPhoneNumberUtil()
// Use phoneUtil to parse, format, or validate phone numbers

Competitor Comparisons

Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.

Pros of libphonenumber

  • More comprehensive and widely used, with support for multiple programming languages
  • Regularly updated with the latest phone number formats and metadata
  • Extensive documentation and community support

Cons of libphonenumber

  • Larger library size, which may impact app size and performance
  • More complex setup and integration process for iOS projects
  • Requires additional steps to use in Swift projects

Code Comparison

libPhoneNumber-iOS:

let phoneUtil = NBPhoneNumberUtil()
let phoneNumber = try phoneUtil.parse("+1 650 253 0000", defaultRegion: "US")
let isValid = phoneUtil.isValidNumber(phoneNumber)

libphonenumber:

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
PhoneNumber phoneNumber = phoneUtil.parse("+1 650 253 0000", "US");
boolean isValid = phoneUtil.isValidNumber(phoneNumber);

Key Differences

  • libPhoneNumber-iOS is specifically designed for iOS development, while libphonenumber is a more general-purpose library
  • libPhoneNumber-iOS offers a more native Swift/Objective-C experience
  • libphonenumber provides broader language support and more frequent updates

Recommendation

Choose libPhoneNumber-iOS for iOS-specific projects that prioritize ease of integration and a native feel. Opt for libphonenumber if you need cross-platform support or require the most up-to-date phone number data and formats.

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

Pros of PhoneNumberKit

  • Written in Swift, providing better integration with modern iOS projects
  • Lightweight and has fewer dependencies
  • Offers a more Swifty API with better use of optionals and error handling

Cons of PhoneNumberKit

  • May have less comprehensive coverage of edge cases compared to libPhoneNumber-iOS
  • Potentially slower parsing performance for large datasets
  • Less frequent updates and maintenance

Code Comparison

libPhoneNumber-iOS:

NBPhoneNumberUtil *phoneUtil = [[NBPhoneNumberUtil alloc] init];
NSError *anError = nil;
NBPhoneNumber *myNumber = [phoneUtil parse:@"6012345678" 
                             defaultRegion:@"MY" error:&anError];

PhoneNumberKit:

let phoneNumberKit = PhoneNumberKit()
do {
    let phoneNumber = try phoneNumberKit.parse("6012345678", withRegion: "MY")
} catch {
    print("Parsing error: \(error)")
}

Both libraries provide similar functionality for parsing phone numbers, but PhoneNumberKit offers a more Swift-friendly syntax with better error handling through the use of do-try-catch blocks. libPhoneNumber-iOS, being Objective-C based, uses the traditional NSError pattern for error handling.

Generate Java types from JSON or JSON Schema and annotate those types for data-binding with Jackson, Gson, etc

Pros of jsonschema2pojo

  • Generates Java POJOs from JSON Schema, making it easier to work with JSON data in Java applications
  • Supports customization of generated code through annotations and configuration options
  • Can be integrated into build processes (Maven, Gradle) for automated code generation

Cons of jsonschema2pojo

  • Limited to Java language, while libPhoneNumber-iOS is specifically for iOS development
  • Requires additional setup and configuration compared to the more focused functionality of libPhoneNumber-iOS
  • May generate unnecessary code for simple JSON structures, potentially increasing project complexity

Code Comparison

jsonschema2pojo:

@JsonProperty("phoneNumber")
private String phoneNumber;

public String getPhoneNumber() {
    return phoneNumber;
}

libPhoneNumber-iOS:

let phoneUtil = NBPhoneNumberUtil()
let phoneNumber = try phoneUtil.parse("+1 650 253 0000", defaultRegion: "US")
let formattedNumber = try phoneUtil.format(phoneNumber, numberFormat: .NATIONAL)

While jsonschema2pojo generates Java classes for working with JSON data, libPhoneNumber-iOS provides specific functionality for parsing and formatting phone numbers in iOS applications. The code examples demonstrate the different focus areas of these libraries, with jsonschema2pojo handling JSON property mapping and libPhoneNumber-iOS dealing with phone number operations.

PHP version of Google's phone number handling library

Pros of libphonenumber-for-php

  • Written in PHP, making it easier to integrate with PHP-based projects
  • More actively maintained with frequent updates and contributions
  • Larger community support and more comprehensive documentation

Cons of libphonenumber-for-php

  • Not optimized for mobile platforms, potentially less efficient for iOS applications
  • Requires PHP runtime, which may not be ideal for iOS development environments
  • May have a larger footprint compared to native iOS libraries

Code Comparison

libphonenumber-for-php:

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse("+1 202-456-1414", "US");
$isValid = $phoneUtil->isValidNumber($phoneNumber);

libPhoneNumber-iOS:

let phoneUtil = NBPhoneNumberUtil()
let phoneNumber = try phoneUtil.parse("+1 202-456-1414", defaultRegion: "US")
let isValid = phoneUtil.isValidNumber(phoneNumber)

Both libraries offer similar functionality for parsing and validating phone numbers. The main difference lies in the language and ecosystem they're designed for. libphonenumber-for-php is better suited for PHP-based web applications, while libPhoneNumber-iOS is tailored for iOS app development. The choice between them depends on the specific project requirements and development environment.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

CocoaPods CocoaPods Travis Coveralls Carthage compatible

libPhoneNumber for iOS

  • NBPhoneNumberUtil
  • NBAsYouTypeFormatter

ARC only

Update Log

https://github.com/iziz/libPhoneNumber-iOS/wiki/Update-Log

Issue

You can check phone number validation using below link. https://rawgit.com/googlei18n/libphonenumber/master/javascript/i18n/phonenumbers/demo-compiled.html

Please report, if the above results are different from this iOS library. Otherwise, please create issue to following link below to request additional telephone numbers formatting rule. https://github.com/google/libphonenumber/issues

Metadata in this library was generated from that. so, you should change it first. :)

Install

Using CocoaPods

source 'https://github.com/CocoaPods/Specs.git'
pod 'libPhoneNumber-iOS', '~> 0.8'
Installing libPhoneNumber Geocoding Features
pod 'libPhoneNumberGeocoding', :git => 'https://github.com/CocoaPods/Specs.git'

Using 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 libPhoneNumber into your Xcode project using Carthage, specify it in your Cartfile:

github "iziz/libPhoneNumber-iOS"

And set the Embedded Content Contains Swift to "Yes" in your build settings.

Setting up manually

Add source files to your projects from libPhoneNumber - Add "Contacts.framework"

See sample test code from

[libPhoneNumber-iOS/libPhoneNumberTests/ ... Test.m] (https://github.com/iziz/libPhoneNumber-iOS/tree/master/libPhoneNumberTests)

Usage - NBPhoneNumberUtil

 NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance];
 NSError *anError = nil;
 NBPhoneNumber *myNumber = [phoneUtil parse:@"6766077303"
                              defaultRegion:@"AT" error:&anError];
 if (anError == nil) {
     NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber] ? @"YES":@"NO");

     // E164          : +436766077303
     NSLog(@"E164          : %@", [phoneUtil format:myNumber
                                       numberFormat:NBEPhoneNumberFormatE164
                                              error:&anError]);
     // INTERNATIONAL : +43 676 6077303
     NSLog(@"INTERNATIONAL : %@", [phoneUtil format:myNumber
                                       numberFormat:NBEPhoneNumberFormatINTERNATIONAL
                                              error:&anError]);
     // NATIONAL      : 0676 6077303
     NSLog(@"NATIONAL      : %@", [phoneUtil format:myNumber
                                       numberFormat:NBEPhoneNumberFormatNATIONAL
                                              error:&anError]);
     // RFC3966       : tel:+43-676-6077303
     NSLog(@"RFC3966       : %@", [phoneUtil format:myNumber
                                       numberFormat:NBEPhoneNumberFormatRFC3966
                                              error:&anError]);
 } else {
     NSLog(@"Error : %@", [anError localizedDescription]);
 }

 NSLog (@"extractCountryCode [%@]", [phoneUtil extractCountryCode:@"823213123123" nationalNumber:nil]);

 NSString *nationalNumber = nil;
 NSNumber *countryCode = [phoneUtil extractCountryCode:@"823213123123" nationalNumber:&nationalNumber];

 NSLog (@"extractCountryCode [%@] [%@]", countryCode, nationalNumber);
Output
2014-07-06 12:39:37.240 libPhoneNumberTest[1581:60b] isValidPhoneNumber ? [YES]
2014-07-06 12:39:37.242 libPhoneNumberTest[1581:60b] E164          : +436766077303
2014-07-06 12:39:37.243 libPhoneNumberTest[1581:60b] INTERNATIONAL : +43 676 6077303
2014-07-06 12:39:37.243 libPhoneNumberTest[1581:60b] NATIONAL      : 0676 6077303
2014-07-06 12:39:37.244 libPhoneNumberTest[1581:60b] RFC3966       : tel:+43-676-6077303
2014-07-06 12:39:37.244 libPhoneNumberTest[1581:60b] extractCountryCode [82]
2014-07-06 12:39:37.245 libPhoneNumberTest[1581:60b] extractCountryCode [82] [3213123123]

with Swift

Case (1) with Framework
import libPhoneNumberiOS
Case (2) with Bridging-Header
// Manually added
#import "NBPhoneNumberUtil.h"
#import "NBPhoneNumber.h"

// CocoaPods (check your library path)
#import "libPhoneNumber_iOS/NBPhoneNumberUtil.h"
#import "libPhoneNumber_iOS/NBPhoneNumber.h"

// add more if you want...
Case (3) with CocoaPods

import libPhoneNumber_iOS

- in swift class file
2.x
override func viewDidLoad() {
    super.viewDidLoad()

    guard let phoneUtil = NBPhoneNumberUtil.sharedInstance() else {
        return
    }

    do {
        let phoneNumber: NBPhoneNumber = try phoneUtil.parse("01065431234", defaultRegion: "KR")
        let formattedString: String = try phoneUtil.format(phoneNumber, numberFormat: .E164)

        NSLog("[%@]", formattedString)
    }
    catch let error as NSError {
        print(error.localizedDescription)
    }
}

Usage - NBAsYouTypeFormatter

 NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"];
    NSLog(@"%@", [f inputDigit:@"6"]); // "6"
    NSLog(@"%@", [f inputDigit:@"5"]); // "65"
    NSLog(@"%@", [f inputDigit:@"0"]); // "650"
    NSLog(@"%@", [f inputDigit:@"2"]); // "650 2"
    NSLog(@"%@", [f inputDigit:@"5"]); // "650 25"
    NSLog(@"%@", [f inputDigit:@"3"]); // "650 253"

    // Note this is how a US local number (without area code) should be formatted.
    NSLog(@"%@", [f inputDigit:@"2"]); // "650 2532"
    NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 22"
    NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 222"
    NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 2222"
    // Can remove last digit
    NSLog(@"%@", [f removeLastDigit]); // "650 253 222"

    NSLog(@"%@", [f inputString:@"16502532222"]); // 1 650 253 2222

libPhoneNumberGeocoding

For more information on libPhoneNumberGeocoding and its usage, please visit libPhoneNumberGeocoding for more information.

libPhoneNumberShortNumber

For more information on libPhoneNumberShortNumber and its usage, please visit libPhoneNumberShortNumber for more information.

Visit libphonenumber for more information or mail (zen.isis@gmail.com)