13

我正在尝试使用 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>!$_。但我需要像HomeMobile这样的纯文本。有什么方法可以使用 Contact 框架获得本地化的值。我不想使用地址簿,因为它在 iOS 9 中已被弃用。

4

3 回答 3

20

使用CNLabeledValues 类方法 + localizedStringForLabel:并传递标签

例子:

   CNLabeledValue *phoneNumberValue = contact.phoneNumbers.firstObject;
   NSString *label = phoneNumberValue.label;
   label = [CNLabeledValue localizedStringForLabel:label];
   NSLog(@"Phone Label: %@",label); //Logs value like home
于 2016-02-19T09:37:32.190 回答
13

它在 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 语言上的数字不会颠倒。

于 2017-02-15T19:37:09.103 回答
2

添加此行联系人访问

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


                }
于 2017-02-17T07:28:56.673 回答