Получить локализованную метку телефона, используя рамки контактов
Я пытаюсь получить значение локализованной метки телефона с помощью CNContact.
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);
}];
Проблема в том, что метка телефона возвращает необработанное значение, например _$!<Home>!$_
, _$!<Mobile>!$_
, Но мне нужен простой текст, как Home, Mobile. Есть ли способ, которым я могу получить локализованное значение с помощью фреймворков Contact. Я не хочу использовать адресную книгу, поскольку она устарела в iOS 9.
3 ответа
Решение
Использование CNLabeledValue
метод класса s + localizedStringForLabel:
и передать ярлык
пример:
CNLabeledValue *phoneNumberValue = contact.phoneNumbers.firstObject;
NSString *label = phoneNumberValue.label;
label = [CNLabeledValue localizedStringForLabel:label];
NSLog(@"Phone Label: %@",label); //Logs value like _$!<Home>!$_
И вот это в Swift 3:
let displayNumbers = contact.phoneNumbers.map() {
let label = CNLabeledValue<NSString>.localizedString(forLabel: $0.label ?? "")
return label + ": \u{200E}" + $0.value.stringValue
}
Добавлена переопределение unicode LeftToRight, чтобы гарантировать, что число не будет перевернуто на языках RTL.
Добавить эту строку Контакт Доступ
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)")
}
}