如何使用 CNContactStoreDidChangeNotification 获取新添加的联系人标识符?

2023-11-21

我想要获取所有新添加的联系人标识符。

这是我的代码:

-(void)viewWillAppear:(BOOL)animated {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addressBookDidChange:) name:CNContactStoreDidChangeNotification object:nil];
}

-(void)addressBookDidChange:(NSNotification*)notification
{
    //Handle event here...
    NSDictionary *dict = notification.userInfo;
    NSLog(@"Notification - %@",dict);

}

CNNotificationSaveIdentifiersKey 数组始终为空。

 Notification - {
    CNNotificationOriginationExternally = 1;
    CNNotificationSaveIdentifiersKey =     (
    );
    CNNotificationSourcesKey =     (
    );
}

iOS 13 为此添加了一个 API,但遗憾的是它只能从 Objective-C 代码访问:enumeratorForChangeHistoryFetchRequest:错误:

要从 Swift 使用它,您需要创建一个包装器:

CNContactStore+ChangeHistory.h

#import <Contacts/Contacts.h>

NS_ASSUME_NONNULL_BEGIN
@interface CNContactStore (ChangeHistory)
- (CNFetchResult<NSEnumerator<CNChangeHistoryEvent *> *> *)swiftEnumeratorForChangeHistoryFetchRequest:(CNChangeHistoryFetchRequest *)request
                                                                                                 error:(NSError * _Nullable *)error;
@end

CNContactStore+ChangeHistory.m

#import "CNContactStore+ChangeHistory.h"

@implementation CNContactStore (ChangeHistory)
- (CNFetchResult<NSEnumerator<CNChangeHistoryEvent *> *> *)swiftEnumeratorForChangeHistoryFetchRequest:(CNChangeHistoryFetchRequest *)request
                                                                                                 error:(NSError * _Nullable *)error
{
    return [self enumeratorForChangeHistoryFetchRequest:request error:error];
}
@end

为了确保您只获得新的更改(而不是完整的更改历史记录),您需要保存CNContactStore().currentHistoryToken当你获得联系方式时。然后稍后将这个令牌传递给CNChangeHistoryFetchRequest:

var myToken = myContactStore.currentHistoryToken

// ... then later, after you get CNContactStoreDidChange notification:
let request = CNChangeHistoryFetchRequest()
request.startingToken = myToken
var error: NSError?
let fetchResult = myContactStore.swiftEnumerator(for: fetchRequest, error: &error)
myToken = myContactStore.currentHistoryToken // for next time

for event in fetchResult.value {
    (event as! CNChangeHistoryEvent).accept(myCNChangeHistoryEventVisitor)
    // or alternatively:
    let newContact = (event as? CNChangeHistoryAddContactEvent).contact
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CNContactStoreDidChangeNotification 获取新添加的联系人标识符? 的相关文章

随机推荐