Я пытаюсь управлять контактами своего приложения, создавая группу.
Создание / удаление группы отлично работает на симуляторе (с iOS 11.3 и с iOS 9.3).
В обоих случаях настройки контактов по умолчанию установлены на iCloud в настройках iOS.
Я проверил настройки конфиденциальности в обоих случаях, разрешение на доступ к контактам устройства было установлено на YES
Следующий код не работает на iPad с iOS 9.3.5.
-(void) createNewGroup:(NSString*)groupName
{
CFErrorRef error = NULL;
ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error);
if (ab) {
ABRecordRef newGroup = ABGroupCreate();
ABRecordSetValue(newGroup, kABGroupNameProperty,(__bridge CFTypeRef)(groupName), nil);
ABAddressBookAddRecord(ab, newGroup, &error);
if (error) {
DDLogDebug(@"cannot create group -%@",error);
}else{
ABAddressBookSave(ab, &error);
}
if (error) {
DDLogDebug(@"cannot save group -%@",error);
}
//!!! important - save groupID for later use
self.groupId = ABRecordGetRecordID(newGroup); //-1 for iPad, and for other cases 2,3,4 ....
DDLogDebug(@"createNewGroup : %i",self.groupId );
CFRelease(newGroup);
CFRelease(ab);
}
}
и удалить группу:
Примечание: я не тестировал этот метод на iPad, так как нет группы, которую я хочу удалить, я протестирую это после того, как смогу создать группу на iPad. Этот метод сработал, как и ожидалось на симуляторе.
-(BOOL)deleteGroup:(NSString *)groupName{
BOOL res;
CFErrorRef error;
ABAddressBookRef ab = ABAddressBookCreate();
NSArray *groups = (__bridge NSArray *) ABAddressBookCopyArrayOfAllGroups(ab);
for (id _group in groups)
{
NSString *currentGroupName = (__bridge NSString*) ABRecordCopyValue((__bridge ABRecordRef)(_group), kABGroupNameProperty);
DDLogDebug(@"group name -%@",currentGroupName);
if ([groupName isEqualToString:currentGroupName])
{
res = ABAddressBookRemoveRecord(ab, (__bridge ABRecordRef)(_group), &error);
return res;
}
}
return NO;
}
Я не получаю никакой ошибки, но я получаю groupID как -1 при попытке создать группу на iPad, и я проверяю, что группа вообще не создана.