使用联系人框架创建新组,CNErrorDomain Code = 2

Posted

技术标签:

【中文标题】使用联系人框架创建新组,CNErrorDomain Code = 2【英文标题】:create new group with contacts framework, CNErrorDomain Code = 2 【发布时间】:2015-11-05 18:33:13 【问题描述】:

我尝试使用联系人框架创建并保存一个组。 首先,用户授权应用程序访问联系人。 显示了一个视图控制器,并带有一个 + 按钮,用户显示一个带有文本字段的警报视图。

用户键入他想要的组名,然后单击警报视图的按钮(保存)。

这是保存新组的代码。群组名称可用,但无论如何无法保存此群组:

CNContactStore *contactStore = [CNContactStore new];  

[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error)
if (granted) 

    CNMutableGroup *newGroup = [CNMutableGroup new];
    CNSaveRequest *saveRequest = [CNSaveRequest new];

    [newGroup setName:groupName];

    //when saving to container with identifier nil, we get this error:
    //Error Domain=CNErrorDomain Code=2 "(null)" UserInfo=CNInvalidRecords=(
    //"<CNMutableGroup: 0x10a059f20: identifier=2F4981B9-8A47-45A4-8841-1FA5A09584A4:ABGroup, name=gghh>"
    [saveRequest addGroup:newGroup toContainerWithIdentifier:nil];
    [contactStore executeSaveRequest:saveRequest error:&error];

    if (error)
        //error saving group
        //NSLog(@"error message: %@",error);
     else 
        //if no errors, reload tableview
        dispatch_async(dispatch_get_main_queue(), ^
            [self.tableView reloadData];
        );
    

];



Error Domain=CNErrorDomain Code=2 "(null)" UserInfo=CNInvalidRecords=(
    "<CNMutableGroup: 0x14fb3e5e0: identifier=8E490585-1223-407E-B353-0D25609B05AB:ABGroup, name=jddjd>"
)

下一个奇怪的事情是:为什么保存请求试图保存这个组 最后带有标识符:ABGroup

错误包含有关 CNInvalidRecords 的信息。 我只使用联系人框架。 为什么会这样?

有什么解决办法吗?

【问题讨论】:

【参考方案1】:

对我来说效果很好,代码基本相同。

CNMutableGroup *newGroup = [CNMutableGroup new];
CNSaveRequest *saveRequest = [CNSaveRequest new];
[newGroup setName:self.groupName];
[saveRequest addGroup:newGroup toContainerWithIdentifier:nil];
[contactStore executeSaveRequest:saveRequest error:&error];

并创建了一个新组

【讨论】:

如果在设置 > 邮件、日历、通讯录中将 iCloud 设置为默认设置,则会创建一个新组。如果默认为 Exchange,则无法创建和保存组。这就是为什么我得到这个错误。我正在寻找解决此问题的方法。 根据 Apple 的文档,您不能在 Exchange 容器中创建组,您需要为每个“组”创建一个单独的容器。 是的,没错,但我想当 iCloud 同步被激活时,不可能创建另一个单独的容器来创建一个新组并将其保存在本地。 没有办法找到当前默认的通讯簿类型,是吗? (我不认为旧 API 中曾经有)可能不会导致异常,但只适用于一种类型或另一种类型的东西? 我没有找到获取当前默认地址簿类型的方法。联系人框架抛出错误(请参阅我的问题帖子),旧的 AB 框架不提供任何错误。

以上是关于使用联系人框架创建新组,CNErrorDomain Code = 2的主要内容,如果未能解决你的问题,请参考以下文章

Dictionary 嵌套Dictionary

Kotlin 协程Flow 流组合 ( Flow#zip 组合多个流 | 新组合流的元素收集间隔与被组合流元素发射间隔的联系 )

Kotlin 协程Flow 流组合 ( Flow#zip 组合多个流 | 新组合流的元素收集间隔与被组合流元素发射间隔的联系 )

使用 Smack 4.1 创建新组时获取 SmackException NoResponseException

Kafka-Connect:在分布式模式下创建新连接器就是创建新组

每当列值更改时,如何使用`dplyr`来创建一个新组?