I'm trying to think about a way to share contact using UIActivityViewController
(or using SMS) from one device to another.
So far I've been looking and I've no idea how can I share contacts between devices using my app.
Any ideas?
After searching for months, I have finally discovered the way to achieve this.
You can use this code to share a single CNContact in a UIActivityViewController:
let contact: CNContact = /* your contact here */
let fileManager = NSFileManager.defaultManager()
let cacheDirectory = try! fileManager.URLForDirectory(NSSearchPathDirectory.CachesDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: true)
let fileLocation = cacheDirectory.URLByAppendingPathComponent("\(CNContactFormatter().stringFromContact(contact)!).vcf")
let contactData = try! CNContactVCardSerialization.dataWithContacts([contact])
contactData.writeToFile(fileLocation.path!, atomically: true)
let activityVC = UIActivityViewController(activityItems: [fileLocation], applicationActivities: nil)
presentViewController(activityVC, animated: true, completion: nil)
This code converts the contact into its NSData representation, saves it to the app's cache folder, and shares the file as an activity item.
If you want to share multiple contacts, you can pass multiple files in this way.
let contact: CNContact = /* your contact here */
let fileManager = FileManager.default
let cacheDirectory = try! fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileLocation = cacheDirectory.appendingPathComponent("\(CNContactFormatter().string(from: contact)!).vcf")
let contactData = try! CNContactVCardSerialization.data(with: [contact])
do {
try contactData.write(to: fileLocation.asURL(), options: .atomicWrite)
} catch {
...
}
let activityVC = UIActivityViewController(activityItems: [fileLocation], applicationActivities: nil)
present(activityVC, animated: true, completion: nil)
Swift 3.0:
let cacheDirectory = try! FileManager.default.url(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: true)
let fileLocation = cacheDirectory.appendingPathComponent("\(CNContactFormatter().string(from: contact)!).vcf")
let contactData = try! CNContactVCardSerialization.data(with: [contact])
do {
_ = try contactData.write(to: fileLocation, options: .atomic)
} catch let error {
print(error)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With