如何使用 CNContactStoreDidChangeNotification 获取 updated/added/deleted 联系人
How to Get updated/added/deleted contact using CNContactStoreDidChangeNotification
我使用通讯录联系人制作了应用程序。
问题:-
我 update/add/delete 从通讯录联系然后回到我的应用程序。
我的应用程序 applicationDidBecomeActive 主动编写以下代码:-
NotificationCenter.default.addObserver(
self,
selector: #selector(self.addressBookDidChange),
name: NSNotification.Name.CNContactStoreDidChange,
object: nil)
多次调用 addressBookDidChange 方法后 App UI 冻结。
我也尝试在后台加载联系人,但应用程序随机崩溃。
1) 联系数组声明:-
public var GlobalContactArray = [ContactEntry]()
2) 在后台加载联系人:-
DispatchQueue.main.async
{
PKHUD.sharedHUD.contentView = PKHUDProgressView()
PKHUD.sharedHUD.show()
}
DispatchQueue.global(qos: .background).async
{
self.requestAccessToContacts
{ (success) in
if success
{
self.retrieveContacts({ (success, contacts ) in
if success && (contacts?.count)! > 0
{
self.GlobalContactArray = contacts!
for arrcontact in contacts!
{
self.GetStoreConatcts(arrcontact)
}
}
})
}
}
}
3) retrieveContacts 方法:-
self.GlobalContactArray.removeAll()
do
{
let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactImageDataAvailableKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor])
try contactStore.enumerateContacts(with: contactsFetchRequest, usingBlock:
{
(cnContact, error) in
if let contact = ContactEntry(cnContact: cnContact)
{
if self.GlobalContactArray.contains(contact)
{
}
else
{
self.GlobalContactArray.append(contact)
}
}
})
if self.GlobalContactArray.count == 0
{
}
else
{
if Constants.isLogin == "1"
{
DispatchQueue.main.async
{
NotificationCenter.default.post(name: Notification.Name("LoadContactList"), object: nil)
}
}
else
{
UserDefaults.standard.set(true, forKey: "ContactViewDisapper")
UserDefaults.standard.synchronize()
}
}
completion(true, self.GlobalContactArray)
}
catch
{
completion(false, nil )
}
4) 完成此方法后 update/add 使用核心在本地 Db 中联系 Database.For add/update 本地 Db 方法名称为“self.GetStoreConatcts( arrcontact)”。在此过程中,一个接一个 contact.Using 此联系人在数据库中检查是否可用,然后更新联系人,如果不可用,则添加联系人。
我按照上述所有步骤也联系了 update/add/delete 但应用程序随机崩溃。
所以谁有关于如何在后台加载方法的解决方案,请帮助我。
提前致谢。
尝试使用 SwiftyContacts Cocoapods 库。
https://cocoapods.org/pods/SwiftyContacts
在后台线程上获取联系人
fetchContactsOnBackgroundThread(completionHandler: { (result) in
switch result{
case .Success(response: let contacts):
// Do your thing here with [CNContacts] array
break
case .Error(error: let error):
print(error)
break
}
})
添加联系人
let contact : CNMutableContact = CNMutableContact()
contact.givenName = "Satish"
// OR Use contact.mutableCopy() For Any CNContact
addContact(Contact: contact) { (result) in
switch result{
case .Success(response: let bool):
if bool{
print("Contact Sucessfully Added")
}
break
case .Error(error: let error):
print(error.localizedDescription)
break
}
}
删除联系人
// Use contact.mutableCopy() To convert CNContact to CNMutableContact
deleteContact(Contact: contact) { (result) in
switch result{
case .Success(response: let bool):
if bool{
print("Contact Sucessfully Deleted")
}
break
case .Error(error: let error):
print(error.localizedDescription)
break
}
}
我使用通讯录联系人制作了应用程序。
问题:- 我 update/add/delete 从通讯录联系然后回到我的应用程序。
我的应用程序 applicationDidBecomeActive 主动编写以下代码:-
NotificationCenter.default.addObserver(
self,
selector: #selector(self.addressBookDidChange),
name: NSNotification.Name.CNContactStoreDidChange,
object: nil)
多次调用 addressBookDidChange 方法后 App UI 冻结。 我也尝试在后台加载联系人,但应用程序随机崩溃。
1) 联系数组声明:-
public var GlobalContactArray = [ContactEntry]()
2) 在后台加载联系人:-
DispatchQueue.main.async
{
PKHUD.sharedHUD.contentView = PKHUDProgressView()
PKHUD.sharedHUD.show()
}
DispatchQueue.global(qos: .background).async
{
self.requestAccessToContacts
{ (success) in
if success
{
self.retrieveContacts({ (success, contacts ) in
if success && (contacts?.count)! > 0
{
self.GlobalContactArray = contacts!
for arrcontact in contacts!
{
self.GetStoreConatcts(arrcontact)
}
}
})
}
}
}
3) retrieveContacts 方法:-
self.GlobalContactArray.removeAll()
do
{
let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactImageDataAvailableKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor])
try contactStore.enumerateContacts(with: contactsFetchRequest, usingBlock:
{
(cnContact, error) in
if let contact = ContactEntry(cnContact: cnContact)
{
if self.GlobalContactArray.contains(contact)
{
}
else
{
self.GlobalContactArray.append(contact)
}
}
})
if self.GlobalContactArray.count == 0
{
}
else
{
if Constants.isLogin == "1"
{
DispatchQueue.main.async
{
NotificationCenter.default.post(name: Notification.Name("LoadContactList"), object: nil)
}
}
else
{
UserDefaults.standard.set(true, forKey: "ContactViewDisapper")
UserDefaults.standard.synchronize()
}
}
completion(true, self.GlobalContactArray)
}
catch
{
completion(false, nil )
}
4) 完成此方法后 update/add 使用核心在本地 Db 中联系 Database.For add/update 本地 Db 方法名称为“self.GetStoreConatcts( arrcontact)”。在此过程中,一个接一个 contact.Using 此联系人在数据库中检查是否可用,然后更新联系人,如果不可用,则添加联系人。
我按照上述所有步骤也联系了 update/add/delete 但应用程序随机崩溃。
所以谁有关于如何在后台加载方法的解决方案,请帮助我。
提前致谢。
尝试使用 SwiftyContacts Cocoapods 库。
https://cocoapods.org/pods/SwiftyContacts
在后台线程上获取联系人
fetchContactsOnBackgroundThread(completionHandler: { (result) in
switch result{
case .Success(response: let contacts):
// Do your thing here with [CNContacts] array
break
case .Error(error: let error):
print(error)
break
}
})
添加联系人
let contact : CNMutableContact = CNMutableContact()
contact.givenName = "Satish"
// OR Use contact.mutableCopy() For Any CNContact
addContact(Contact: contact) { (result) in
switch result{
case .Success(response: let bool):
if bool{
print("Contact Sucessfully Added")
}
break
case .Error(error: let error):
print(error.localizedDescription)
break
}
}
删除联系人
// Use contact.mutableCopy() To convert CNContact to CNMutableContact
deleteContact(Contact: contact) { (result) in
switch result{
case .Success(response: let bool):
if bool{
print("Contact Sucessfully Deleted")
}
break
case .Error(error: let error):
print(error.localizedDescription)
break
}
}