1

I'm trying to share a vcf file using UIActivityViewController. It shares the file with all other options except mail. It just opens the mail composer without any attachment. Here's my code:

guard let directoryURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {
        return
        }


        var filename = NSUUID().uuidString



        if let fullname = CNContactFormatter().string(from: contact) {
            filename = fullname.components(separatedBy: " ").joined(separator: " ")
        }

        let fileURL = directoryURL
        .appendingPathComponent(filename)
        .appendingPathExtension("vcf")

        do{
            let data = try CNContactVCardSerialization.data(with: [contact])

            print("filename: \(filename)")
            print("contact: \(String(describing: String(data: data, encoding: String.Encoding.utf8)))")

            try data.write(to: fileURL, options: [.atomicWrite])
        }
        catch{
            print(error.localizedDescription)
        }

        let activityViewController = UIActivityViewController(
            activityItems: [fileURL],
        applicationActivities: nil
        )

        present(activityViewController, animated: true, completion: nil)

I want to attach this contact as a vcf file in mail app when user selects mail option for sharing.

Suhail
  • 324
  • 1
  • 15

1 Answers1

0

Use mimeType @"text/x-vcard" for a vcf file in addAttachmentData:mimeType:fileName of MFMailComposeViewController

Here is draft code using your's i have tested.

class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        let contactStore = CNContactStore()
        var contacts = [CNContact]()
        let keys = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactVCardSerialization.descriptorForRequiredKeys()]
        let request = CNContactFetchRequest(keysToFetch: keys)

        do {
            try contactStore.enumerateContacts(with: request) {
                (contact, stop) in
                // Array containing all unified contacts from everywhere
                contacts.append(contact)
            }
            self.shareContact(contact: contacts.first!)

        }
        catch {
            print("unable to fetch contacts")
        }


}


    func shareContact(contact:CNContact) {

        guard let directoryURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {
        return
        }

        var filename = NSUUID().uuidString

        if let fullname = CNContactFormatter().string(from: contact) {
                 filename = fullname.components(separatedBy: " ").joined(separator: " ")
             }

             let fileURL = directoryURL
             .appendingPathComponent(filename)
             .appendingPathExtension("vcf")

             do{
                 let data = try CNContactVCardSerialization.data(with: [contact])

                 print("filename: \(filename)")
                 print("contact: \(String(describing: String(data: data, encoding: String.Encoding.utf8)))")

                print(fileURL)
                try data.write(to: fileURL, options: [.atomicWrite])
             }
             catch{
                 print(error.localizedDescription)
             }

            Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (t) in

            self.showActivityController(fileURL: fileURL)
            t.invalidate()
        }

    }
    func showActivityController (fileURL:URL) {


        let activityViewController = UIActivityViewController(
            activityItems: [fileURL],
        applicationActivities: nil
        )

        present(activityViewController, animated: true, completion: nil)
    }

}
Muhammad Afzal
  • 201
  • 1
  • 9