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