Как stringByEvaluatingJavaScript в AppDelegate

РЕШИТЬ

Я использовал обозреватель во ViewController

У меня есть веб-просмотр iOS в Swift3 и мне нужно вызвать функцию Js из AppDelegate. Причина в том, что я использую push-уведомления, и когда пользователь нажимает на уведомление, мне нужно передать информацию из swift3 в JS.

Это глава моего 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))") } }

Вот как я объявляю свой UIWebView

@IBOutlet weak var webView: UIWebView!

Вот как я вызываю функции JS, так работает!!!

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

Это глава моего AppDelegate

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

Здесь я получаю уведомление, и здесь я хочу вызвать функцию JS, я пытаюсь вызвать функцию в ZHWebView и там пытаюсь отправить в JS, но я получаю фатальную ошибку.

@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() } }

1 ответ

Обновить:

Кажется, я совершенно не понял ваш вопрос. Вопрос не в том, как оценить какой-то JavaScript, а в том, как перейти от делегата приложения к контроллеру представления. Это должно помочь вам:

Оригинальный ответ:

Это зависит от того, используете ли вы UIWebView или WKWebView, Основное отличие оценки кода JavaScript между UIWebView.stringByEvaluatingJavaScript() а также WKWebView.evaluateJavaScript() является то, что первый вызов является синхронным, а второй асинхронным.

сравнить

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

с

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

Обратите внимание, что ссылки на API UIWebView

В приложениях, работающих в iOS 8 и более поздних версиях, используйте класс WKWebView вместо UIWebView.
[...]
Хотя этот метод [stringByEvaluatingJavaScript] не считается устаревшим, рекомендуется использовать вместо него метод оценки Java Script(_: завершение обработчика:) класса WKWebView.

Что дополнительно подчеркивается в Справочнике по API WKWebView:

Важный
Начиная с iOS 8.0 и OS X 10.10, используйте WKWebView, чтобы добавить веб-контент в свое приложение. Не используйте UIWebView или WebView.

Другие вопросы по тегам