WkWebView и загрузка движений работали в Xcode 9 с версиями iOS 11, но, похоже, больше не работают с iOS 12. Вы правы, что webkit падает на втором изображении.
В связи с тем, что вы новичок в Swift, я бы посоветовал прочитать эту ссылку для делегатов, потому что это решение, которое я предоставляю, будет иметь для вас больше смысла. Swift Delegates В итоге, «Делегаты - это шаблон проектирования, который позволяет одному объекту отправлять сообщения другому объекту, когда происходит определенное событие».
С этим решением / хаком мы будем использоватьнекоторые из WKNavigationDelegates сообщают нам, когда WkWebView выполняет конкретные задачи, и предлагают решение проблемы.Вы можете узнать всех делегатов, которые есть у WKWebKit WKNavigationDelegates .
Следующий код можно использовать в новом проекте iOS и заменить код в ViewController.swift.Это не требует никакого построителя интерфейса или соединений IBOutlet.Это создаст единый веб-вид на представление и укажет на адрес 192.168.2.75:6789.Я включил встроенные комментарии, чтобы попытаться объяснить, что делает код.
- Мы загружаем HTTP-ответ дважды с движения в делегате definePolicyFor navigationResponse и отслеживаем со счетчиком.Я оставил несколько печатных заявлений, чтобы вы могли увидеть ответ.Первый - это заголовок, а второй - информация об изображении.
- Когда наш счетчик получает 3 элемента (т. Е. Второе изображение), мы заставляем wkWebView отменить всю навигацию (т. Е. Прекратить загрузку) в делегате definePolicyFor navigationResponse.Смотрите строку с решениемHandler (.cancel).Это то, что останавливает аварию.
- Это приводит нас к получению обратного вызова от навигации WebView didFail делегата wkwebview.В этот момент мы хотим снова загрузить наш motion / pi url и снова начать процесс загрузки.
Затем мы должны сбросить счетчик, чтобы мы могли повторять этот процесс до тех пор, пока кто-то другой не найдет лучшего решения.
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// Memeber variables
var m_responseCount = 0; /* Counter to keep track of how many loads the webview has done.
this is a complete hack to get around the webkit crashing on
the second image load */
let m_urlRequest = URLRequest(url: URL(string: "http://192.168.2.75:6789")!) //Enter your pi ip:motionPort
var m_webView:WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
m_webView = WKWebView(frame: self.view.frame) // Create our webview the same size as the viewcontroller
m_webView.navigationDelegate = self // Subscribe to the webview navigation delegate
}
override func viewDidAppear(_ animated: Bool) {
m_webView.load(m_urlRequest) // Load our first request
self.view.addSubview(m_webView) // Add our webview to the view controller view so we can see it
}
// MARK: - WKNavigation Delegates
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
print("decidePolicyFor navigationAction")
print(navigationAction.request) //This is the request to connect to the motion/pi server http::/192.168.2.75:6789
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
print("decidePolicyFor navigationResponse")
print(navigationResponse.response) // This is HTML from the motion/rpi
/* We only want to load the html header and the first image
Loading the second image is causing the crash
m_responseCount = 0 - Header
m_responseCount = 1 - First Image
m_responseCount >= 2 - Second Image
*/
if(m_responseCount < 2)
{
decisionHandler(.allow)
}
else{
decisionHandler(.cancel) // This leads to webView::didFail Navigation Delegate to be called
}
m_responseCount += 1; // Incriment our counter
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
/*
We have forced this failure in webView decidePolicyFor navigationResponse
by setting decisionHandler(.cancel)
*/
print("didFail navigation")
m_webView.load(m_urlRequest) //Lets load our webview again
m_responseCount = 0 /* We need to reset our counter so we can load the next header and image again
repeating the process forever
*/
}
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
// If you find your wkwebview is still crashing break here for
// a stack trace
print("webViewWebContentProcessDidTerminate")
}
}
Примечание. Вам также необходимо добавить следующее в файл info.plist, поскольку ответ сервера движения / pi равен http, а не https
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Я рекомендую вам использовать этот базовый пример и изменить его в соответствии с требованиями вашего приложения.Я также призываю вас публиковать любые собственные выводы, потому что у меня точно такая же проблема, когда используется то же самое оборудование, что и у вас, и это скорее взлом, чем решение.