mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
id/video calls prototype (#570)
* initial UI framework * limited javascrtipt interaction * run some js * try to resolve permissions issues * some initial RTC javascript * approaching a workable js file * js fixes * tidy up js * add some ui to web call * fixes * ready to test * typo * refactor for readability * tidy up before adding encryption * add transform to video streams * tidy a little, audio encoding works, video fails * minor changes * use variables consistently * e2ee video calls git push * include IV in outgoing message, decrypt fails when trying to read back * add different prefix retention for differing frame types * e2ee video calls with iv passed in band * enforce use of VP8 encoding * allow plaintext chunk only for video frames * tidy up kotlin. Android <> browser tested * minor ios changes * capture js logs in xcode * typo * linting Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// CallView.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by Ian Davies on 29/04/2022.
|
||||
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import WebKit
|
||||
|
||||
struct WebView: UIViewRepresentable {
|
||||
class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
|
||||
var webView: WKWebView!
|
||||
|
||||
|
||||
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
|
||||
webView.allowsBackForwardNavigationGestures = false
|
||||
self.webView = webView
|
||||
}
|
||||
|
||||
// receive message from wkwebview
|
||||
func userContentController(
|
||||
_ userContentController: WKUserContentController,
|
||||
didReceive message: WKScriptMessage
|
||||
) {
|
||||
print(message.body)
|
||||
// let date = Date()
|
||||
// DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||
// self.messageToWebview(msg: "hello, I got your messsage: \(message.body) at \(date)")
|
||||
// }
|
||||
}
|
||||
|
||||
func messageToWebview(msg: String) {
|
||||
self.webView?.evaluateJavaScript("webkit.messageHandlers.bridge.onMessage('\(msg)')")
|
||||
}
|
||||
}
|
||||
|
||||
func makeCoordinator() -> Coordinator {
|
||||
return Coordinator()
|
||||
}
|
||||
|
||||
func makeUIView(context: Context) -> WKWebView {
|
||||
let coordinator = makeCoordinator()
|
||||
let userContentController = WKUserContentController()
|
||||
userContentController.add(coordinator, name: "bridge")
|
||||
|
||||
let configuration = WKWebViewConfiguration()
|
||||
configuration.userContentController = userContentController
|
||||
configuration.mediaTypesRequiringUserActionForPlayback = []
|
||||
configuration.allowsInlineMediaPlayback = true
|
||||
|
||||
// Enable us to capture calls to console.log in the xcode logs
|
||||
// Print actually happens on line 29
|
||||
let source = "console.log = (msg) => webkit.messageHandlers.logHandler.postMessage(msg)"
|
||||
let script = WKUserScript(source: source, injectionTime: .atDocumentStart, forMainFrameOnly: false)
|
||||
configuration.userContentController.addUserScript(script)
|
||||
configuration.userContentController.add(coordinator, name: "logHandler")
|
||||
|
||||
let _wkwebview = WKWebView(frame: .zero, configuration: configuration)
|
||||
_wkwebview.navigationDelegate = coordinator
|
||||
|
||||
return _wkwebview
|
||||
}
|
||||
|
||||
func updateUIView(_ webView: WKWebView, context: Context) {
|
||||
guard let path: String = Bundle.main.path(forResource: "call", ofType: "html", inDirectory: "www") else {
|
||||
print("page not found")
|
||||
return
|
||||
}
|
||||
let localHTMLUrl = URL(fileURLWithPath: path, isDirectory: false)
|
||||
webView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct CallView: View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
WebView()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
struct CallView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
CallView()
|
||||
}
|
||||
}
|
||||
@@ -143,7 +143,12 @@ struct SettingsView: View {
|
||||
notificationsToggle(token)
|
||||
}
|
||||
}
|
||||
Text("v\(appVersion ?? "?") (\(appBuild ?? "?"))")
|
||||
NavigationLink {
|
||||
CallView()
|
||||
.frame(maxHeight: .infinity, alignment: .top)
|
||||
} label: {
|
||||
Text("v\(appVersion ?? "?") (\(appBuild ?? "?"))")
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("Your settings")
|
||||
|
||||
Reference in New Issue
Block a user