создать новую группу с фреймворком контактов, код CNErrorDomain = 2

Я пытаюсь создать и сохранить группу с помощью Contacts Framework. Сначала пользователь разрешает приложению доступ к контактам. Представлен контроллер представления, и с помощью кнопки + пользователь показывает оповещение с текстовым полем.

Пользователь вводит имя группы, которое он хочет, и нажимает кнопку просмотра предупреждений (сохранить).

Это код для сохранения новой группы. Имя группы доступно, но сохранить эту группу все равно невозможно:

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.
Я использую только Contacts Framework.
Почему это происходит?

Любые решения для этого?


person brush51    schedule 05.11.2015    source источник


Ответы (1)


У меня это работало нормально, по сути, с тем же кодом.

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

И создал новую группу

person Peter Johnson    schedule 12.11.2015
comment
это создает новую группу, если iCloud установлен по умолчанию в Настройки › Почта, Календарь, Контакты. Если по умолчанию стоит Exchange, то создавать и сохранять группы будет невозможно. И вот почему я получаю эту ошибку. Я ищу обходной путь для этой проблемы. - person brush51; 13.11.2015
comment
Согласно документам Apple, вы не можете создать группу в контейнере Exchange, вам нужно создать отдельный контейнер для каждой группы. - person Peter Johnson; 13.11.2015
comment
да, это правильно, но я думаю, что было бы невозможно создать еще один отдельный контейнер для создания новой группы и сохранения ее локально, КОГДА активируется синхронизация iCloud. - person brush51; 13.11.2015
comment
Нет способа узнать, каков текущий тип адресной книги по умолчанию, не так ли? (я не думаю, что это было в старом API), возможно, что-то, что не вызывает исключения, а работает только с одним или другим типом? - person Peter Johnson; 13.11.2015
comment
я не нашел способ, как получить текущий тип адресной книги по умолчанию. Contacts Framework выдает ошибку (см. мой вопрос), а старая AB Framework не выдает никаких ошибок. - person brush51; 13.11.2015
comment
Не можете ли вы проверить CNContainerType в текущем контейнере, чтобы убедиться, что он равен CNContainerTypeExchange? - person Peter Johnson; 13.11.2015
comment
Я не пробовал, но предполагаю, что да, это можно проверить. но реальный вопрос в том, в чем польза? что я могу сделать, когда я знаю, что это обмен ..? - person brush51; 14.11.2015
comment
Мы могли бы, по крайней мере, предупредить пользователя, а не сбой :), поскольку Exchange эффективно использует контейнеры как группы, я подумал, что мы могли бы создать еще один контейнер и использовать его как группу, но я еще не изучал этот вопрос. - person Peter Johnson; 14.11.2015