Iphone 在iOS 4中从ABAddressBook获取特定绝对资源+

Iphone 在iOS 4中从ABAddressBook获取特定绝对资源+,iphone,ios4,abaddressbook,Iphone,Ios4,Abaddressbook,有没有人举例说明如何在iOS 4+中从ABAddressBook中获取特定的绝对资源?iOS 4+提供了新的API,允许用户从ABAddressBook中选择特定的绝对资源。这可能很有用,因为某些源(如Exchange)不支持某些操作,例如创建ABGroup 并非所有源类型都支持组,更明显的是,Exchange对组一无所知。- 附加的函数利用新API获取特定类型的源,这些源可用于调用ABGroupCreateInSource #define CFRELEASE_AND_NIL(x) CFRele

有没有人举例说明如何在iOS 4+中从ABAddressBook中获取特定的绝对资源?

iOS 4+提供了新的API,允许用户从ABAddressBook中选择特定的绝对资源。这可能很有用,因为某些源(如Exchange)不支持某些操作,例如创建ABGroup

并非所有源类型都支持组,更明显的是,Exchange对组一无所知。-

附加的函数利用新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);
}
Xyzzycoder-

如果已经有localSource,那么您的解决方案可以很好地工作,但是如果没有localSource,那么只返回NULL

有没有办法,比如说,为localSource创建一个ABRecordRef?我需要能够将我的联系人存储到非同步源


干杯

真想知道如何创建我自己的源代码。就像group Exchange create一样,你不需要编辑默认的源代码记录,而是创建自己的源代码记录,最奇妙的是,通讯簿会自动将它们链接在一起。

代码有错误,这就是为什么它总是返回两个,因为ABRecordGetRecordType方法不是绝对资源的一部分。它只包括:

个人记录的KabbersonType 组记录的组类型。 源记录的源类型

要确定正确的类型,您必须使用ABRecordCopyValuesource,而不是kABSourceTypeProperty!:无论是否使用localSource,在我的iPhone上都非常有效


祝你好运

彼得,在什么情况下不会有本地消息来源?嗨。例如,“联系人”应用程序的“组”页面上没有本地通讯簿(通常全部在我的iphone上、全部在我的PC上或全部在我的Mac上)。如果您通过Exchange将所有联系人与Google同步,您也无法使用您建议的方法对其进行处理。根据我的测试,如果用户在设置Exchange之前输入了一些联系人,并且选择不合并,那么只有当用户的设备上存储了一些联系人,并且这些联系人与Exchange不同步时,才能获得本地通讯簿的句柄。干杯,真有趣。我猜我显然错误地认为本地通讯簿会一直存在于设备上。如果本地源还不存在,似乎也没有一个工具可以通过编程方式创建本地源?Jackie,你是说你知道如何创建本地源吗?我希望如此。实际上,我发现了一个私有API,可以创建我自己的源,这就是AbsolSourceCreate;。它不会崩溃并返回ABRecordRef,它在日志中打印为Absore类型。我相信这是我想要的绝对资源类型。因此我设置了kABSourceNameProperty,kABSourceTypeProperty并使用ABAddressAddRecord将其添加到addressBook。但最终还是失败了,就像我在过程中遗漏了什么一样。也许苹果会在下一次更新中发布更多细节,谁知道呢:@Hidderberg-你能修补代码以合并你的建议吗?或者你是说,如果本地源不存在,这种方法就行不通了?我是说,如果本地源不存在,这种方法就行不通了。目前正在等待苹果对此问题的答复@xyzzycoder今天从苹果公司得到了答案,正如我所想。无法创建源或对用户未使用的源执行任何操作。我在->@Hidderberg上注册了一个bug-谢谢。我仍然希望对代码示例进行修补,使其能够正常工作。@Hiddenberg-我相信我已经合并了您建议的修补程序。谢谢。读者们,请注意,并非所有设备都有本地源。请参阅下面的评论,因此您需要能够处理请求的源不存在的情况。以编程方式创建本地源似乎也是不可能的。释放复制的值怎么样?这是不是因为我看不到的原因而没有必要?马丁-接得好。现在应该把漏洞修好了。