После поиска в течение нескольких месяцев я, наконец, нашел способ добиться этого.
Вы можете использовать этот код, чтобы использовать один CNContact в 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)
Этот код преобразует контакт в его представлении NSData, сохраняет его в папку кэш-памяти приложения, и разделяет файл как деятельность пункт.
Если вы хотите разделить несколько контактов, вы можете передать несколько файлов таким образом.
Edit: Swift версия 3,0
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)