webview не загружает файлы JS / библиотеки swift - TradingView - PullRequest
0 голосов
/ 07 января 2019

Я очень старался динамически загружать файлы / библиотеки JS (режим торговли) с помощью UIwebview. Мне удалось поместить файлы JS в файл .html, но я не могу передать переменную до того, как веб-просмотр загрузит файл .html. Некоторые фрагменты моего кода:

<!DOCTYPE html>
<html>
<head>
  <title>TradingView Charting Library demo </title>
  <!-- Fix for iOS Safari zooming bug -->
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <script type="text/javascript" src="charting_library/charting_library.min.js"></script>
  <script type="text/javascript" src="datafeeds/udf/dist/polyfills.js"></script>
  <script type="text/javascript" src="datafeeds/udf/dist/bundle.js"></script>
  <script type="text/javascript" src="interface_js.js" one='BTC_EUR'></script>
  <script>
    var widget;
    function setSymbol(symbol) {
      console.log(symbol)
      widget.chart().setSymbol("ADA_BTC");
    }
    function getParameterByName(name) {
      name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
      var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
      results = regex.exec(location.search);
      return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
    }
    TradingView.onready(function() {
      widget = new TradingView.widget({
        fullscreen: true,
        symbol: 'BTC_EUR',
        interval: 'D',
        container_id: "tv_chart_container",
        //    BEWARE: no trailing slash is expected in feed URL
        datafeed: new Datafeeds.UDFCompatibleDatafeed("http://example.com"),
        library_path: "charting_library/",
        locale: getParameterByName('lang') || "en",

        disabled_features: ["use_localstorage_for_settings"],
        preset: "mobile"
        });
      })
  </script>
</head>
<body style="margin:0px;">
  <div id="tv_chart_container"></div>
</body>

быстрый фрагмент:

if let url = Bundle.main.url(forResource: "mobile_white1", withExtension:"html") {
  let request = NSURLRequest(url: url)
  self.webView.loadRequest(request as URLRequest)
  self.webView.stringByEvaluatingJavaScript(from: "setSymbol(\(selectedPair.uppercased()))")
}
else { self.html = "<html><head><title>TradingView Charting Library demo</title><meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0'><meta http-equiv='X-UA-Compatible' content='IE=Edge'></head><body style='margin:0px;'><script type='text/javascript' src='charting_library/charting_library.min.js'></script><script type='text/javascript' src='datafeeds/udf/dist/polyfills.js'></script><script type='text/javascript' src='datafeeds/udf/dist/bundle.js'></script><script type='text/javascript' src='interface_js.js' one='BTC_EUR'></script><div id='tv_chart_container'></div></body></html>"
  webView.loadHTMLString(self.html, baseURL: nil)
}

фрагмент intercept.js:

var widget;
var selectedSymbol = document.currentScript.getAttribute('one');

TradingView.onready(() => {
    widget = new TradingView.widget({
        fullscreen: true,
        symbol: selectedSymbol,
        interval: 'D',
        debug: true,
        container_id: "tv_chart_container",
        datafeed: new     Datafeeds.UDFCompatibleDatafeed("http://example.com"),
        library_path: "charting_library/",
        locale: "en",

        disabled_features: ["use_localstorage_for_settings"],
        overrides: {
            'mainSeriesProperties.style': 3
        }

    });

})

Если я поставлю mobile_white в forResource(swift), выполняется условие «если», и все работает хорошо, но динамически ничего не может передать в html-файл.

Затем я попытался поместить строку html в loadHTMLString и baseURL (nil), сейчас библиотеки JS не загружаются. Работает только встроенный JS. Я прошел через множество решений для работы со стеком и погуглил много вещей, но не смог загрузить файлы JS вообще. Также я установил baseURL как @ "http" безуспешно.

То, что я обнаружил при отладке, что swift использует «file: ///», когда я использую loadRequest, но он переключается на «applewebdata: //», когда я использовал «webView.loadHTMLString», и эта вещь «applewebdata» не позволяет webview загружать файлы JS.

P.S: загрузить TradingView с выбранным символом (т.е. ETH / USD), который доступен в быстром коде.

Спасибо.

...