import WebKit import FirebaseMessaging class SubscribeMessage { var topic = "" var eventValue = "" var unsubscribe = false struct Keys { static var TOPIC = "topic" static var UNSUBSCRIBE = "unsubscribe" static var EVENTVALUE = "eventValue" } convenience init(dict: Dictionary) { self.init() if let topic = dict[Keys.TOPIC] as? String { self.topic = topic } if let unsubscribe = dict[Keys.UNSUBSCRIBE] as? Bool { self.unsubscribe = unsubscribe } if let eventValue = dict[Keys.EVENTVALUE] as? String { self.eventValue = eventValue } } } func handleSubscribeTouch(message: WKScriptMessage) { // [START subscribe_topic] let subscribeMessages = parseSubscribeMessage(message: message) if (subscribeMessages.count > 0){ let _message = subscribeMessages[0] if (_message.unsubscribe) { Messaging.messaging().unsubscribe(fromTopic: _message.topic) { error in } } else { Messaging.messaging().subscribe(toTopic: _message.topic) { error in } } } // [END subscribe_topic] } func parseSubscribeMessage(message: WKScriptMessage) -> [SubscribeMessage] { var subscribeMessages = [SubscribeMessage]() if let objStr = message.body as? String { let data: Data = objStr.data(using: .utf8)! do { let jsObj = try JSONSerialization.jsonObject(with: data, options: .init(rawValue: 0)) if let jsonObjDict = jsObj as? Dictionary { let subscribeMessage = SubscribeMessage(dict: jsonObjDict) subscribeMessages.append(subscribeMessage) } else if let jsonArr = jsObj as? [Dictionary] { for jsonObj in jsonArr { let sMessage = SubscribeMessage(dict: jsonObj) subscribeMessages.append(sMessage) } } } catch _ { } } return subscribeMessages } func returnPermissionResult(isGranted: Bool){ DispatchQueue.main.async(execute: { if (isGranted){ Nivesh.webView.evaluateJavaScript("this.dispatchEvent(new CustomEvent('push-permission-request', { detail: 'granted' }))") } else { Nivesh.webView.evaluateJavaScript("this.dispatchEvent(new CustomEvent('push-permission-request', { detail: 'denied' }))") } }) } func returnPermissionState(state: String){ DispatchQueue.main.async(execute: { Nivesh.webView.evaluateJavaScript("this.dispatchEvent(new CustomEvent('push-permission-state', { detail: '\(state)' }))") }) } func handlePushPermission() { UNUserNotificationCenter.current().getNotificationSettings () { settings in switch settings.authorizationStatus { case .notDetermined: let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { (success, error) in if error == nil { if success == true { returnPermissionResult(isGranted: true) DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { returnPermissionResult(isGranted: false) } } else { returnPermissionResult(isGranted: false) } } ) case .denied: returnPermissionResult(isGranted: false) case .authorized, .ephemeral, .provisional: returnPermissionResult(isGranted: true) @unknown default: return; } } } func handlePushState() { UNUserNotificationCenter.current().getNotificationSettings () { settings in switch settings.authorizationStatus { case .notDetermined: returnPermissionState(state: "notDetermined") case .denied: returnPermissionState(state: "denied") case .authorized: returnPermissionState(state: "authorized") case .ephemeral: returnPermissionState(state: "ephemeral") case .provisional: returnPermissionState(state: "provisional") @unknown default: returnPermissionState(state: "unknown") return; } } } func checkViewAndEvaluate(event: String, detail: String) { if (!Nivesh.webView.isHidden && !Nivesh.webView.isLoading ) { DispatchQueue.main.async(execute: { Nivesh.webView.evaluateJavaScript("this.dispatchEvent(new CustomEvent('\(event)', { detail: \(detail) }))") }) } else { DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { checkViewAndEvaluate(event: event, detail: detail) } } } func handleFCMToken(){ DispatchQueue.main.async(execute: { Messaging.messaging().token { token, error in if let error = error { #if DEBUG print("Error fetching FCM registration token: \(error)") #endif checkViewAndEvaluate(event: "push-token", detail: "ERROR GET TOKEN") } else if let token = token { checkViewAndEvaluate(event: "push-token", detail: "'\(token)'") } } }) } func sendPushToWebView(userInfo: [AnyHashable: Any]){ var json = ""; do { let jsonData = try JSONSerialization.data(withJSONObject: userInfo) json = String(data: jsonData, encoding: .utf8)! } catch { #if DEBUG print("ERROR: userInfo parsing problem") #endif return } checkViewAndEvaluate(event: "push-notification", detail: json) }