diff --git a/vibetype/Info.plist b/vibetype/Info.plist index 996ef8b..ba5fd88 100644 --- a/vibetype/Info.plist +++ b/vibetype/Info.plist @@ -47,9 +47,11 @@ NSCameraUsageDescription - Capture Video by user request + Allow camera access to quickly scan event QR codes and check in NSLocationWhenInUseUsageDescription Track current location by user request + NSUserTrackingUsageDescription + This app would like to track you across apps and websites to provide personalized experiences and analytics UIApplicationSceneManifest diff --git a/vibetype/ViewController.swift b/vibetype/ViewController.swift index 3f1e71f..407d051 100644 --- a/vibetype/ViewController.swift +++ b/vibetype/ViewController.swift @@ -1,5 +1,6 @@ import UIKit import WebKit +import AppTrackingTransparency var webView: WKWebView! = nil @@ -36,9 +37,7 @@ class ViewController: UIViewController, WKNavigationDelegate, UIDocumentInteract initWebView() initToolbarView() loadRootUrl() - NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification , object: nil) - } override func viewDidLayoutSubviews() { @@ -121,25 +120,36 @@ class ViewController: UIViewController, WKNavigationDelegate, UIDocumentInteract webviewView.addSubview(toolbarView) } - @objc func loadRootUrl() { + @objc func loadRootUrl() { vibetype.webView.load(URLRequest(url: SceneDelegate.universalLinkToLaunch ?? SceneDelegate.shortcutLinkToLaunch ?? rootUrl)) } - func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){ - htmlIsLoaded = true - - self.setProgress(1.0, true) - self.animateConnectionProblem(false) - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { - vibetype.webView.isHidden = false - self.loadingView.isHidden = true - - self.setProgress(0.0, false) + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + htmlIsLoaded = true + self.setProgress(1.0, true) + self.animateConnectionProblem(false) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { + vibetype.webView.isHidden = false + self.loadingView.isHidden = true + self.setProgress(0.0, false) + self.overrideUIStyle() + self.handleTrackingPermission() + } +} - self.overrideUIStyle() - } +// Enable this block for local simulator testing to bypass SSL certificate validation. +// (Do NOT use this in production.) +/* +func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, + completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { + completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) + } else { + completionHandler(.performDefaultHandling, nil) } +} +*/ + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { htmlIsLoaded = false; @@ -228,21 +238,58 @@ extension UIColor { } extension ViewController: WKScriptMessageHandler { - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - if message.name == "print" { + func returnTrackingPermissionResult(isAuthorized: Bool) { + let result = isAuthorized ? "authorized" : "denied" + dispatchEventToWebView(name: "tracking-permission-request", data: result) + } + + func returnTrackingPermissionState(state: String) { + dispatchEventToWebView(name: "tracking-permission-state", data: state) + } + + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + switch message.name { + case "print": printView(webView: vibetype.webView) - } - if message.name == "push-subscribe" { + case "push-subscribe": handleSubscribeTouch(message: message) - } - if message.name == "push-permission-request" { + case "push-permission-request": handlePushPermission() - } - if message.name == "push-permission-state" { + case "push-permission-state": handlePushState() - } - if message.name == "push-token" { + case "push-token": handleFCMToken() + case "tracking-permission-request": + handleTrackingPermission() + case "tracking-permission-state": + handleTrackingState() + default: + break + } + } + + func handleTrackingPermission() { + ATTrackingManager.requestTrackingAuthorization { [weak self] status in + let isAuthorized = status == .authorized + self?.dispatchEventToWebView( + name: "tracking-permission-result", + data: isAuthorized ? "authorized" : "denied" + ) } - } + } + +func dispatchEventToWebView(name: String, data: String) { + DispatchQueue.main.async { + vibetype.webView.evaluateJavaScript(""" + window.dispatchEvent(new CustomEvent('\(name)', { detail: '\(data)' })); + """, completionHandler: nil) + } +} + +func handleTrackingState() { + let status = ATTrackingManager.trackingAuthorizationStatus + let isAuthorized = status == .authorized + let state = isAuthorized ? "authorized" : "denied" + returnTrackingPermissionState(state: state) +} } diff --git a/vibetype/WebView.swift b/vibetype/WebView.swift index bb1c417..c25c934 100644 --- a/vibetype/WebView.swift +++ b/vibetype/WebView.swift @@ -2,7 +2,7 @@ import UIKit @preconcurrency import WebKit import AuthenticationServices import SafariServices - +import AppTrackingTransparency func createWebView(container: UIView, WKSMH: WKScriptMessageHandler, WKND: WKNavigationDelegate, NSO: NSObject, VC: ViewController) -> WKWebView{ @@ -16,6 +16,8 @@ func createWebView(container: UIView, WKSMH: WKScriptMessageHandler, WKND: WKNav userContentController.add(WKSMH, name: "push-permission-request") userContentController.add(WKSMH, name: "push-permission-state") userContentController.add(WKSMH, name: "push-token") + userContentController.add(WKSMH, name: "tracking-permission-request") + userContentController.add(WKSMH, name: "tracking-permission-state") config.userContentController = userContentController