CNContactVCardSerialization.data(带:)总是返回nil结果

时间:2017-11-02 13:49:05

标签: swift vcard

我正在尝试检索所有联系人并以VCard格式保存它们(swift 4,XCode 9.0)。但CNContactVCardSerialization.data(带:)总是返回nil。这是我的代码:

    var contacts = [CNContact]()
    let request = CNContactFetchRequest(keysToFetch:[CNContact.descriptorForAllComparatorKeys()])
    do {
        try contactsStore.enumerateContacts(with: request,  usingBlock:
        { (contact:CNContact, result:UnsafeMutablePointer<ObjCBool>) in
            self.contacts.append(contact)
        })
    }
    catch {
    }

    // at this point all contacts are in the "contacts" array.

    var data = Data()
    do {
        try data = CNContactVCardSerialization.data(with: contacts)
    }
    catch {
        print("some error in contacts:" + String(describing: error));
    }
    print(">>>data:" + String(data.count))

输出:

  2017-11-02 XXX [5224:449081] 
  Exception writing contacts to vCard (data): A property was not 
  requested when contact was fetched.
  2017-11-02 XXX [5224:449362] XPC 
  connection interrupted
  some error in contacts:nilError
  >>>data:0

我重复了下面的问题,但没有用。 How to use method dataWithContacts in CNContactVCardSerialization?

我在info.plist

中添加了“隐私 - 通讯录使用说明”

2 个答案:

答案 0 :(得分:1)

也许您需要提供一些特定的密钥才能获取?

UPD:是的,如果你想获取请求并序列化它们,你必须设置要获取的密钥: keysToFetch:@ [[CNContactVCardSerialization descriptorForRequiredKeys]]

答案 1 :(得分:0)

更改

for node in emplist:
    # iterate through all the nodes again and form a logic add the edges
    for allnodes in emplist:
        if node.getPosition()[0]==allnodes.getPosition()[0]-1 and node.getPosition()[1]==allnodes.getPosition()[1]-1:
            y.addEdge(edge(node,allnodes))
        if node.getPosition()[0]==allnodes.getPosition()[0]-1 and node.getPosition()[1]==allnodes.getPosition()[1]:
            y.addEdge(edge(node,allnodes))

let request = CNContactFetchRequest(keysToFetch:[CNContact.descriptorForAllComparatorKeys()])