diff --git a/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift b/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift index b2d8580..d886a3a 100644 --- a/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift +++ b/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift @@ -47,6 +47,33 @@ class ForemMediaManager: NSObject { } } + internal func handle(_ podcast: Podcast) { + switch podcast.action { + case .play: + play(audioUrl: podcast.url, at: podcast.seconds) + case .load: + load(audioUrl: podcast.url) + case .seek: + seek(to: podcast.seconds) + case .rate: + podcastRate = podcast.rate ?? 1 + avPlayer?.rate = podcastRate ?? 1 + case .muted: + avPlayer?.isMuted = podcast.muted ?? false + case .pause: + avPlayer?.pause() + case .terminate: + avPlayer?.pause() + clearObservers() + UIApplication.shared.endReceivingRemoteControlEvents() + case .volume: + podcastVolume = podcast.volume ?? 1 + avPlayer?.rate = podcastVolume ?? 1 + case .metadata: + break + } + } + internal func handlePodcastMessage(_ message: [String: String]) { ensureAudioSessionIsActive() diff --git a/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift b/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift index 3a16ab2..c4ee633 100644 --- a/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift +++ b/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift @@ -17,7 +17,10 @@ extension ForemWebView: WKScriptMessageHandler { didReceive message: WKScriptMessage) { switch message.name { case "podcast": - mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:]) + if let podcast: Podcast = MessageParser().parse(json: message.body) { + mediaManager.handle(podcast) + } +// mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:]) case "video": mediaManager.handleVideoMessage(message.body as? [String: String] ?? [:]) case "imageUpload": @@ -37,7 +40,8 @@ extension ForemWebView: WKScriptMessageHandler { foremWebViewDelegate?.didLogin(userData: foremUser) ensureForemInstance() } - default: () + default: + break } } diff --git a/Sources/ForemWebView/Models/Podcast.swift b/Sources/ForemWebView/Models/Podcast.swift new file mode 100644 index 0000000..1dd2959 --- /dev/null +++ b/Sources/ForemWebView/Models/Podcast.swift @@ -0,0 +1,29 @@ +// +// Podcast.swift +// +// +// Created by Daniel Chick on 10/26/22. +// + +import Foundation + +struct Podcast: Codable { + let action: PodcastAction + let url: String? + let seconds: String? + let rate: Float? + let muted: Bool? + let volume: Float? +} + +enum PodcastAction: String, Codable { + case play + case load + case seek + case rate + case muted + case pause + case terminate + case volume + case metadata +} diff --git a/Sources/ForemWebView/Utils/MessageParser.swift b/Sources/ForemWebView/Utils/MessageParser.swift new file mode 100644 index 0000000..9a25ee0 --- /dev/null +++ b/Sources/ForemWebView/Utils/MessageParser.swift @@ -0,0 +1,46 @@ +// +// MessageParser.swift +// +// +// Created by Daniel Chick on 10/26/22. +// + +import Foundation + +public typealias Json = [String: Any] + +public class MessageParser { + public init () {} + + public func parse(jsonArray: [Json]) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: jsonArray) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + public func parse(json: Json) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + public func parse(json: Any) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + private func parseObject (serializedJson: Data) -> T? { + do { + return try JSONDecoder().decode(T.self, from: serializedJson) + } catch { + return nil + } + } +}