我的问题涉及围绕iPhone上联系人列表的人员条目中的某些默认电话号码标签的标记。
我为一个人创建了一个iPhone联系人列表通讯录条目,“John Smith”,其中包含以下电话号码:
请注意,前五个标签是“联系人”应用程序提供的默认标签,最后一个标签“megaphone”是自定义标签。
我编写了以下方法来检索和显示地址簿中每个人的标签和电话号码:
-(void)displayPhoneNumbersForAddressBook {
ABAddressBookRef book = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(book);
ABRecordRef record = CFArrayGetValueAtIndex(people, 0);
ABMultiValueRef multi = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSLog(@"---------" );
NSLog(@"displayPhoneNumbersForAddressBook" );
CFStringRef label, phone;
for (CFIndex i = 0; i < ABMultiValueGetCount(multi); ++i) {
label = ABMultiValueCopyLabelAtIndex(multi, i);
phone = ABMultiValueCopyValueAtIndex(multi, i);
NSLog(@"label: \"%@\" number: \"%@\"", (NSString*)label, (NSString*)phone);
CFRelease(label);
CFRelease(phone);
}
NSLog(@"---------" );
CFRelease(multi);
CFRelease(people);
CFRelease(book);
}
以下是我输入的地址簿条目的输出:
2010-03-08 13:24:28.789 test2m[2479:207] ---------
2010-03-08 13:24:28.789 test2m[2479:207] displayPhoneNumbersForAddressBook
2010-03-08 13:24:28.790 test2m[2479:207] label: "_$!<Mobile>!$_" number: "(604) 123-4567"
2010-03-08 13:24:28.790 test2m[2479:207] label: "iPhone" number: "(778) 123-4567"
2010-03-08 13:24:28.791 test2m[2479:207] label: "_$!<Home>!$_" number: "(604) 789-4561"
2010-03-08 13:24:28.791 test2m[2479:207] label: "_$!<Work>!$_" number: "(604) 456-7891"
2010-03-08 13:24:28.792 test2m[2479:207] label: "_$!<Main>!$_" number: "(604) 789-1234"
2010-03-08 13:24:28.792 test2m[2479:207] label: "megaphone" number: "(234) 567-8990"
2010-03-08 13:24:28.793 test2m[2479:207] ---------
什么是标记字符
_$!< and >!$_
除了iPhone之外,最常用的是?
的默认标签您能指出我在“iPhone OS地址簿编程指南”中的哪些位置我可以找到这些信息吗?
感谢您的帮助。
答案 0 :(得分:7)
我遇到了同样的问题。这是我到目前为止的想法。
您看到的标记向系统显示这是默认标签而不是自定义标签。如果您运行此代码:
NSLog(kABOtherLabel);
你会得到这个结果:
_$!<Other>!$_
这是存储在kABOtherLabel
常量(CFStringRef类型)中的值。我认为iPhone
没有标记的原因是因为它是一个'自定义'标签,但它是由Apple而不是用户发起的。
您可以为标签指定您喜欢的任何值,如上面的megaphone
标签所示。但请注意,如果您尝试创建带有“其他”标签的电话号码(或电子邮件地址),而不使用kABOtherLabel
常量或其值_$!<Other>!$_
,系统会认为您是创建自定义标签。就像在这个例子中一样:
ABMultiValueAddValueAndLabel(email, @"nospam@notarealdomain.com", @"other", NULL);
如果您在iPhone上编辑该地址簿条目,它将显示在单独的自定义标签列表中。 (因此,对于'其他'将有2个选项,一个在默认值中,一个在自定义标签中)
虽然这没有回答你的问题,但我希望它有所帮助。
答案 1 :(得分:2)
这在新的CNContact framework中大致相同,它取代ABAddressBook作为处理联系人的推荐方式。
Apple提供了六个默认标签,引用phone-specific CNLabelledValue constants:
CNLabelPhoneNumberiPhone = "iPhone"
CNLabelPhoneNumberMobile = "_$!<Mobile>!$_"
CNLabelPhoneNumberMain = "_$!<Main>!$_"
CNLabelPhoneNumberHomeFax = "_$!<HomeFAX>!$_"
CNLabelPhoneNumberOtherFax = "_$!<OtherFAX>!$_"
CNLabelPhoneNumberPager = "_$!<Pager>!$_"
考虑到方法localizedString(forLabel:)的可用性,围绕其中五个常量包含_$!<
和>!$_
很可能是操作系统可以对字符串进行本地化的标记。我相信这些分隔符不会出现在iPhone周围的原因是因为Apple没有本地化iPhone,因为iPhone显示为iPhone和#34;用所有语言。
明智的行为是在显示使用localizedString(forLabel:)
的字符串时隐藏这些字符串,如果编辑条目,则继续使用字符串存储这些分隔符,并将任何用户创建的标签映射到这些字符串。自定义标签等于这些主体,即Mobile,Main,Pager等。