有没有人有如何从 iOS 4+ 中的 ABAddressBook 获取特定 ABSource 的示例?
4 回答
iOS 4+ 提供了新的 API,允许从 ABAddressBook 中选择特定的 ABSource。这可能很有用,因为某些源(即 Exchange)不支持某些操作,例如创建 ABGroup。
“并非所有源类型都支持组,更明显的是,Exchange 对组一无所知。” - http://flavors.me/volonbolon#1a5/tumblr
附件是利用新 API 获取特定类型源的函数,这些源可用于调用 ABGroupCreateInSource()。
#define CFRELEASE_AND_NIL(x) CFRelease(x); x=nil;
ABRecordRef sourceWithType (ABSourceType mySourceType)
{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);
CFIndex sourceCount = CFArrayGetCount(sources);
ABRecordRef resultSource = NULL;
for (CFIndex i = 0 ; i < sourceCount; i++) {
ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i);
CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty);
BOOL isMatch = mySourceType == [(NSNumber *)sourceType intValue];
CFRELEASE_AND_NIL(sourceType);
if (isMatch) {
resultSource = currentSource;
break;
}
}
CFRELEASE_AND_NIL(addressBook);
CFRELEASE_AND_NIL(sources);
return resultSource;
}
ABRecordRef localSource()
{
return sourceWithType(kABSourceTypeLocal);
}
ABRecordRef exchangeSource()
{
return sourceWithType(kABSourceTypeExchange);
}
ABRecordRef mobileMeSource()
{
return sourceWithType(kABSourceTypeMobileMe);
}
真的很想知道如何创建自己的源。就像 Exchange 创建的组一样,您无需编辑默认源记录而是创建自己的组,最神奇的是,地址簿会自动将它们链接在一起。
Xyzzycoder-
如果已经有 localSource,您的解决方案效果很好,但如果没有,则只返回 NULL。
有没有办法,比如说,为 localSource 创建一个 ABRecordRef?我需要能够将我的联系人存储到非同步源。
干杯
代码有错误,这就是为什么它总是返回两个,因为方法:ABRecordGetRecordType 不是 ABSource 的一部分。它仅包括:
kABPersonType 用于个人记录 kABGroupType 用于组记录。kABSourceType 用于源记录。
要找出正确的类型,您必须使用:ABRecordCopyValue(source, kABSourceTypeProperty) 代替!:) 在有或没有 localSource 的情况下,在我的 iPhone 上都能很好地工作。
祝你好运!