AddressBook 데이터베이스에 변경 사항이있을 경우 ABAddressBookRegisterExternalChangeCallback을 사용하여 등록합니다. 나에게 잘 작동하고 알림을받을 수 있지만 앱이 실행 중일 때만 작동합니다.앱이 용어 완성 일 때도 ABAddressBookRegisterExternalChangeCallback이 작동합니까?
일단 앱이 종료 (종료) 된 다음 재시작되면 해당 시간 동안 변경된 사항을 종료 후 다시 시작할 때까지 인식하지 못합니다.
이러한 변경 사항을 감지하는 방법이 있습니까? 아니면이 방법으로 작동하도록 설계 되었습니까?
샘플 내가 사용하고 코드 -있는 viewDidLoad에서
- 앱이 활성화되면
CFErrorRef error = NULL;
addressBook = ABAddressBookCreateWithOptions(NULL, &error);
ABAddressBookRegisterExternalChangeCallback(addressBook,addressBookChanged,(__bridge void *)(self));
그리고 콜백
void addressBookChanged(ABAddressBookRef reference, CFDictionaryRef dictionary, void *context) {
NSLog(@"There was a change in the addressbook");
나는 이것에 대해 강력한 브레인 스토밍을했다. 크기를 저장하면 작동하지 않습니다. +1과 -1이면 어떨까요? 크기 변경은 0이지만 연락처가 변경됩니다. 내가 처리하는 방식은 핵심 데이터를 사용하는 것이다. 동기화 된/사용 된 모든 연락처를 coredata 모델에 저장하고, 각 연락처에는 ID가 있으며, 그러면 ABAddressBook에있는 것과 비교할 수 있습니다. – VaibhavAggarwal
그래, 그게 더 합리적이다 -하지만 주소록 파일의 실제 크기를 측정 할 수는 없지만 연락처의 수는 훨씬 적다. 비록 이론적으로 불완전 할지라도 생각할 수있는 모든 상황에 대해 정확한 변화 측정을 할 수 있습니다. – Karoh
다시 근본적인 문제는 크기에 대해 확신 할 수 없다는 것입니다. 같은 수의 바이트를 제거하고 쓸 수 있습니다. 각 연락처를 엔티티라고 생각하면 모든 엔티티의 모든 필드에 차이를 찾을 수 있어야합니다. 이전 버전의 데이터를 비교할 어딘가에 저장했다면 그렇게 할 수 있습니다. – VaibhavAggarwal