ABGroupCreate不能与Exchange一起使用

我有一个问题,当我在模拟器上运行这段代码的时候,我得到了组的id,但是当我在设备上运行它时,id被设置为-1 …但是错误消息保持为空。

-(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ ABAddressBookRef addressBook = ABAddressBookCreate(); CFErrorRef error = NULL; ABRecordRef group = ABGroupCreate(); ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); ABAddressBookAddRecord(addressBook, group, &error); ABAddressBookSave(addressBook,&error); NSNumber *gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; CFRelease(group); return gId; } 

我不知道有什么区别,以及如何使它在一个真正的设备上工作。

编辑 :发现它的工作原理,如果我删除手机上的交换同步,但仍然希望它能够在手机上有一个交stream帐户的工作。 所以没有真正解决这个问题

编辑/答复

发现这是因为交换不知道关于组的信息,为了保存一个组,需要使用正确的源代码,也请参阅: 在iOS 4+中从ABAddressBook获取特定的ABSource

新代码:

 -(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ ABAddressBookRef addressBook = ABAddressBookCreate(); CFErrorRef error = NULL; CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); CFIndex sourceCount = CFArrayGetCount(sources); NSNumber *gId = nil; for (CFIndex i = 0 ; i < sourceCount; i++) { ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); BOOL isMatch = kABSourceTypeLocal == [(__bridge NSNumber *)sourceType intValue]; CFRelease(sourceType); if (isMatch) { ABRecordRef group = ABGroupCreateInSource(currentSource);//ABGroupCreate(); ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); ABAddressBookAddRecord(addressBook, group, &error); ABAddressBookSave(addressBook,&error); gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; CFRelease(group); CFRelease(currentSource); break; } } CFRelease(sources); return gId; } 

发现这是因为exchange不知道关于组的信息,为了保存一个组,需要使用正确的源代码,另请参阅: 在iOS 4+中从ABAddressBook获取特定的ABSource

新代码:

 -(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ ABAddressBookRef addressBook = ABAddressBookCreate(); CFErrorRef error = NULL; CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); CFIndex sourceCount = CFArrayGetCount(sources); NSNumber *gId = nil; for (CFIndex i = 0 ; i < sourceCount; i++) { ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); BOOL isMatch = kABSourceTypeLocal == [(__bridge NSNumber *)sourceType intValue]; CFRelease(sourceType); if (isMatch) { ABRecordRef group = ABGroupCreateInSource(currentSource);//ABGroupCreate(); ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); ABAddressBookAddRecord(addressBook, group, &error); ABAddressBookSave(addressBook,&error); gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; CFRelease(group); CFRelease(currentSource); break; } } CFRelease(sources); return gId; }