2017-03-17 3 views
0

GELÖST

Ich benutzte Beobachter in Viewcontrollerwie stringByEvaluatingJavaScript in AppDelegate

Ich habe ein iOS webview in swift3 und müssen Js Funktion von AppDelegate nennen. Der Grund warum ist, weil ich Push-Benachrichtigungen verwende, und wenn der Benutzer auf Benachrichtigungen klicke, muss ich die Informationen von swift3 an JS übergeben. Diese

ist der Kopf meines ZhWebViewController

class ZhWebViewController: UIViewController, UIWebViewDelegate { func passNotificationToWebView(userInfo: AnyObject){ let jsonData = try! JSONSerialization.data(withJSONObject: userInfo, options:
JSONSerialization.WritingOptions.prettyPrinted) let jsonString = NSString(data: jsonData, encoding:
String.Encoding.utf8.rawValue)! as String self.webView.stringByEvaluatingJavaScript(from: "triggerNotificationClick(\ (jsonString))") } }

Dies ist, wie ich erkläre meine UIWebView

@IBOutlet weak var webView: UIWebView!

Dies ist, wie ich JS-Funktionen aufrufen, auf diese Weise funktioniert !!!

self.webView.stringByEvaluatingJavaScript(from: "someFunctionJS(\(jsonString))")

Dies ist Kopf meines AppDelegate

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? }

Dies ist, wo ich Benachrichtigung erhalten und hier i JS-Funktion aufrufen wollen, versuche ich eine Funktion in ZHWebView aufrufen und dort versuche, an JS zu senden, aber ich bekomme einen fatalen Fehler.

@available(iOS 10, *) extension AppDelegate : UNUserNotificationCenterDelegate{ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { let userInfo = response.notification.request.content.userInfo ZhWebViewController().passNotificationToWebView(userInfo: userInfo as AnyObject) completionHandler() } }

+0

Verwenden Sie ein 'UIWebView' oder ein' WKWebView'? – thm

+0

Ich benutze UIWebView, ich bearbeite meinen Beitrag, um die Dinge klar zu machen, bitte helft mir! – Lucas

+0

Was für ein fataler Fehler ist das? Bitte zeigen Sie den Code, der den Fehler auslöst, und Informationen über den Fehler. – thm

Antwort

0

Update:

Es scheint, dass ich Ihre Frage völlig falsch verstanden. Die Frage ist nicht, wie man etwas JavaScript auswertet, sondern wie man von seinem Anwendungsdelegaten auf den View-Controller gelangt. Diese sollten Ihnen helfen:

Ursprüngliche Antwort:

Es hängt davon ab, ob Sie eine UIWebView oder eine WKWebView verwenden. Der Hauptunterschied bei der Bewertung von JavaScript-Code zwischen UIWebView.stringByEvaluatingJavaScript() und ist, dass der frühere Aufruf synchron ist und der letztere asynchron ist.

Vergleichen

let webView: UIWebView = ... 
let result = webView.stringByEvaluatingJavaScript(from: "your javascript goes here") 

mit

let webView: WKWebView = ... 
webView.evaluateJavaScript("your javascript goes here") { (result: Any?, error: Error?) in 
    // handle completion 
} 

Bitte beachten Sie die UIWebView API Reference Staaten

In Anwendungen, die in iOS 8 und später ausführen, verwenden Sie die WKWeb View-Klasse anstelle der Verwendung UIWeb-Ansicht.
[...]]
Obwohl diese Methode [stringByEvaluatingJavaScript] nicht veraltet ist, empfiehlt es sich, stattdessen die Methode zum Auswerten des Java-Skripts (_: completion Handler:) der WKWeb View-Klasse zu verwenden.

, das weiter durch WKWebView's API Reference betont wird:

Wichtige
Ab iOS 8.0 und OS X 10.10 verwenden WKWebView Webinhalte zu Ihrer App hinzuzufügen. Verwenden Sie kein UIWebView oder WebView.

+0

Mann, ty für die Antwort auf mich! Ich habe meinen Beitrag bearbeitet, um Dinge zu klären, ich hoffe, du kannst mein Problem lösen. – Lucas