2

将联系人添加到不在设备上工作但在 ABAddressbook 中的模拟器上工作的组中不会出现错误,但联系人不会反映在联系人中的特定组中,但在模拟器上工作正常

我正在使用此代码

if (person) {
           ABAddressBookAddRecord(addressBook, person, nil);

           ABAddressBookSave(addressBook, &error);

           BOOL isADDED = ABGroupAddMember(groupNameRef, person, &error);

           NSError *error1 = (__bridge_transfer NSError *)error;

           NSLog(@"Reason = %@", error1.localizedFailureReason);
           BOOL iSSaved = ABAddressBookSave(addressBook, &error);
}

在模拟器上可以正常工作,但在设备上不行

4

1 回答 1

2

它将帮助您从正确使用错误检查开始。这是一个错误检查例程的结构:

if (person) {
    bool ok;
    CFErrorRef err = nil;
    ok = ABAddressBookAddRecord(addressBook, person, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABAddressBookSave(addressBook, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABGroupAddMember(groupNameRef, person, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABAddressBookSave(addressBook, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
}

注意这里的模式。该函数返回一个布尔值。你检查那个布尔值。如果为假,则检查间接返回的错误。如果您正确遵循此模式,您将获得有关问题所在的更好信息。

编辑:确保您确实可以访问联系人数据库。我假设您这样做了,但是模拟器和设备之间的主要区别在于模拟器自动授予访问权限,而在设备上必须向用户显示访问请求对话框(调用ABAddressBookRequestAccessWithCompletion),否则将无法访问并且尝试使用联系人数据库将失败,也许是静默。

于 2013-05-15T15:20:09.927 回答