Ios UIActivityViewController联系人共享?
我正在考虑一种使用Ios UIActivityViewController联系人共享?,ios,uiactivityviewcontroller,Ios,Uiactivityviewcontroller,我正在考虑一种使用UIActivityViewController(或使用SMS)从一台设备到另一台设备共享联系人的方法 到目前为止,我一直在寻找,我不知道如何在使用我的应用程序的设备之间共享联系人 有什么想法吗?经过几个月的探索,我终于找到了实现这一目标的方法 您可以使用此代码在UIActivityViewController中共享单个CNContact: let contact: CNContact = /* your contact here */ let fileManager = N
UIActivityViewController
(或使用SMS)从一台设备到另一台设备共享联系人的方法
到目前为止,我一直在寻找,我不知道如何在使用我的应用程序的设备之间共享联系人
有什么想法吗?经过几个月的探索,我终于找到了实现这一目标的方法 您可以使用此代码在UIActivityViewController中共享单个CNContact:
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)
guard let
fileUrl = AB_RecordVcardFileURL(record)
else {return}
let activity = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
presentViewController(activity, animated: true, completion: nil)
此代码将联系人转换为其NSData表示形式,将其保存到应用程序的缓存文件夹,并将文件作为活动项共享
如果要共享多个联系人,可以通过这种方式传递多个文件
编辑:Swift 3.0版本
以类似的方式使用旧的ABAddressBook框架也可以轻松实现这一点(制作vCard表示,将其保存到文件,共享URL): 然后将URL传递给活动控制器:
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)
guard let
fileUrl = AB_RecordVcardFileURL(record)
else {return}
let activity = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
presentViewController(activity, 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)
}
版本:Swift 4.2,以避免在联系人没有姓名时崩溃。
如果您的联系人没有姓名字段,并且当您尝试执行CNContactFormatter().string(from:cnContact)时,它将崩溃,因为它将返回nil。所以,为了避免崩溃,请给出一些默认名称,不要强行这样做
let cnContact : CNContact = CNContact()
let fileManager = FileManager.default
do {
let cacheDirectory = try? fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileLocation = cacheDirectory?.appendingPathComponent("\(CNContactFormatter().string(from: cnContact) ?? "Contact")).vcf")
let contactData = try? CNContactVCardSerialization.data(with: [cnContact])
try? contactData?.write(to: (fileLocation?.asURL())!, options: .atomicWrite)
attachedFiles.append(fileLocation!)
} catch let error {
logger.info("share contact failed due to :\(error)")
}