You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

176 lines
6.1 KiB

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<String,Any>) {
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<String, Any> {
let subscribeMessage = SubscribeMessage(dict: jsonObjDict)
subscribeMessages.append(subscribeMessage)
} else if let jsonArr = jsObj as? [Dictionary<String, Any>] {
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)
}

Powered by TurnKey Linux.