ใช้ WKWebView (WebKit Framework) แทน UIWebView ที่ Deprecated แล้ว
Setup
- Import
WebKit - Storyboard: ลาก WKWebView จาก Object Library
- เชื่อม 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"