处理ABAddressBookRef时似乎找不到解决方案

伊丹·莫西(Idan Moshe)

我的代码中有几个“ EXC_BAD_ACCESS”,我试图找出问题所在,但我仍然不知道为什么。有任何想法吗?

- (void)requestPermissionForContacts {
    NSLog(@"requestPermissionForContacts");
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(duplicateUserContacts:) name:kAccessGrantedNotification object:nil];
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    if (addressBook != NULL) {
        if (kWeDontHaveAccessToContacts) {
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
                if (granted) {
                    NSLog(@"Access granted");
                    [[NSNotificationCenter defaultCenter] postNotificationName:kAccessGrantedNotification object:nil];
                }
            });
        }
        else if (kWeHaveAccessToContacts) {
            [[NSNotificationCenter defaultCenter] postNotificationName:kAccessGrantedNotification object:nil];
        }
    }
}

- (void)duplicateUserContacts:(NSNotification*)notification {
    NSLog(@"duplicateUserContacts");
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    if (addressBook != NULL && kWeHaveAccessToContacts) {
        // Get all user contacts
        NSArray *allContacts = [self getAllContacts];
        CFArrayRef allContactsRef = (__bridge CFArrayRef)allContacts;

        // Delete old group if exists
        [self deleteOwnGroup];

        // Create Mobile Control 'white list' group
        [self createGroup];

        // Copy contacts to new group
        if (addressBook != NULL && kWeHaveAccessToContacts) {
            for (int i = 0; i < ABAddressBookGetPersonCount(addressBook); i++) {
                ABRecordRef personFromContacts = CFArrayGetValueAtIndex(allContactsRef, i);
                [self addContactToGroup:personFromContacts];
            }
        }
        CFRelease(allContactsRef);
        CFRelease(addressBook);
    }
}

- (ABRecordRef)getGroupReference {
    NSLog(@"getGroupReference");

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    if (addressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(addressBook);

        if (allGroups != NULL) {
            for (int i = 0; i < CFArrayGetCount(allGroups); i++) {
                ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i);
                CFStringRef name = ABRecordCopyCompositeName(group);
                NSString *groupName = (__bridge NSString*)name;

                NSLog(@"groupName: %@", groupName);

                if ([groupName isEqualToString:kCallBlockGroupName]) {
                    self.groupCallBlockRef = group;

                    CFRelease(group);
                    CFRelease(name);
                    CFRelease(allGroups);

                    break;
                }
                else {
                    continue;
                }
            }
        }
    }
    //CFRelease(addressBook);
    return self.groupCallBlockRef != NULL ? self.groupCallBlockRef : NULL;
}

- (NSArray*)getAllContacts {
    NSLog(@"getAllContacts");

    __block NSArray *allContacts = [NSArray new];
    __block CFErrorRef *error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);

    if (addressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
        allContacts = CFBridgingRelease(people);
        self.arrayOfAllContacts = allContacts;

        CFRelease(addressBook);
        //CFRelease(error);
    }
    else {
        NSLog(@"addressBook is NULL");
        allContacts = NULL;
    }

    NSLog(@"Total number of contacts: %i", allContacts.count);
    return allContacts;
}

- (void)deleteContact:(ABRecordRef)person {
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    if (addressBook != NULL && kWeHaveAccessToContacts) {
        CFErrorRef error = NULL;
        ABAddressBookRemoveRecord(addressBook, person, &error);
        ABAddressBookSave(addressBook, &error);

        CFRelease(addressBook);
        CFRelease(error);
        CFRelease(person);
    }
}

- (void)blockPerson:(ABRecordRef)person {
    BOOL hasContact = [self checkIfContactExists:person];
    if (hasContact) {
        NSLog(@"Contact exists, delete him.");
        [self deleteContact:person];
    }
    else {
        NSLog(@"Contact not exists.");
    }
}

- (BOOL)checkIfContactExists:(ABRecordRef)person {
    __block BOOL answer = NO;
    CFErrorRef *error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);

    if (addressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);

        for(int i=0; i<ABAddressBookGetPersonCount(addressBook); i++) {
            ABRecordRef personToCompare = CFArrayGetValueAtIndex(people, i);

            if (ABRecordGetRecordID(personToCompare) == ABRecordGetRecordID(person)) {
                answer = YES;

                CFRelease(addressBook);
                CFRelease(people);
                CFRelease(personToCompare);
                CFRelease(person);

                break;
            }
        }
    }
    return answer;
}

- (void)deleteOwnGroup {
    NSLog(@"deleteOwnGroup");

    ABRecordRef group = [self getGroupReference];
    BOOL hasGroup = group != NULL ? YES : NO;

    if (hasGroup) {
        NSLog(@"Group exists, delete group.");
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

        if (addressBook != NULL && kWeHaveAccessToContacts) {
//            CFErrorRef error = NULL;
            ABAddressBookRemoveRecord(addressBook, group, NULL);
            ABAddressBookSave(addressBook, NULL);

            CFRelease(group);
            CFRelease(addressBook);
        }
    }
    else {
        NSLog(@"Group is not exists, no group to delete.");
    }
}

- (void)createGroup {
    NSLog(@"createGroup");

    ABRecordRef group = [self getGroupReference];
    BOOL hasGroup = group != NULL ? YES : NO;

    if (hasGroup) {
        NSLog(@"Group already exists.");
    }
    else {
        NSLog(@"Group is not exists, create group.");
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

        if (addressBook != NULL && kWeHaveAccessToContacts) {
            ABRecordRef newGroup = ABGroupCreate();
            ABRecordSetValue(newGroup, kABGroupNameProperty, (__bridge CFStringRef)kCallBlockGroupName, NULL);
            ABAddressBookAddRecord(addressBook, newGroup, NULL);
            ABAddressBookSave(addressBook, NULL);
            self.groupCallBlockRef = newGroup;

            CFRelease(newGroup);
            CFRelease(addressBook);
            CFRelease(group);
        }
    }
}

- (void)addContactToGroup:(ABRecordRef)person {
    NSLog(@"addContactToGroup");

    ABRecordRef group = [self getGroupReference];
    BOOL hasGroup = group != NULL ? YES : NO;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    //ABRecordID recordID = ABRecordGetRecordID(person);

    if (!hasGroup) {
        [self createGroup];
        group = self.groupCallBlockRef;
    }

    CFErrorRef error = NULL;
    BOOL didAdd = ABGroupAddMember(group, person, &error);

    if (!didAdd || error) {
        NSLog(@"Error adding member to group: %@", error);
    }

    error = NULL;
    BOOL didSave = ABAddressBookSave(addressBook, &error);

    if (!didSave || error) {
        NSLog(@"Error saving member to group: %@", error);
    }
    CFRelease(addressBook);
    CFRelease(error);
    CFRelease(group);
    CFRelease(person);
}
  1. 在“ deleteOwnGroup”内部:

    ABAddressBookRemoveRecord(addressBook,group,NULL); ABAddressBookSave(addressBook,NULL);

  2. 在“ addContactToGroup”内部:

    BOOL didAdd = ABGroupAddMember(group,person,&error);

伊丹·莫西(Idan Moshe)

我修复了我的代码,现在它就像一个魅力,完整的代码:

- (id)initAddressBook {
    self = [super init];
    if (self) {
        self.addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
        ABAddressBookRegisterExternalChangeCallback(self.addressBook, addressBookChangeHandler, NULL);
    }
    return self;
}

- (void)duplicateUserContactsFromAddressBook:(ABAddressBookRef)myAddressBook {
    NSLog(@"duplicateUserContacts");

    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        // Get all user contacts
        CFArrayRef allContactsRef = [self getAllContactsInAddressBook:myAddressBook];

        // Delete old group if exists
        [self deleteGroupWithName:kGroupNameMobileControl fromAddressBook:myAddressBook];

        // Create Mobile Control 'white list' group
        self.groupCallBlockRef = [self createGroupWithName:kGroupNameMobileControl fromAddressBook:myAddressBook];

        // Copy contacts to new group
        for (int i = 0; i < ABAddressBookGetPersonCount(myAddressBook); i++) {
            ABRecordRef personFromContacts = CFArrayGetValueAtIndex(allContactsRef, i);
            [self addPerson:personFromContacts toGroup:self.groupCallBlockRef fromAddressBook:myAddressBook];
        }
    }
}

- (void)deleteGroupWithName:(NSString*)groupName fromAddressBook:(ABAddressBookRef)myAddressBook {
    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(myAddressBook);
        if (allGroups != NULL) {
            for (int i = 0; i < CFArrayGetCount(allGroups); i++) {
                ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i);
                CFStringRef name = ABRecordCopyCompositeName(group);
                NSString *currentGroupName = (__bridge NSString*)name;

                if ([currentGroupName isEqualToString:groupName]) {
                    [self deleteGroup:group fromAddressBook:myAddressBook];
                }
            }
        }
    }
}

- (ABRecordRef)getGroupReference:(ABAddressBookRef)myAddressBook {
    NSLog(@"getGroupReference");

    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(myAddressBook);
        if (allGroups != NULL) {
            for (int i = 0; i < CFArrayGetCount(allGroups); i++) {
                ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i);
                CFStringRef name = ABRecordCopyCompositeName(group);
                NSString *groupName = (__bridge NSString*)name;
                NSLog(@"groupName: %@", groupName);

                if ([groupName isEqualToString:kGroupNameMobileControl]) {
                    self.groupCallBlockRef = group;
                    break;
                }
                else {
                    continue;
                }
            }
        }
    }
    return self.groupCallBlockRef != NULL ? self.groupCallBlockRef : NULL;
}

- (CFArrayRef)getAllContactsInAddressBook:(ABAddressBookRef)myAddressBook {
    NSLog(@"getAllContacts");

    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(myAddressBook);
        self.arrayOfAllContacts = people;
    }
    else {
        self.arrayOfAllContacts = NULL;
    }

    NSLog(@"Total number of contacts: %li", CFArrayGetCount(self.arrayOfAllContacts));
    return self.arrayOfAllContacts;
}

- (void)deleteContact:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        CFErrorRef error = NULL;
        ABAddressBookRemoveRecord(myAddressBook, person, &error);
        ABAddressBookSave(myAddressBook, &error);

        CFRelease(error);
        CFRelease(person);
    }
}

- (void)blockPerson:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
    BOOL hasContact = [self checkIfContactExists:person inAddressBook:myAddressBook];
    if (hasContact) {
        NSLog(@"Contact exists, delete him.");
        [self deleteContact:person inAddressBook:myAddressBook];
    }
    else {
        NSLog(@"Contact not exists.");
    }
}

- (BOOL)checkIfContactExists:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
    __block BOOL answer = NO;

    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(myAddressBook);

        for(int i=0; i<ABAddressBookGetPersonCount(myAddressBook); i++) {
            ABRecordRef personToCompare = CFArrayGetValueAtIndex(people, i);

            if (ABRecordGetRecordID(personToCompare) == ABRecordGetRecordID(person)) {
                answer = YES;

                CFRelease(people);
                CFRelease(personToCompare);
                CFRelease(person);

                break;
            }
        }
    }
    return answer;
}

- (ABRecordRef)createGroupWithName:(NSString*)groupName fromAddressBook:(ABAddressBookRef)myAddressBook {
    NSLog(@"createGroup");
    ABRecordRef newGroup = ABGroupCreate();
    if (myAddressBook != NULL && kWeHaveAccessToContacts) {
        ABRecordSetValue(newGroup, kABGroupNameProperty, (__bridge CFStringRef)groupName, NULL);
        ABAddressBookAddRecord(myAddressBook, newGroup, NULL);
        ABAddressBookSave(myAddressBook, NULL);
        self.groupCallBlockRef = newGroup;
    }
    return newGroup;
}

- (void)addPerson:(ABRecordRef)person toGroup:(ABRecordRef)group fromAddressBook:(ABAddressBookRef)myAddressBook {
    NSLog(@"addContactToGroup");
    ABGroupAddMember(group, person, NULL);
    ABAddressBookSave(myAddressBook, NULL);
}

static void addressBookChangeHandler(ABAddressBookRef addressBook, CFDictionaryRef info, void *context)
{
    if (context) {
        [(__bridge CallBlockManager*)context handleAddressBookChange:addressBook withInfo:info];
    }
}

- (void)handleAddressBookChange:(ABAddressBookRef)myAddressBook withInfo:(CFDictionaryRef)info {
    //
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

加载DLL时C#异常。找不到解决方案

来自分类Dev

找不到解决方案文件(CCNet和NAnt)

来自分类Dev

js中的Web服务参数?找不到解决方案

来自分类Dev

IE9强制古怪模式且找不到解决方案

来自分类Dev

Qt Creator编译错误“找不到-lGL”。其他解决方案不起作用

来自分类Dev

Charts.js直线-我找不到解决方案

来自分类Dev

在同一解决方案中找不到引用

来自分类Dev

Travis找不到CSharp解决方案

来自分类Dev

Linux Mint 17.2上的xsession-errors。找不到类似问题的解决方案

来自分类Dev

在我的应用程序上找不到解决权利的解决方案

来自分类Dev

为什么我得到“找不到模块”我已经尝试了很多解决方案

来自分类Dev

缩进错误正在触发,我找不到解决方案

来自分类Dev

找不到默认活动。我看到许多解决方案,但对我不起作用

来自分类Dev

由于内存不足找不到GEKKO(IPOPT)解决方案?

来自分类Dev

Visual Studio找不到解决方案的SDK(10.0.17763.0)的已安装版本

来自分类Dev

Makefile-没有此类文件或file.h目录(找不到解决方案)

来自分类Dev

TypeError:无法读取未定义的属性“ map”。找不到解决方案

来自分类Dev

在此函数中找不到问题的解决方案def interval()

来自分类Dev

处理ABAddressBookRef时似乎找不到解决方案

来自分类Dev

找不到解决方案文件(CCNet和NAnt)

来自分类Dev

MapFragment layout_height找不到解决方案

来自分类Dev

找不到Pack类的符号/变量,解决方案?

来自分类Dev

找不到我的“ addEventListener”函数的解决方案

来自分类Dev

Quadprog找不到解决方案

来自分类Dev

fsolve / fzero:找不到解决方案,显示为常规

来自分类Dev

找不到跟随错误的解决方案

来自分类Dev

我的解决方案似乎“丑陋”

来自分类Dev

UI 显示的 NiFi 异常.. 找不到解决方案。小白

来自分类Dev

OpenCover 找不到解决方案模块

Related 相关文章

  1. 1

    加载DLL时C#异常。找不到解决方案

  2. 2

    找不到解决方案文件(CCNet和NAnt)

  3. 3

    js中的Web服务参数?找不到解决方案

  4. 4

    IE9强制古怪模式且找不到解决方案

  5. 5

    Qt Creator编译错误“找不到-lGL”。其他解决方案不起作用

  6. 6

    Charts.js直线-我找不到解决方案

  7. 7

    在同一解决方案中找不到引用

  8. 8

    Travis找不到CSharp解决方案

  9. 9

    Linux Mint 17.2上的xsession-errors。找不到类似问题的解决方案

  10. 10

    在我的应用程序上找不到解决权利的解决方案

  11. 11

    为什么我得到“找不到模块”我已经尝试了很多解决方案

  12. 12

    缩进错误正在触发,我找不到解决方案

  13. 13

    找不到默认活动。我看到许多解决方案,但对我不起作用

  14. 14

    由于内存不足找不到GEKKO(IPOPT)解决方案?

  15. 15

    Visual Studio找不到解决方案的SDK(10.0.17763.0)的已安装版本

  16. 16

    Makefile-没有此类文件或file.h目录(找不到解决方案)

  17. 17

    TypeError:无法读取未定义的属性“ map”。找不到解决方案

  18. 18

    在此函数中找不到问题的解决方案def interval()

  19. 19

    处理ABAddressBookRef时似乎找不到解决方案

  20. 20

    找不到解决方案文件(CCNet和NAnt)

  21. 21

    MapFragment layout_height找不到解决方案

  22. 22

    找不到Pack类的符号/变量,解决方案?

  23. 23

    找不到我的“ addEventListener”函数的解决方案

  24. 24

    Quadprog找不到解决方案

  25. 25

    fsolve / fzero:找不到解决方案,显示为常规

  26. 26

    找不到跟随错误的解决方案

  27. 27

    我的解决方案似乎“丑陋”

  28. 28

    UI 显示的 NiFi 异常.. 找不到解决方案。小白

  29. 29

    OpenCover 找不到解决方案模块

热门标签

归档