π ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ SwiftUI Ρ Π²Π΅Π±ΠΎΠΌ. Π§Π°ΡΡΡ ΠΏΠ΅ΡΠ²Π°Ρ: WebView
Π ΡΡΠΈΠ½Π½Π°Ρ Π·Π°Π΄Π°ΡΠ°, Π±Π΅Π· ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ΅ΠΊΡ β Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π°ΡΠΈΠ²Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ iOS ΡΠΎ Π²ΡΠ΅ΠΌΠΈΡΠ½ΠΎΠΉ ΠΏΠ°ΡΡΠΈΠ½ΠΎΠΉ. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠΈΠΊΠ»Π° ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΡΡ, ΠΊΠ°ΠΊ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² SwiftUI Views. Π‘ΠΠΠΠΠΠ : Π΄Π°Π»ΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΠ΅ΠΌΡ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² SwiftUI Π΅ΡΠ΅ Π½Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° WebView, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ WKWebView, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΏΡΠ°Π²ΠΈΡΡΡ Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ°ΠΉΡΠ°.
Π ΡΡΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΡΡΠ°ΡΠ΅ΠΉ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΠΌΡ:
- ΠΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ
WebViewΡ ΠΏΠΎΠΌΠΎΡΡΡWKWebViewΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°UIViewRepresentableΠ²SwiftUI. - ΠΠ°Π³ΡΡΠ·ΠΈΡΡ Π²Π΅Π± ΡΠ°ΠΉΡ ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²
WebView. - ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π°ΡΠΈΠ²Π½ΡΠΌ iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ web-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΠΈ JavaScript.
- ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ (Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ) Π²Π΅Π±-ΡΠ°ΠΉΡΠ° ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ iOS.
- ΠΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°ΡΡ WebView ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π²ΠΏΠ΅ΡΠ΅Π΄ ΠΈ Π½Π°Π·Π°Π΄.
- ΠΠ°Π³ΡΡΠΆΠ°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» .html ΠΈΠ· iOS-ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² WebView
ΠΡΠΎΠ΅ΠΊΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° Github. ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ Π΅Π³ΠΎ Π² Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ. Π¨Π°Π³ Π·Π° ΡΠ°Π³ΠΎΠΌ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ. ΠΠΎΠΌΠΌΠΈΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ Π² ΡΡΠ°ΡΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ
ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ²ΠΎΠΉ WebView
ΠΠ°ΡΡ ΡΠ»ΠΎΠ² ΠΎ UIViewRepresentable
ΠΡΠΎΡΠΎΠΊΠΎΠ» UIViewRepresentable β ΡΡΠΎ ΠΎΠ±Π΅ΡΡΠΊΠ° Π΄Π»Ρ UIKit View, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΡ View ΠΈΠ· UIKit.
ΠΡΠΎΡΠ΅ΡΡ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΡΡ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΡΡΠ΅ ΡΠ°Π³Π°:
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»
UIViewRepresentable. - ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ
ViewΠΈ Ρ.ΠΏ. - Π ΡΡΠ½ΠΊΡΠΈΠΈ
makeUIView()Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π»ΡΠ±ΠΎΠΉUIViewΠΎΠ±ΡΠ΅ΠΊΡ. - Π ΡΡΠ½ΠΊΡΠΈΠΈ
updateUIView()ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌView.
ΠΠΎΡ ΠΈ Π²ΡΠ΅, ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ View Π² SwiftUI.
ΠΠΎΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΠ΅Π»Π΅Ρ ΠΎΠ±Π΅ΡΡΠΊΠΈ:
struct myView: UIViewRepresentable {
func makeUIView(context: Context) -> some UIView {
// Return the UIView object
}
func updateUIView(_ uiView: some UIView, context: Context) {
// Update the view
}
}
Π’Π°ΠΊΠΆΠ΅, Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ UIKit ΠΈ SwiftUI View Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠ»Π°ΡΡ Coordinator.
struct WebView
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΡΡΡΠΊΡΡΡΡ WebView, Π½ΠΎ ΠΏΡΠ΅ΠΆΠ΄Π΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΡ:
- ΠΠ°Π΄Π°Π΄ΠΈΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²Π΅Π±-Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ (Π²ΠΏΠ΅ΡΠ΅Π΄, Π½Π°Π·Π°Π΄ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ°).
- ΠΠΏΠΈΡΠ΅ΠΌ ΡΠΈΠΏΡ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΡ URL (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ).
enum WebViewNavigationAction {
case backward, forward, reload
}
enum URLType {
case local, `public`
}
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΈ, ΠΌΡ ΡΡΠ°Π·Ρ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³ΡΡΠΏΠΏΡ Web ΠΈ Π±ΡΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΡΠ΄Π° Π²ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ΅ Ρ Π²Π΅Π±ΠΎΠΌ. Π― ΡΠΎΠ·Π΄Π°Π» Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
import Foundation
import SwiftUI
import Combine
import WebKit
import UIKit
struct WebView: UIViewRepresentable {
var type: URLType
var url: String?
func makeUIView(context: Context) -> WKWebView {
let preferences = WKPreferences()
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
let webView = WKWebView(frame: CGRect.zero, configuration: configuration)
webView.allowsBackForwardNavigationGestures = true
webView.scrollView.isScrollEnabled = true
return webView
}
func updateUIView(_ webView: WKWebView, context: Context) {
if let urlValue = url {
if let requestUrl = URL(string: urlValue) {
webView.load(URLRequest(url: requestUrl))
}
}
}
}
ΠΠΎΠ±Π°Π²ΠΈΠΌ WebView Π² ContentView ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠΈΠΊΠ»Π° ΠΌΡ Π½Π°ΡΡΠΈΠΌ WebView Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎ SwiftUI ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²Π΅Π±-Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ, Π° Π² ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ JavaScript.
Happy code!
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ: