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.