ios - 如何在 iOS WKWebView 应用程序中下载 .vcf 文件以将其直接保存到 iPhone 的联系人中?
问题描述
我已经将.vcf
文件保存在本地服务器(node.js)
上,并WKWebView
在我的 iPhone 上将其作为 iOS 应用程序运行。如何将.vcf
文件从WKWebView
应用程序下载到 iPhone 的通讯录?当我尝试在实际浏览器上下载文件时,它可以工作,但在 iOS 应用程序上不起作用WKWebView
。也许,是否有类似 iOS 的下载监听器,类似于 android 的下载监听器?任何帮助将不胜感激。坚持了好久!!万分感谢!
解决方案
第 1 部分:从网站获取 VCF 文件 URL
设置脚本消息处理程序WKWebView
,初始化时使用以下代码WKWebView
:
webView?.configuration.userContentController.add(self, name: "MyHandler")
您必须设置WKScriptMessageHandler
委托。
将以下代码添加到您网站的下载按钮单击事件中:
window.webkit.messageHandlers.MyHandler.postMessage({"message":"Start Download", "vcf_url":"https://www.yourwebsite.com/path/file.cvf"})
didReceiveScriptMessage
当用户单击网站上的下载按钮时将调用。在这里您将收到["message":"Start Download", "vcf_url":"https://www.yourwebsite.com/path/file.cvf"]
对象。
第 2 部分:获取 VCF 文件数据并添加到联系人
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
if let dic = message.body as? [String:String] {
if let url = dic["vcf_url"] {
let fileUrl = URL(fileURLWithPath: url)
do {
let data = try Data(contentsOf: fileUrl)
let contacts = try CNContactVCardSerialization.contacts(with: data)
let contactStore = CNContactStore.init()
contactStore.requestAccess(for: CNEntityType.contacts, completionHandler: { (granted, accessError) -> Void in
if granted {
let saveRequest = CNSaveRequest()
for contact in contacts {
let newContact = CNMutableContact()
newContact.givenName = contact.givenName
newContact.familyName = contact.familyName
newContact.phoneNumbers = contact.phoneNumbers
saveRequest.add(newContact, toContainerWithIdentifier: "")
do {
try contactStore.execute(saveRequest)
// Contact saved successfully
} catch let error {
print("Error - \(error.localizedDescription)")
}
}
}
})
} catch let error {
print("Error - \(error.localizedDescription)")
}
}
}
在这里,newContact.imageData = contact.imageData
如果不是,可以用来保存图像nil
。
我没有在例子中说明所有联系的属性,但是你可以随意使用。
推荐阅读
- stripe-payments - 如何使用保存的信用卡支付 Stripe?
- powershell - Powershell - 基于布尔值触发或抑制 Where-Object 子句
- ios - setAlternateIconName() 不更改通知图标和设置图标
- python - 试图让机器人在其活动中显示成员数
- java - 使用 Spring 云值时 EmbeddedWebApplicationContext 的 ClassNotFoundException
- apache-spark - 如何使用 pyspark 在 struct 字段中添加可选列
- java - 使用 Log4J appender 在 AWS Cloudwatch 中存储应用程序日志
- azure - Azure Terraform | 远程执行堡垒主机虚拟机
- cc - “mcmodel”的 Craycc 等效项
- python - 当youtube播放列表有中文名称时,python pytube播放列表为空