我正在尝试创建一个可以用来搜索Exchange GAL的应用程序,然而,我发现关于这个主题的新的4.0文档令人困惑。有谁知道我如何在GAL中搜索包含特定字符串的名称(例如"Smi")?我的源代码目前几乎是无用的,因为我只是试图绕过我的头脑,如何指定我只想搜索GAL而不是设备上的本地联系人。另外,kABSourceTypeSearchableMask是如何使用的?我在这里遗漏了一些基本的东西。从文档..。
源类型
这些常量用于标识源的类型。
enum {
kABSourceTypeLocal = 0x0,
kABSourceTypeExchange = 0x1,
kABSourceTypeExchangeGAL = kABSourceTypeExchange | kABSourceTypeSearchableMask,
kABSourceTypeMobileMe = 0x2,
kABSourceTypeLDAP = 0x3 | kABSourceTypeSearchableMask,
kABSourceTypeCardDAV = 0x4,
kABSourceTypeCardDAVSearch = kABSourceTypeCardDAV | kABSourceTypeSearchableMask,
};
typedef int ABSourceType;当我查询缺省的源类型时,我得到的是"1“,它表明缺省类型是"kABSourceTypeExchange”,这是正确的,因为这就是我在设置中的设置。我不知道如何超越这一点..。
由于整个源代码的概念对于4.0中的ABAddressBook框架来说是一个新的概念,我不认为人们对此有太多的经验,但希望有人能帮助我理解如何使用above...thanks。
发布于 2010-11-04 17:31:38
要访问Exchange,您需要使用函数ABAddressBookCopyArrayOfAllSources来获取所有源的数组,然后迭代该数组以尝试获取Exchange GAL的正确源。使用ABRecordCopyValue()函数获取源的kABSourceTypeProperty属性。
例如:
ABRecordRef searchableExchangeSource;
addressBook = ABAddressBookCreate();
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);
// Get source properties
NSNumber *sourceTypeRef = (NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
NSString *sourceTypeName = (NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
int sourceType = [sourceTypeRef intValue];
NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
if (sourceType == kABSourceTypeExchangeGAL) {
searchableExchangeSource = source;
}
[sourceTypeRef release];
[sourceTypeName release];
}注意:如果您设置了多个“交换”帐户,您将获得具有相同ABSourceType的多个源。不幸的是,根据我有限的测试,Exchange GAL的kABSourceTypeNameProperty为空,因此您不能使用此属性来区分多个Exchange GAL源。
一旦有了合适的源,它的类型就是ABRecordRef,因此您可以像处理任何其他记录一样与它进行交互。
发布于 2011-01-25 17:07:00
我在这里发布了一些代码:Obtaining Specific ABSource from ABAddressBook in iOS 4+
用于识别特定的来源。它可能有助于您了解如何使用ABAddressBook。
发布于 2014-03-28 18:19:11
Mixja的响应更新
addressBook = ABAddressBookCreate();
// 1. @property(非原子,赋值) ABAddressBookRef *addressBook;// 2. NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source,kABSourceTypeProperty));NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source,kABSourceNameProperty));// 3. CFRelease((__bridge CFTypeRef)(sourceTypeRef));CFRelease(__bridge
最终的代码应该如下所示:
请确保包含步骤1!
ABRecordRef searchableExchangeSource;
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(_addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);
// Get source properties
NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
int sourceType = [sourceTypeRef intValue];
NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
if (sourceType == kABSourceTypeExchangeGAL) {
searchableExchangeSource = source;
}
CFRelease((__bridge CFTypeRef)(sourceTypeRef));
CFRelease((__bridge CFTypeRef)(sourceTypeName));https://stackoverflow.com/questions/3108413
复制相似问题