gpt4 book ai didi

ios - 联系人框架等同于 ABAddressBook.ABAddressBookRegisterExternalChangeCallback

转载 作者:IT王子 更新时间:2023-10-29 05:10:24 25 4
gpt4 key购买 nike

我正在将一个应用程序从已弃用的地址簿框架迁移到新的联系人框架。该应用程序利用 ABAddressBookRegisterExternalChangeCallback在另一个应用程序更改联系人时收到通知。

我无法在联系人框架中找到等效功能。 Apple 文档说使用默认通知中心 the CNContactStoreDidChangeNotification notification :

The notification posted when changes occur in another CNContactStore.

听取 Apple 的建议,我的代码如下所示:

NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "contactsChanged:",
name: CNContactStoreDidChangeNotification,
object: nil)

但是,我发现这种方法有两个问题:

  1. 我会收到所有更改的通知,包括我自己的应用程序所做的更改。
  2. 通知是虚假的 - 我会收到很多关于一次更改的通知。

如果我在我的应用程序中进行更改时记录通知的调试描述,我会得到如下内容:

NSConcreteNotification 0x7d3370e0 {name = CNContactStoreDidChangeNotification; userInfo = {
CNNotificationOriginationExternally = 1;
CNNotificationSourcesKey = (
);
}}

如果更改是在外部进行的:

NSConcreteNotification 0x7bf7a690 {name = CNContactStoreDidChangeNotification; userInfo = {
CNNotificationOriginationExternally = 1;
CNNotificationSourcesKey = (
);
}}

如您所见,没有明显的区别。

谁能告诉我如何从 Contacts Framework 获得与从 ABAddressBookRegisterExternalChangeCallback 获得相同的行为?

最佳答案

首先,我推荐filing a bug with Apple关于缺乏识别 API 内部和外部变化的方法。

作为一种可能的解决方法,您可以查看是否在进行更改之前取消注册您的观察者并在之后立即重新注册确保您错过所有更改通知并仍然获得所有外部通知:

class ContactsThingy {

var observer: NSObjectProtocol?
let contacts = CNContactStore()

func contactStoreDidChange(notification: NSNotification) {
NSLog("%@", notification)
}

func registerObserver() {
let center = NSNotificationCenter.defaultCenter()
observer = center.addObserverForName(CNContactStoreDidChangeNotification, object: nil, queue: NSOperationQueue.currentQueue(), usingBlock: contactStoreDidChange)
}

func unregisterObserver() {
guard let myObserver = observer else { return }
let center = NSNotificationCenter.defaultCenter()
center.removeObserver(myObserver)
}

func changeContacts(request: CNSaveRequest) {
unregisterObserver() // stop watching for changes
defer { registerObserver() } // start watching again after this change even if error
try! contacts.executeSaveRequest(request)
}
}

关于ios - 联系人框架等同于 ABAddressBook.ABAddressBookRegisterExternalChangeCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36151039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com