🍏 ВзаимодСйствиС SwiftUI с Π²Π΅Π±ΠΎΠΌ. Π§Π°ΡΡ‚ΡŒ пСрвая: WebView

Рутинная Π·Π°Π΄Π°Ρ‡Π°, Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ обходится Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ – взаимодСйствиС Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ iOS со всСмирной ΠΏΠ°ΡƒΡ‚ΠΈΠ½ΠΎΠΉ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ†ΠΈΠΊΠ»Π° разбираСмся, ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π²Π΅Π±-прилоТСния Π² SwiftUI Views. Π‘ΠŸΠžΠ™Π›Π•Π : дальшС Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π±ΠΎΠ»Π΅Π΅ слоТныС Ρ‚Π΅ΠΌΡ‹.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² SwiftUI Π΅Ρ‰Π΅ Π½Π΅Ρ‚ своСго элСмСнта WebView, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WKWebView, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСкрасно справится с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π²Π΅Π±-прилоТСния ΠΈΠ»ΠΈ сайта.

Π’ этом Ρ†ΠΈΠΊΠ»Π΅ статСй ΠΌΡ‹ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹:

  1. Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ WebView с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ WKWebView ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UIViewRepresentable Π² SwiftUI.
  2. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π²Π΅Π± сайт ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² WebView.
  3. Π’Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ iOS ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JavaScript.
  4. ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ (Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ) Π²Π΅Π±-сайта ΠΈΠ»ΠΈ Π²Π΅Π±-прилоТСния Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ iOS.
  5. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ WebView ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Π½Π°Π·Π°Π΄.
  6. Π—Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .html ΠΈΠ· iOS-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² WebView

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ доступСн Π½Π° Github. ДобавляйтС Π΅Π³ΠΎ Π² Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° измСнСниями. Π¨Π°Π³ Π·Π° шагом ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°.

БоздаСм свой WebView

ΠŸΠ°Ρ€Ρƒ слов ΠΎ UIViewRepresentable

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UIViewRepresentable – это ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для UIKit View, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ View ΠΈΠ· UIKit.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ прост ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шага:

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ структуру которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UIViewRepresentable.
  2. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ свойства для своСй View ΠΈ Ρ‚.ΠΏ.
  3. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ makeUIView() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ любой UIView ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  4. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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, Π½ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ:

  1. Π—Π°Π΄Π°Π΄ΠΈΠΌ дСйствия для опрСдСлСния Π²Π΅Π±-Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ (Π²ΠΏΠ΅Ρ€Π΅Π΄, Π½Π°Π·Π°Π΄ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°).
  2. ОпишСм Ρ‚ΠΈΠΏΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… URL (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ адрСс).
WebViewNavigationAction.swift
enum WebViewNavigationAction {
    case backward, forward, reload
}
URLType.swift
enum URLType {
    case local, `public`
}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ расти, ΠΌΡ‹ сразу создадим Π³Ρ€ΡƒΠΏΠΏΡƒ Web ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° всС связанноС с Π²Π΅Π±ΠΎΠΌ. Π― создал для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пСрСчислСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! ΠœΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ всС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈ напишСм наш WebView.
WebView.swift
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!

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹:

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 фСвраля 2018

Мобильная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Python: ΠΎΠ±Π·ΠΎΡ€ Π΄Π²ΡƒΡ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ²

Мобильная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Python – ΠΎΠ΄Π½ΠΎ ΠΈΠ· пСрспСктивных Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ. Π’ ΡΡ‚Π°Ρ‚ΡŒ...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
13 фСвраля 2018

10 ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡƒΡ‡Π°Ρ‚ вас ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π˜Ρ‰Π΅Ρ‚Π΅ курсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡƒΡ‡Π°Ρ‚ вас ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? ΠœΡ‹ собрали Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
01 сСнтября 2017

15 классных ΠΈΠ΄Π΅ΠΉ для создания своСго мобильного прилоТСния

Если Π΄ΡƒΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ свои знания Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ...