Integrating Popin WebView into Your iOS App

🧩 Step 1: Add Required Permissions

In your Info.plist, add:

<key>NSCameraUsageDescription</key>
<string>Camera access is required for video calls.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for audio during calls.</string>

🧱 Step 2: Create PopinWebViewController.swift

This view controller hosts the Popin WebView and automatically prompts for camera/mic access when requested by the web content.

import UIKit
import WebKit
import AVFoundation

class PopinWebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    private var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupWebView()
        loadPopinWidget()
    }

    private func setupWebView() {
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true
        if #available(iOS 10.0, *) {
            config.mediaTypesRequiringUserActionForPlayback = []
        }

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

    private func loadPopinWidget() {
        let urlString = "https://widget01.popin.to/standalone?token=XXXXX&popin=open"
        if let url = URL(string: urlString) {
            webView.load(URLRequest(url: url))
        }
    }

    // Handles permission requests from the web page
    func webView(_ webView: WKWebView,
                 requestMediaCapturePermissionFor origin: WKSecurityOrigin,
                 initiatedByFrame frame: WKFrameInfo,
                 type: WKMediaCaptureType,
                 decisionHandler: @escaping (WKPermissionDecision) -> Void) {

        // Check and request iOS permissions first
        switch type {
        case .camera:
            AVCaptureDevice.requestAccess(for: .video) { granted in
                decisionHandler(granted ? .grant : .deny)
            }
        case .microphone:
            AVCaptureDevice.requestAccess(for: .audio) { granted in
                decisionHandler(granted ? .grant : .deny)
            }
        default:
            decisionHandler(.deny)
        }
    }
}

📲 Step 3: Present the Popin WebView

From any view controller, you can launch it like:

let vc = PopinWebViewController()
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)

✅ Notes

  • requestMediaCapturePermissionFor is available on iOS 15+ and automatically triggers when a web page (like Popin) requests access to camera/mic via WebRTC.

  • The decisionHandler must be called with .grant or .deny based on the user’s iOS permission status.

  • This approach ensures your WebView and app stay in sync with system-level permission prompts.

Last updated