如何在iOS WKWebView 应用程序中下载.vcf 文件以将其直接保存到iPhone 的通讯录中?
How to download a .vcf file in iOS WKWebView app to save it into iPhone's contacts directly?
我已经将 .vcf
文件保存在我的本地服务器 (node.js)
并且 运行 我的 iPhone 上的 WKWebView
作为 [=21] =] 申请。如何从 WKWebView
应用程序将 .vcf
文件下载到我的 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)")
}
}
}
这里如果不是nil
可以用newContact.imageData = contact.imageData
保存图片。
我没有在示例中说明所有的联系方式属性,你可以随意使用。
我已经将 .vcf
文件保存在我的本地服务器 (node.js)
并且 运行 我的 iPhone 上的 WKWebView
作为 [=21] =] 申请。如何从 WKWebView
应用程序将 .vcf
文件下载到我的 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)")
}
}
}
这里如果不是nil
可以用newContact.imageData = contact.imageData
保存图片。
我没有在示例中说明所有的联系方式属性,你可以随意使用。