iOS 13 中新增了一系列与历史相关的类,例如 CNChangeHistoryEvent 和 CNChangeHistoryFetchRequest。没有文档,并且在我能找到的任何 WWDC 2019 视频中都没有提到它们。它们有什么用,我该如何使用它们?
问问题
466 次
1 回答
5
API 应该以您可以将“令牌”传递给更改历史请求的方式运行,它会为您提供自该令牌以来添加/删除/更新的联系人(或组)。
到目前为止,我只能“运行”历史获取请求,如下所示:
CNChangeHistoryFetchRequest *fetchHistory = [[CNChangeHistoryFetchRequest alloc] init];
fetchHistory.startingToken = [[NSUserDefaults standardUserDefaults] dataForKey:@"CNContactChangeHistoryToken"];
NSError *error = nil;
CNContactStore *store = [[CNContactStore alloc] init];
CNFetchResult *fetchResult = [store enumeratorForChangeHistoryFetchRequest:fetchHistory error:&error];
NSEnumerator *enumerator = [fetchResult value];
id object;
while ((object = [enumerator nextObject])) {
// do something with object
NSLog(@"change history enumerator object = %@", object);
CNChangeHistoryEvent *historyEvent = (CNChangeHistoryEvent *) object;
if ([historyEvent isKindOfClass:[CNChangeHistoryDropEverythingEvent class]]) {
NSLog(@"change history - DROP EVERYTHING!");
[historyEvent acceptEventVisitor: self];
} else {
if ([historyEvent isKindOfClass:[CNChangeHistoryAddContactEvent class]]) {
CNChangeHistoryAddContactEvent *addContactEvent = (CNChangeHistoryAddContactEvent *) object;
NSLog(@"change history - AddContact event container %@ - %@", addContactEvent.containerIdentifier, addContactEvent.contact);
} else if ([historyEvent isKindOfClass:[CNChangeHistoryUpdateContactEvent class]]) {
CNChangeHistoryUpdateContactEvent *updateContactEvent = (CNChangeHistoryUpdateContactEvent *) object;
NSLog(@"change history - UpdateContact event - %@", updateContactEvent.contact);
} else if ([historyEvent isKindOfClass:[CNChangeHistoryDeleteContactEvent class]]) {
CNChangeHistoryDeleteContactEvent *deleteContactEvent = (CNChangeHistoryDeleteContactEvent *) object;
NSLog(@"change history - DeleteContact event - %@", deleteContactEvent.contactIdentifier);
}
}
}
枚举运行,它始终是“CNChangeHistoryDropEverythingEvent”事件,然后是整个联系人列表的“添加联系人”和“添加组”事件。这是因为我找不到在任何地方获取当前令牌的方法。'fetchResult' 对象应该有一个currentHistoryToken
但它总是 nil; CNContactStore 的currentHistoryToken
对象也是如此。所以我不确定从哪里得到它,所以我可以将它传递到startingToken
下一次。
于 2020-04-19T00:43:12.723 回答