首页 > 解决方案 > 如何在 iOS WKWebView 应用程序中下载 .vcf 文件以将其直接保存到 iPhone 的联系人中?

问题描述

我已经将.vcf文件保存在本地服务器(node.js)上,并WKWebView在我的 iPhone 上将其作为 iOS 应用程序运行。如何将.vcf文件从WKWebView应用程序下载到 iPhone 的通讯录?当我尝试在实际浏览器上下载文件时,它可以工作,但在 iOS 应用程序上不起作用WKWebView。也许,是否有类似 iOS 的下载监听器,类似于 android 的下载监听器?任何帮助将不胜感激。坚持了好久!!万分感谢!

标签: iosnode.jswkwebview

解决方案


第 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

我没有在例子中说明所有联系的属性,但是你可以随意使用。


推荐阅读