Разработка приложений для iPhone swift с использованием WKWebview - Как вызвать локальное уведомление сразу, когда происходит событие javascript - PullRequest
0 голосов
/ 18 декабря 2018

Я пишу приложение для iPhone в кратчайшие сроки, используя WKWebView, который загружает веб-страницу, и мне нужно вызвать локальное уведомление, как только конкретный javascript даже происходит (как только я вижу это изображение «знак опасности» на странице, которая выскакиваетчерез JavaScript).В настоящее время я могу «запланировать» локальное уведомление, как только вижу это событие javascript (см. Код ниже), но мне нужно запускать локальное уведомление сразу после события javascript, всякий раз, когда это происходит.В настоящее время я могу только запланировать повторяющееся локальное уведомление.

Я не делаю push-уведомлений, потому что приложение - это просто основной браузер, который указывает на веб-сайт, на котором есть события javascript, поэтому в основном я хочу приложениечтобы отразить уведомление, которое происходит на загруженной веб-странице.

Вот мой быстрый код, использующий WKWebView (простите за комментарии. Я играл с этим некоторое время):

Класс ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {var webView: WKWebView!

override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    let contentController = WKUserContentController()




    let js: String = " var parentNodes = document.getElementsByClassName('badge badge-danger'); var text; text = 'Nodename: ' + parentNodes[0].nodeName + ' Classname: ' +  parentNodes[0].className + ' ' + parentNodes[0].textContent + ' \\n';  window.webkit.messageHandlers.callbackHandler.postMessage(text); "



    let userScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
    contentController.removeAllUserScripts()
    contentController.addUserScript(userScript)
    // Add ScriptMessageHandler
    contentController.add(
        self,
        name: "callbackHandler"
    )

    webConfiguration.userContentController = contentController

    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self

    webView.navigationDelegate = self
    webView.allowsBackForwardNavigationGestures = true



    view = webView

    let myURL = URL(string: "https://websiteurl.com/dev")
    let myRequest = URLRequest(url: myURL!)
    webView.load(myRequest)




}

override func viewDidLoad() {
    super.viewDidLoad()

   //... 


}

// Implement `WKScriptMessageHandler`,handle message which been sent by JavaScript
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    //if(message.name == "callbackHandler") {
    let messageBody = "\(message.body)"


    if #available(iOS 10, *)
    {

        //UIApplication.shared.applicationIconBadgeNumber = 0
        //let center = UNUserNotificationCenter.current()
        //center.removeAllDeliveredNotifications() // To remove all delivered notifications
        //center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.*/

        if messageBody.contains("badge badge-danger")
        {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: { (didAllow, error) in})

            let content = UNMutableNotificationContent()

            content.title = "You have a new notification!"
            //content.badge = 1
            content.body = "new notification..."



            let date = Date()

            var triggerNow = Calendar.current.dateComponents([.hour,.minute,.second], from:date)

            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

            print(trigger.nextTriggerDate())

            let request = UNNotificationRequest(identifier: content.title, content: content, trigger: trigger)



            UNUserNotificationCenter.current().add(request, withCompletionHandler: {(error) in
                print(error)
            })

            print("JavaScript message: TEST \(message.body)")
        }

    }





}

}
...