Я пишу приложение для 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)")
}
}
}
}