如何在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保存图片。

我没有在示例中说明所有的联系方式属性,你可以随意使用。