Fetch localized phone label using Contacts frameworks
Asked Answered
P

3

16

I'm trying to fetch localized phone label value using CNContact.My attampt so far:

    NSError *error = nil;

    CNContactFetchRequest *fetchRequest =[[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];

    [addressBook enumerateContactsWithFetchRequest:fetchRequest error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

       CNLabeledValue *phoneNumberValue = contact.phoneNumbers.firstObject;

       NSString *label = phoneNumberValue.label;
       NSLog(@"Phone Label: %@",label); //Logs value like _$!<Home>!$_

       CNPhoneNumber *phoneNumber = phoneNumberValue.value;
       NSString *phoneNumberString = phoneNumber.stringValue;

       NSLog(@"Phone No: %@",phoneNumberString);
    }];

The problem is the phone label returns raw value like _$!<Home>!$_, _$!<Mobile>!$_. But I need Plain text like Home, Mobile. Is there any way I can get the localized value using Contact frameworks. I don't want to use Addressbook as it is deprecated in iOS 9.

Presidentship answered 19/2, 2016 at 9:23 Comment(0)
S
22

use CNLabeledValues class method + localizedStringForLabel: and pass the label

example:

   CNLabeledValue *phoneNumberValue = contact.phoneNumbers.firstObject;
   NSString *label = phoneNumberValue.label;
   label = [CNLabeledValue localizedStringForLabel:label];
   NSLog(@"Phone Label: %@",label); //Logs value like home
Spoor answered 19/2, 2016 at 9:37 Comment(6)
Still getting _$!<Home>!$_Presidentship
are the contacts from an exchange server by chance?Spoor
cause exchange doesn't really support custom labels... MIGHT be the issue thenSpoor
Sorry, It was my mistake. this code works correctly.Presidentship
Here's the updated Swift 3 localized string without $!<...>!$: phone number: CNLabeledValue<CNPhoneNumber>.localizedString(forLabel: label) email: CNLabeledValue<NSString>.localizedString(forLabel: label)Lecompte
@Spoor My email labels are also formatted with this prefix/suffix. Perhaps they are added by syncing macOS and/or iOS Contacts with Google Contacts. The only exception is that email addresses labeled “Email” are NOT formatted with this prefix/suffix.Embodiment
V
14

And here it is in Swift 3:

let displayNumbers = contact.phoneNumbers.map() {
    let label = CNLabeledValue<NSString>.localizedString(forLabel: $0.label ?? "")
    return label + ": \u{200E}" + $0.value.stringValue
}

Added unicode LeftToRight override, to ensure the number is not reversed on RTL languages.

Verboten answered 15/2, 2017 at 19:37 Comment(0)
B
2

add this line Contact Access

 if contact.isKeyAvailable(CNContactPhoneNumbersKey){

         for phoneNumber:CNLabeledValue in contact.phoneNumbers {
                        let number  = phoneNumber.value

                        let number2 = number.stringValue

                        let lable :String  =  CNLabeledValue<NSString>.localizedString(forLabel: phoneNumber.label! )

                        print("\(lable)  \(number.stringValue)")
                    }


                }
Blanketing answered 17/2, 2017 at 7:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.