同様の問題がありました。コールバックは、最初は 1 回しか呼び出されませんが、外出してアドレス帳を 2 回目に変更すると、複数回呼び出されます。私にとって、問題はABAddressBookRegisterExternalChangeCallback
appDelegate のapplicationWillResignActive:
メソッドで呼び出されていたメソッドでした。
私がアドレス帳を使用していた方法は、同期設定のためでした。問題は、同期設定が変更されたときだけでなく、同期設定が保存されるたびに外部コールバックを登録していたことです。
説明のために、appDelegate で呼び出していたコードを次に示します。
- (void)saveSettings
{
NSUserDefaults *syncSettingsData = [NSUserDefaults standardUserDefaults];
[syncSettingsData setObject:[NSNumber numberWithBool:self.isSyncingiPadContacts] forKey:SYNC_IPAD_CONTACTS_TURNED_ON];
[self setAddressBookChanged];
[syncSettingsData synchronize];
}
- (void)setAddressBookChanged
{
if (self.isSyncingiPadContacts)
{
ABAddressBookRegisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *)self);
}
else
{
ABAddressBookUnregisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *) self);
}
}
setAddressBookChanged
メソッド内のへの呼び出しを削除しsaveSettings
、アドレス帳の作成時 (初回セットアップ時) およびユーザーが同期設定を変更するたびに呼び出すようにしました。
うまくいけば、これはあなたを助けます。