Как 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, а в том, как перейти от делегата приложения к контроллеру представления. Это должно помочь вам:
- Как перейти непосредственно к определенному контроллеру представления, если было открыто уведомление
- Как правильно уведомить контроллер представления из AppDelegate?
Оригинальный ответ:
Это зависит от того, используете ли вы 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.