ios - ABGroupCreate 不适用于 Exchange

标签 ios iphone addressbook

当我在模拟器上运行这段代码时遇到了问题,我得到了组的 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;
}

我不知道有什么区别,也不知道如何让它在真实设备上运行。

编辑:发现如果我删除手机上的 exchange sync 就可以工作,但仍然希望它在能够在手机上拥有 exchange 帐户的同时工作。所以并没有真正解决问题

编辑/回答

发现是因为exchange不知道组,要保存一个组需要使用正确的源,另见:Obtaining Specific ABSource from ABAddressBook in iOS 4+

新代码:

-(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 不了解码,要保存组需要使用正确的源,另见:Obtaining Specific ABSource from ABAddressBook in iOS 4+

新代码:

-(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;
}

关于ios - ABGroupCreate 不适用于 Exchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207958/

相关文章:

android - 您可以使用 Google Places API 搜索与特定企业列表相匹配的附近企业吗?

iphone - 加载缓慢时 ALAsset 照片库图像性能改进

c# - 如何通过 C# 在 Outlook 中创建一组联系人文件夹

iphone - 从表格单元格及其详细信息披露按钮中提取 Storyboard

ios - CoreLocation : CLClient is deprecated. Will be obsoted soon.in iPhone

ios - 在 ios 上从电话簿导入联系人时过滤 truecaller 垃圾邮件联系人(保存名称 "Identified as Spam")

ios - 在 iOS 中订阅地址簿事件

objective-c - 如何测试 block 是否被调用

ios - 使用 Swift 中的动画 block 在 CAShapeLayer 中对中风结束进行动画处理

iphone - 将 salesforce iPhone native 应用程序的离线记录同步到 salesforce(使用 smartstore)