gpt4 book ai didi

ios - 如何创建 vCard/vcf 文件以在共享表中使用?

转载 作者:IT王子 更新时间:2023-10-29 05:48:08 24 4
gpt4 key购买 nike

我是 swift 的新手,我发现关于我的问题的方法已被弃用。我正在构建一个目录应用程序,我正在从 API 中提取联系人数据,而不是从手机的地址簿中。

在 iOS 中,如果您转到地址簿,您可以选择一个联系人并选择“共享联系人”,这会显示一个共享表。我想要在我的应用中使用这个确切的功能。

认为我已经弄清楚了共享表,这是我的代码:

    @IBAction func actShare(sender: AnyObject) {

let activityViewController = UIActivityViewController(activityItems: ["text" as NSString], applicationActivities: nil)
presentViewController(activityViewController, animated: true, completion: {})
}

我想将 "text"as NSString 更改为 vCard,因为这是 iOS 从地址簿共享的对象,对吗?假设我是对的,我想从我自己的应用程序的联系人对象创建一个 vCard,以便将其共享到适当的应用程序(电子邮件、短信等)。

我如何在 Swift 中实现这一点?如果我错了,请纠正我并告诉我我需要做什么。谢谢。

编辑:好的,这是我的更改。

@IBAction func actShare(sender: AnyObject) {
do {
var contactData = NSData()
try contactData = CNContactVCardSerialization.dataWithContacts([createContact()])

let activityViewController = UIActivityViewController(activityItems: [contactData as NSData], applicationActivities: nil)
presentViewController(activityViewController, animated: true, completion: {})
} catch {
print("CNContactVCardSerialization cannot save address")
}

func createContact() -> CNMutableContact {
let contactCard = CNMutableContact()
contactCard.givenName = "John"
contactCard.familyName = "Doe"
contactCard.emailAddresses = [
CNLabeledValue(label: CNLabelWork, value: "john.doe@email.com")
]

return contactCard
}

但是,当我单击共享按钮并显示我的共享表时,我选择了我想要共享的应用程序,但它没有按预期添加/附加联系人数据。我该如何实现?

最佳答案

这里的技巧是使用 CNContactVCardSerialization.dataWithContacts 将联系人保存到 VCard (.vcf) 文件,然后将文件 URL 传递给 UIActivityViewController。事件 View Controller 从文件扩展名检测 VCard 格式,并显示支持该格式的应用程序(例如消息、邮件、便签、Airdrop 等)

例子:

@IBAction func buttonTapped(button: UIButton) {

let contact = createContact()

do {
try shareContacts([contact])
}
catch {
// Handle error
}
}

func shareContacts(contacts: [CNContact]) throws {

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 = try CNContactVCardSerialization.dataWithContacts(contacts)

print("filename: \(filename)")
print("contact: \(String(data: data, encoding: NSUTF8StringEncoding))")

try data.writeToURL(fileURL, options: [.AtomicWrite])

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

presentViewController(activityViewController, animated: true, completion: {})
}

func createContact() -> CNContact {

// Creating a mutable object to add to the contact
let contact = CNMutableContact()

contact.imageData = NSData() // The profile picture as a NSData object

contact.givenName = "John"
contact.familyName = "Appleseed"

let homeEmail = CNLabeledValue(label:CNLabelHome, value:"john@example.com")
let workEmail = CNLabeledValue(label:CNLabelWork, value:"j.appleseed@icloud.com")
contact.emailAddresses = [homeEmail, workEmail]

contact.phoneNumbers = [CNLabeledValue(
label:CNLabelPhoneNumberiPhone,
value:CNPhoneNumber(stringValue:"(408) 555-0126"))]

return contact
}

Activity view controller showing apps which support VCard format

VCard contact appearing in Messages app

关于ios - 如何创建 vCard/vcf 文件以在共享表中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38335508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com