代码之家  ›  专栏  ›  技术社区  ›  Amogh Shettigar

ios:我想创建包含我所有联系人的.vcf/vcard。我该怎么做?

  •  1
  • Amogh Shettigar  · 技术社区  · 8 年前

    我想创建一个.vcf文件,与我创建的类似Android应用程序共享。我可以为单个联系人创建.vcf文件,但无法以相同的方式为多个联系人创建。 我已参考此链接以获得帮助,为单个联系人创建vcf文件。

    Create a vcf file to share with different apps

    我想创建一个包含所有联系人的vcf文件。我该怎么做?

    P、 我正在开发swift 2.0。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Amogh Shettigar    7 年前

    我终于找到了办法。

    func createContact() -> [CNContact] {
    
        let contactStore = CNContactStore()
        var contacts = [CNContact]()
    
        let fetchRequest = CNContactFetchRequest(keysToFetch:[CNContactVCardSerialization.descriptorForRequiredKeys()])
    
        do {
            try contactStore.enumerateContactsWithFetchRequest(fetchRequest) {
                (contact123, stop) in
                // Array containing all unified contacts from everywhere
                contacts.append(contact123)}
        }
        catch {
            print("unable to fetch contacts")
        }
    
        return contacts
    
    }
    

    上面的代码将创建一个包含所有详细信息的所有联系人列表。您还可以仅选择要从所有联系人中提取的密钥(这可能会用作搜索的过滤器)。

    然后简单地使用CNContactVCardSerialization创建一个.vcard文件

    func shareContacts(联系人:[CNContact])抛出{

        guard let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first else {
            return
        }
    
        var filename = NSUUID().UUIDString
    
        // Create a human friendly file name if sharing a single contact.
        if let contact = contacts.first where contacts.count == 1 {
    
            if let fullname = CNContactFormatter().stringFromContact(contact) {
                filename = fullname.componentsSeparatedByString(" ").joinWithSeparator("")
            }
        }
    
        let fileURL = directoryURL
            .URLByAppendingPathComponent(filename)
            .URLByAppendingPathExtension("vcf")
    
        let data: NSData?
        do {
            data = try CNContactVCardSerialization.dataWithContacts(contacts)
            print("filename: \(filename)")
            print("contact: \(String(data: data!, encoding: NSUTF8StringEncoding))")
    
            do {
                try data!.writeToURL(fileURL, options: [.AtomicWrite])
            }
            catch {
                print("eeror\(error)")
            }
        }
        catch {
            print("error\(error)")
        }
    
        let activityViewController = UIActivityViewController(
            activityItems: [fileURL],
            applicationActivities: nil
        )
    
        presentViewController(activityViewController, animated: true, completion: {})
    }
    

    上面的代码将为您提供通过邮件、whatsapp等共享的选项。

    希望这能帮助别人。