Caricamento di javascript in una UIWebView da risorse

Ho bisogno di caricare i file javascript dalla mia cartella delle risorse delle app. A partire da ora, legge le immagini delle risorse bene, ma non sta leggendo i javascript per qualche motivo.

Sono stato in grado di eseguire il rendering di documenti HTML che fanno riferimento a questi javascript se i file html stessi sono scritti nelle risorse, ma mi piacerebbe rendere html / js impostando l’html di un UIWebView in modo che possa essere dinamico.

Ecco cosa sto facendo:

NSString * html = @"MathJaxMathJax.Hub.Config({tex2jax: {inlineMath: [[\"$\",\"$\"],[\"\\(\",\"\\)\"]]}});$$\\int_x^yf(x) dx$$"; NSString * path = [[NSBundle mainBundle] resourcePath]; path = [path stringByReplacingOccurrencesOfString:@"/" withString:@"//"]; path = [path stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; NSString * resourcesPath = [[NSString alloc] initWithFormat:@"file://%@/", path]; [webview loadHTMLString:html baseURL:[NSURL URLWithString:resourcesPath]]; 

Ora, se cambio l’url di base sul mio server che ha anche i file richiesti, viene caricato correttamente. Sarebbe bello non richiedere una connessione internet. Qualsiasi aiuto è apprezzato !!! 😉

Ho trovato questo utile per far visualizzare le immagini: iPhone Dev: UIWebView baseUrl alle risorse nella cartella Documenti non nel pacchetto App

Modificare:

Invece di eseguire la sostituzione delle stringhe e la codifica degli URL, sono stato in grado di ottenere le immagini semplicemente chiamando resourceURL sul mainBundle, ma ancora nessuna esecuzione javascript.

  NSString * setHtml = @"MathJaxMathJax.Hub.Config({tex2jax: {inlineMath: [[\"$\",\"$\"],[\"\\(\",\"\\)\"]]}});$$\\int_x^yf(x) dx$$"; [webview loadHTMLString:setHtml baseURL:[[NSBundle mainBundle] resourceURL]]; 

MODIFICARE

Se vuoi contribuire a dare una possibilità, ti ho reso più facile la creazione di un progetto di esempio!

https://github.com/pyramation/math-test

 git clone [email protected]:pyramation/math-test.git 

Qui andiamo con una semplice configurazione.

Creare la seguente struttura di cartelle nella cartella Risorse.

Si noti che le cartelle blu sono di riferimento

inserisci la descrizione dell'immagine qui

Il css è solo candy 🙂 In lib.js risiede il tuo codice javascript che vorresti usare.

index.html

       

Local Javascript

Test Javascript Alert

External js test

lib.js

 function alertMeWithMyCustomFunction(text) { alert(text+' -> in lib.js'); } 

Caricamento del contenuto nella visualizzazione Web

Nota: webView è una proprietà, vista creata con il generatore di istanze

 - (void)viewDidLoad { NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"/htdocs" ]; NSString *html = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; [webView loadHTMLString:html baseURL:[NSURL fileURLWithPath: [NSString stringWithFormat:@"%@/htdocs/", [[NSBundle mainBundle] bundlePath]]]]; } 

E questo dovrebbe essere il risultato:

inserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine qui

MODIFICARE:

snowman4415 ha detto che iOS 7 non ama i tag di tag di chiusura automatica, quindi se qualcosa non funziona su iOS 7, potrebbe essere necessario chiudere il tag con

Ecco un altro modo per iniettare un file javascript locale nel DOM di una visualizzazione web. stringByEvalutatingJavaScriptFromString il contenuto del file JS in una stringa e quindi utilizzare stringByEvalutatingJavaScriptFromString :

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *jsFile = @"jquery-1.8.2.min.js"; NSString *jsFilePath = [[NSBundle mainBundle] pathForResource:jsFile ofType:nil]; NSURL *jsURL = [NSURL fileURLWithPath:jsFilePath]; NSString *javascriptCode = [NSString stringWithContentsOfFile:jsURL.path encoding:NSUTF8StringEncoding error:nil]; [webView stringByEvaluatingJavaScriptFromString:javascriptCode]; // ... } 

Ciò è particolarmente utile quando non si possiedono i file * .html / xhtml che si stanno visualizzando (ad esempio, lettore ePub o aggregatore di notizie). Aiuta a non doversi preoccupare dei percorsi relativi dal file xhtml al file js.

Questo è il modo in cui ho usato Webview e JS locale. Mettendo alcune istantanee qui un esempio di progetto qui

risorse

 // Get the path for index.html, where in which index.html has reference to the js files, since we are loading from the proper resource path, the JS files also gets picked up properly from the resource path. func loadWebView(){ if let resourceUrl = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "WebDocs2"){ let urlRequest = URLRequest.init(url: resourceUrl) myWebView.loadRequest(urlRequest) } } 

 // Load the JS from resources func jsScriptText() -> String? { guard let jsPath = Bundle.main.path(forResource: "hello", ofType: "js", inDirectory: "WebDocs2/scripts") else { return nil } do { let jsScript = try String(contentsOfFile: jsPath, encoding: String.Encoding.utf8) return jsScript }catch{ print("Error") return nil } } // Run the java script func runJS(){ if let jsScript = jsScriptText(){ let jsContext = JSContext() _ = jsContext?.evaluateScript(jsScript) let helloJSCore = jsContext?.objectForKeyedSubscript("helloJSCore") let result = helloJSCore?.call(withArguments: []) print(result?.toString() ?? "Error") } } 

In swift 3.x possiamo usare la funzione loadHTMLString(_ string: String, baseURL: URL?) Che viene utilizzata per visualizzare lo script in UIWebview

  @IBOutlet weak var webView : UIWebView! class ViewController: UIViewController,UIWebViewDelegate { override func viewDidLoad() { super.viewDidLoad() webView.delegate = self } func loadWebView() { webView.loadHTMLString("

Hello, How are you doing?.

" , baseURL: nil) } func webViewDidFinishLoad(_ webView: UIWebView) { webView.frame.size.height = 1 webView.frame.size = webView.sizeThatFits(.zero) } }

Nota: – Possiamo impostare l’altezza di UIWebView come menzionato sopra nel metodo webViewDidFinishLoad