2015-12-09 10 views
6

मैं example.com खोलने के लिए WKWebView का उपयोग कर रहा हूं, और वहां मेरे पास एक परीक्षण लिंक है जो जेएस अलर्ट खोलने वाला है, लेकिन मैं इसे प्रदर्शित नहीं कर सकता डिवाइस, यह केवल तभी काम करता है जब मैं ब्राउज़र से साइट देखता हूं।WKWebView - जावास्क्रिप्ट पुष्टि और चेतावनी

मैं WKUIDelegate उपयोग कर रहा हूँ, और ViewController.swift फाइल करने के लिए कोड के इस टुकड़े कहा:

func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (() -> Void)) { 

    NSLog("Hello") 
} 

मैं XCode कंसोल में कुछ भी नहीं दिख रहा है जब मैं लिंक है कि जे एस चेतावनी spawns क्लिक करें।

मुझे क्या याद आ रही है?

+0

[ios wkwebview अब दिखा जावास्क्रिप्ट चेतावनी संवाद] (https://stackoverflow.com/q/26898941/6521116) –

उत्तर

7

आपको WKWebView पर uiDelegate सेट करने की भी आवश्यकता है।

import UIKit 
import WebKit 

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { 

    var wkWebView: WKWebView! 

    public override func viewDidLoad() { 
     super.viewDidLoad() 

     wkWebView = WKWebView(frame: view.bounds, configuration: WKWebViewConfiguration()) 
     wkWebView.uiDelegate = self 
     wkWebView.navigationDelegate = self 
     view.addSubview(wkWebView!) 
     let url = URL(string: "https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert")! 
     wkWebView.load(URLRequest(url: url)) 
    } 

    func webView(_ webView: WKWebView, 
       runJavaScriptAlertPanelWithMessage message: String, 
       initiatedByFrame frame: WKFrameInfo, 
       completionHandler: @escaping() -> Void) { 

     let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) 
     let title = NSLocalizedString("OK", comment: "OK Button") 
     let ok = UIAlertAction(title: title, style: .default) { (action: UIAlertAction) -> Void in 
      alert.dismiss(animated: true, completion: nil) 
     } 
     alert.addAction(ok) 
     present(alert, animated: true) 
     completionHandler() 
    } 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     wkWebView.evaluateJavaScript("alert('Hello from evaluateJavascript()')", completionHandler: nil) 
    } 
} 

confirm() के लिए और prompt() अन्य प्रतिनिधि की प्रक्रिया देखें।

+0

हाँ यह स्थापित किया गया था। क्या आप जेके को WKWebView के साथ काम करने में सक्षम हैं? समस्या को हल करने के लिए मुझे बूटबॉक्स संवाद का उपयोग करने के लिए अपने सभी मूल जेएस अलर्ट/पुष्टि संवाद को बदलना पड़ा। –

+0

हां, यह मेरे लिए ठीक काम करता है। क्या आपका नियंत्रक आपका यूआईडीलेगेट था या क्या आपके पास एक अलग वस्तु थी? शायद प्रतिनिधि को हटा दिया जा रहा था? – Onato

+0

आप इस कोड के साथ मूल जेएस संवाद बॉक्स खोलने में सक्षम हैं? –

5

यहाँ स्विफ्ट में विभिन्न जावास्क्रिप्ट चेतावनी लागू करने के लिए एक नमूना कोड है:

यह सब जावास्क्रिप्ट इंजन के लिए देशी यूआई में जावास्क्रिप्ट चेतावनी में जानकारी परिवर्तित करने, और कॉल completionHandler() उपयोगकर्ता कार्रवाई भेजने के लिए वापस के बारे में ।

func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler:() -> Void) { 

     let alertController = UIAlertController(title: nil, message: message, preferredStyle: .ActionSheet) 

     alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in 
      completionHandler() 
     })) 

     self.presentViewController(alertController, animated: true, completion: nil) 
} 

func webView(webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (Bool) -> Void) { 

     let alertController = UIAlertController(title: nil, message: message, preferredStyle: .ActionSheet) 

     alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in 
      completionHandler(true) 
     })) 

     alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action) in 
      completionHandler(false) 
     })) 

     self.presentViewController(alertController, animated: true, completion: nil) 
} 

func webView(webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: (String?) -> Void) { 

     let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .ActionSheet) 

     alertController.addTextFieldWithConfigurationHandler { (textField) in 
      textField.text = defaultText 
     } 

     alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in 
      if let text = alertController.textFields?.first?.text { 
       completionHandler(text) 
      } else { 
       completionHandler(defaultText) 
      } 

     })) 

     alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action) in 

      completionHandler(nil) 

     })) 

     self.presentViewController(alertController, animated: true, completion: nil) 
} 
+0

आप इस कोड को कैसे संशोधित करते हैं ताकि यह आईपैड के साथ भी काम करे? – applecrusher

+1

मुझे निम्न पंक्ति की आवश्यकता है जिसे मैंने इस उत्तर में संपादित किया है: alertController.popoverPresentationController ?sourceView = self.view – applecrusher

+0

@applecrusher टिप्पणी के लिए धन्यवाद। यह निश्चित रूप से अधिक लोगों की मदद करेगा :) –

8

एक छोटी सी देर लेकिन मैं भविष्य में संदर्भ के लिए मेरे अनुभव में जोड़ना चाहते हैं। @Bon बॉन के जवाब मुझे समाधान के रास्ते पर लाया, जबकि मैं चीजों के साथ स्विफ्ट 3 और आईओएस 10, ऐसी स्थिति में कोड कुछ संशोधनों की जरूरत है काम करने के लिए कोशिश कर रहा था। सबसे पहले आप भी WKUIDelegate लागू करने की आवश्यकता है, तो ViewController घोषणा में जोड़ें: तो जैसे

class ViewController: UIViewController, WKUIDelegate { 

फिर जब आप WKWebView वस्तु का दृष्टांत, उदाहरण के लिए के रूप में:

self.webView = WKWebView(frame: self.view.frame) 

आप आवंटित करने के लिए भी जरूरत है उदाहरण के uiDelegate संपत्ति का सही मूल्य:

self.webView?.uiDelegate = self 

फिर अंत में आप @Bon बॉन द्वारा प्रदान की कोड का उपयोग कर सकते हैं, लेकिन ध्यान दें कि कुछ छोटे स्विफ्ट 3 के लिए आवश्यक मतभेद, उदाहरण के लिए के रूप में कर रहे हैं कि, presentViewController विधि का नाम हो जाता है present:

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping() -> Void) { 

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) 

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in 
     completionHandler() 
    })) 

    self.present(alertController, animated: true, completion: nil) 
} 

func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { 

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) 

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in 
     completionHandler(true) 
    })) 

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 
     completionHandler(false) 
    })) 

    self.present(alertController, animated: true, completion: nil) 
} 

func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { 

    let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) 

    alertController.addTextField { (textField) in 
     textField.text = defaultText 
    } 

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in 
     if let text = alertController.textFields?.first?.text { 
      completionHandler(text) 
     } else { 
      completionHandler(defaultText) 
     } 

    })) 

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 

     completionHandler(nil) 

    })) 

    self.present(alertController, animated: true, completion: nil) 
} 
कि alert बनाया

, और text inputWKWebView के भीतर सही ढंग से काम करने के लिए, में किसी भी कंपाइलर चेतावनी के बिना Xcode 8। मैं एक विशेषज्ञ स्विफ्ट प्रोग्रामर नहीं हूं, इसलिए कोड की शुद्धता के बारे में कोई भी उपयोगी टिप्पणी बहुत सराहना की जाएगी।

+2

तेजी से 3 अपडेट के लिए धन्यवाद :) –

+0

आपके मूल कोड के लिए @ बॉन बॉन धन्यवाद, इसके बिना मुझे काम की एक लंबी रात होगी! – wiredolphin

+1

'पसंदीदा स्टाइल: .alert' को प्रॉम्प्ट के लिए सेट किया जाना चाहिए 'पसंदीदा स्टाइल: .actionSheet' - इस बदलाव के बिना मुझे त्रुटि मिल रही है कि टेक्स्ट फ़ील्ड केवल – godblessstrawberry

संबंधित मुद्दे