【问题标题】:CNContactVCardSerialization.data(with:) always returns nil resultCNContactVCardSerialization.data(with:) 总是返回 nil 结果
【发布时间】:2017-11-02 13:49:05
【问题描述】:

我正在尝试检索所有联系人并将其保存为 VCard 形式(swift 4、XCode 9.0)。但是 CNContactVCardSerialization.data(with:) 总是返回 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 中添加了“隐私 - 联系人使用说明”

【问题讨论】:

  • 嗨@Alex你得到答案了吗?

标签: swift vcf-vcard


【解决方案1】:

也许您需要提供一些特定的键来获取?

UPD:是的,如果你想获取请求并序列化它们,你必须设置键来获取: keysToFetch:@[[CNContactVCardSerialization 描述符ForRequiredKeys]]

【讨论】:

  • 感谢您解决这个问题。完全疯狂,如果需要这样做,为什么不抛出一个告诉我们问题的错误?!你得到的只是 nilError。生气的脸。
【解决方案2】:

改变

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

let request = CNContactFetchRequest(keysToFetch:[CNContactVCardSerialization.descriptorForRequiredKeys()])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 2015-03-05
    • 2014-08-25
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多