Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีสร้าง WebView ใน iOS/iPhone

ใช้ WKWebView (WebKit Framework) แทน UIWebView ที่ Deprecated แล้ว

Setup

  1. Import WebKit
  2. Storyboard: ลาก WKWebView จาก Object Library
  3. เชื่อม IBOutlet: @IBOutlet weak var webView: WKWebView!

โหลดเว็บไซต์


override func viewDidLoad() {
    super.viewDidLoad()
    
    guard let url = URL(string: "https://www.facebook.com") else { return }
    let request = URLRequest(url: url)
    webView.load(request)
    
    // Delegate สำหรับติดตาม Progress/Error
    webView.navigationDelegate = self
}

WKNavigationDelegate


extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("Start loading")
        // Show Loading Indicator
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Finished: \(webView.url?.absoluteString ?? "")")
        // Hide Loading Indicator
        title = webView.title
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        print("Error: \(error)")
        // Show Error Alert
    }
    
    // จัดการ Link ที่เปิดใน App เอง
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .linkActivated,
           let url = navigationAction.request.url,
           url.host?.contains("external.com") == true {
            // เปิดใน Safari แทน
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
}

โหลด Local HTML/File


// Local HTML String
webView.loadHTMLString("

Hello

Local content

", baseURL: nil) // Local File (ใน Bundle) if let url = Bundle.main.url(forResource: "index", withExtension: "html") { webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) }

Info.plist (App Transport Security)


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

แนะนำ: ใช้ HTTPS เท่านั้น ระบุ Domain เฉพาะเจาะจง

JavaScript Bridge


// Swift -> JS
webView.evaluateJavaScript("document.title") { result, error in
    print("Title: \(result ?? "")")
}

// JS -> Swift (User Content Controller)
let contentController = WKUserContentController()
contentController.add(self, name: "callbackHandler")
let config = WKWebViewConfiguration()
config.userContentController = contentController
// ใช้ WKWebView(frame: .zero, configuration: config)

// Delegate: WKScriptMessageHandler
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callbackHandler", let body = message.body as? String {
        print("JS sent: \(body)")
    }
}

Cookie / Cache Management


// Clear Cache
WKWebsiteDataStore.default().removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), modifiedSince: Date.distantPast) { }

// Custom User Agent
webView.customUserAgent = "MyApp/1.0 iOS"