Zum Hauptinhalt springen

Natives iOS (Swift)

FaceGuard in native iOS Apps mit WKWebView integrieren.

Setup

Fügen Sie NSCameraUsageDescription zu Ihrer Info.plist hinzu:

Info.plist
<key>NSCameraUsageDescription</key>
<string>FaceGuard benötigt Kamerazugriff für die Gesichtsverifikation</string>

Implementierung

FaceGuardViewController.swift
import WebKit

class FaceGuardViewController: UIViewController, WKScriptMessageHandler {
private var webView: WKWebView!

func startVerification(token: String) {
let config = WKWebViewConfiguration()
config.allowsInlineMediaPlayback = true
config.mediaTypesRequiringUserActionForPlayback = []

// postMessage-Events abhören
config.userContentController.add(self, name: "surtHandler")

// Bridge injizieren: postMessage an nativen Handler weiterleiten
let script = WKUserScript(
source: """
window.addEventListener('message', function(e) {
if (e.data && (e.data.type === 'surt:ready' || e.data.action === 'close')) {
window.webkit.messageHandlers.surtHandler.postMessage(JSON.stringify(e.data));
}
});
""",
injectionTime: .atDocumentStart,
forMainFrameOnly: false
)
config.userContentController.addUserScript(script)

webView = WKWebView(frame: view.bounds, configuration: config)
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(webView)

let url = URL(string: "https://faceguard.surt.com/intro?token=\(token)")!
webView.load(URLRequest(url: url))
}

func userContentController(
_ controller: WKUserContentController,
didReceive message: WKScriptMessage
) {
guard let body = message.body as? String,
let data = body.data(using: .utf8),
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
else { return }

if let action = json["action"] as? String, action == "close" {
let reason = json["reason"] as? String ?? ""
let confidence = json["confidence"] as? Double ?? 0

switch reason {
case "approved", "bypass_active":
handleApproved(confidence: confidence)
case "rejected":
handleRejected(confidence: confidence)
case "canceled":
handleCanceled()
case "error", "no_base_photo":
handleError(message: json["error"] as? String ?? reason)
default:
break
}
}
}

func handleApproved(confidence: Double) { /* Zugriff gewähren */ }
func handleRejected(confidence: Double) { /* Zugriff verweigern */ }
func handleCanceled() { /* Nutzer hat geschlossen */ }
func handleError(message: String) { /* Fehler anzeigen */ }
}

Wie die Bridge funktioniert

WKWebView empfängt postMessage-Events von iframes nicht nativ. Das injizierte JavaScript-Script hört auf message-Events und leitet sie über window.webkit.messageHandlers an den nativen WKScriptMessageHandler weiter.

Safe Areas

Verwenden Sie Auto Layout mit safeAreaLayoutGuide, um Notch und Home-Indicator zu vermeiden.