我在保存请求后直接需要新创建的联系人的标识符。用例:在我的应用程序中,用户创建一个新联系人并为他们提供一些属性(例如姓名,地址......),之后他可以保存联系人。此方案正如预期的那样工作。我的代码如下所示:
func createContact(uiContact: Contact, withImage image:UIImage?, completion: String -> Void)
{
let contactToSave = uiContact.mapToCNContact(CNContact()) as! Cnmutablecontawctlet
if let newImage = image
{
contactToSave.imageData = UIImageJPEGRepresentation(newImage, 1.0)
}
request = CNSaveRequest()
request.addContact(contactToSave, toContainerWithIdentifier: nil)
do
{
try self.contactStore.executeSaveRequest(request)
print("Successfully saved the CNContact")
completion(contactToSave.identifier)
}
catch let error
{
print("CNContact saving faild: \(error)")
completion(nil)
}
}
Contact Object(uiContact)只是CNContact的包装器。 在闭包完成时,我需要返回标识符,但此时我无权访问它们,因为他是在写入过程之后由系统创建的。 一种解决方案可能是使用谓词
获取新保存的CNContactpublic func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact]
但是在我看来这有点不干净,因为这个联系人只能有一个名字而且可能存在多个名字。像创建标识符的回调之类的东西会很好。但事实并非如此。 还有其他方法可以解决这个问题吗?
答案 0 :(得分:1)
这可能有点晚,但万一有人需要这个。
通过使用最新的SDK(iOS 11),我只能通过以下方式获取标识符:
NSError *error = nil;
saveReq = [[CNSaveRequest alloc] init];
[saveReq addContact:cnContact toContainerWithIdentifier:containerIdentifier];
if (![contactStore executeSaveRequest:saveReq error:&error]) {
NSLog(@"Failed to save, error: %@", error.localizedDescription);
}
else
{
if ([cnContact isKeyAvailable:CNContactIdentifierKey]) {
NSLog(@"identifier for new contact is: %@", cnContact.identifier);
// this works for me everytime
} else {
NSLog(@"CNContact identifier still isn't available after saving to address book");
}
}
答案 1 :(得分:0)
迅捷4
这是在创建联系人时获取联系人ID的方法
do {
try store.execute(saveRequest)
if contactToAdd.isKeyAvailable(CNContactIdentifierKey) {
print(contactToAdd.identifier) // here you are getting identifire
}
}
catch {
print(error)
}