Как скачать файл .vcf в приложении iOS WKWebView, чтобы сохранить его в контактах iPhone напрямую? - PullRequest
0 голосов
/ 26 июня 2019

У меня уже есть файл .vcf, сохраненный на моем локальном сервере (node.js), и я запускаю WKWebView на моем iPhone в качестве приложения для iOS.Как я могу загрузить файл .vcf из приложения WKWebView в контакты моего iPhone?Когда я пытаюсь загрузить файл в реальном браузере, он работает, но не работает в приложении iOS WKWebView.Может быть, есть что-то вроде слушателя загрузки для iOS, похожего на тот, что для Android?Любая помощь будет высоко оценена.Застрял на нем довольно долго!Спасибо за тонну!

1 Ответ

0 голосов
/ 27 июня 2019

Часть 1. Получение URL-адреса файла VCF с веб-сайта

Установите обработчик сообщений сценария на 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,

Я не проиллюстрировал все свойства контакта в качестве примера, но вы можете использовать его по своему усмотрению.

...