2016-11-23 22 views
5

UIWebView'deki Swift to iOS'ta javascript işlevinden bir çağrı yapmaya çalışıyorum 10. Bu çalışmayı denemek ve almak için çok basit bir proje hazırladım, kod aşağıda.UIWebView'den Swift'e Javascript çağrısı

import UIKit 

class ViewController: UIViewController, UIWebViewDelegate {  
    @IBOutlet var webView: UIWebView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url = Bundle.main.url(forResource: "products", withExtension: "html") 
     let request = NSURLRequest(url: url! as URL) 
     webView.loadRequest(request as URLRequest) 
    } 

    @IBAction func closeDocumentViewer() { 
     displayView.isHidden = true; 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

Sadece bir ben olurdu yukarıda eklemek ne bir javascript işlevinden bir dize almak durumunda?

cevap

1

Sen gerekir özel URL Scheme gibi myawesomeapp ve yolunu kesmek kullanarak o istekler:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool 

Yangın window.location=myawesomeapp://hello=world kullanarak yerel kod çağrısı ve yerel kodda request.URL.query den geçmesi parametreler sorgu olsun.

fazla bilgi için, yaklaşık UIWebView burda benim soruya bakın: JavaScript synchronous native communication to WKWebView

9

Ben WKWebView yerine UIWebView kullanarak bakarak öneririm. Ardından, özel URL şemasını kaydetmeniz gerekmeyecek. Ayrıca, UIWebView eski ve WKWebView, ayrı bir işlemde çalışırken, özellikle performans ve işleme gibi birçok avantajı vardır. Elma dokümantasyon ve tavsiyeye

Link> Uygulamada web içeriği eklemek için WKWebView kullanın iOS 8.0 ve OS X 10.10'da başlayan WKWebView

Önemli

https://developer.apple.com/reference/webkit/wkwebview/ kullanmak. UIWebView veya WebView kullanmayın.

import WebKit 

class ViewController: UIViewController, WKScriptMessageHandler { 
    var webView: WKWebView? 
    override func loadView() { 
     super.loadView() 

     webView = WKWebView(frame: self.view.frame) 
     webView?.configuration.userContentController.add(self, name: "scriptHandler") 

     self.view.addSubview(webView!) 
    } 

    public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
     print("Message received: \(message.name) with body: \(message.body)") 
    } 
// rest of code 
} 

Sonra javascript kodunda, diyoruz: Ben güçlendirir kütüphane yazdım

window.webkit.messageHandlers["scriptHandler"].postMessage("hello"); 

söyledi

, bu javascript köprüye bir yerli kurulumu çok basit Bu ve bazı süslü javascript sözdizimi ekler. https://github.com/tmarkovski/BridgeCommander

sadece proje başvurmak, kullanmak (veya Xcode projesine hızlı ve javascript dosyaları eklemek) ve aramak için

webView = WKWebView(frame: self.view.frame) 
    let commander = SwiftBridgeCommander(webView!) 

    commander.add("echo") { 
     command in 
     command.send(args: "You said: \(command.args)") 
    } 
Daha sonra, bu

gibi javascript geri arama sözdizimi kullanmak mümkün olacak

var commander = new SwiftBridgeCommander(); 
commander.call("echo", "Hello", function(args) { 
     // success callback 
    }, function(error) { 
     // error callback 
}); 
+0

wkwebview kullanıyordum, ancak wkwebview ölü uçlara yol açabilir. Çerezin nshttpcookiestrorage – Atif

+0

Yup ile senkronize edilmemesi gibi, bu WKWebView'ın bir dezavantajıdır. Web motorunu yalıtılmış bir süreçte çalıştırır ve çalışma zamanı belleğinize erişemez. –

+0

WKWebView ile tanımlama bilgisi yönetimi için WKWebsiteDataStore belgelerini denetleyin - https://developer.apple.com/documentation/webkit/wkwebsitedatastore –