ContactsChangeNotifier
您的iOS应用之外有哪位联系人的信息发生了变化?更优秀的CNContactStoreDidChange
通知:得到真实的变化,而不是噪音。
为什么
遗憾的是,联系人变化的API一团糟
- 接收到的
CNContactStoreDidChange
通知是为了自家的代码变更,并不仅限于应用之外。🤷 - 它包含未记录的
userInfo
字段。🙈 - 为了获取实际的变化,您需要使用一个连Swift都无法调用的Objective-C API。😱
- 该API很容易出错,并且需要维护一个晦涩的状态,或者接收完整的变化历史记录。🧨
🧟♂️
这是时间遗忘的API。🧟♂️
ContactsChangeNotifier功能
- 仅通知您应用之外的变化。
🎯 - 获取通知中包含的变化列表。
🎁 - 仅获取自上次通知以来的变化,而不是完整的历史记录。
✨ - 无需Objective-C。
💥
使用方法
- 获取用户联系人访问权限(见 文档)。
- 保持一个
ContactsChangeNotifier
实例 - 它将观察所有联系人变化,但仅发布来自您应用程序外部的变化。 - 观察
ContactsChangeNotifier.didChangeNotification
通知。 - 在通知的
contactsChangeEvents
中查看更改事件。
// 2. Keep a ContactsChangeNotifier instance
let contactsChangeNotifier = try! ContactsChangeNotifier(
store: myCNContactStore,
fetchRequest: .fetchRequest(additionalContactKeyDescriptors: myCNKeyDescriptors)
)
// 3. Observe ContactsChangeNotifier.didChangeNotification notification
let observation = NotificationCenter.default.addObserver(
forName: ContactsChangeNotifier.didChangeNotification,
object: nil,
queue: nil
) { notification in
// 4. See change events in the notification's contactsChangeEvents
for event in notification.contactsChangeEvents ?? [] {
switch event {
case let addEvent as CNChangeHistoryAddContactEvent:
print(addEvent.contact)
case let updateEvent as CNChangeHistoryUpdateContactEvent:
print(updateEvent.contact)
case let deleteEvent as CNChangeHistoryDeleteContactEvent:
print(deleteEvent.contactIdentifier)
default:
// group event
break
}
}
}
安装
CocoaPods
pod 'ContactsChangeNotifier'
Swift 包管理器
dependencies: [
.package(url: "https://github.com/yonat/ContactsChangeNotifier", from: "1.0.4")
]