Доступ к движку JavaScriptCore UIWebView

Я только что обнаружил новый фреймворк, доступный в iOS7: JavaScriptCore.

Это выглядит потрясающе, но как я могу получить доступ к среде выполнения/контексту UIWebView?


person aspyct    schedule 29.10.2013    source источник


Ответы (3)


Официального механизма для этого нет. Но я знаю два подхода к получению JSContext. Я, вероятно, не стал бы использовать ни то, ни другое в приложении для доставки.

  1. Используйте KVC для доступа к внутренним UIWebView свойствам. Подробно описано в этом сообщении блога: http://blog.impathic.com/post/64171814244/true-javascript-uiwebview-integration-in-ios7
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  1. Добавьте магический метод в NSObject через категорию. Подробнее объяснено здесь: https://github.com/TomSwift/UIWebView-TS_JavaScriptContext
@implementation NSObject (magic)
- (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id) frame
{
    // ...
}
@end
person TomSwift    schedule 22.11.2013
comment
Превосходно. Склонен к ошибкам, но все равно хорош. Я не понимаю, почему Apple не раскрыла это. - person Leo Natan; 23.11.2013
comment
Выглядит интересно! Надеюсь, он скоро появится в публичном API. А пока попробую ваше решение :) - person aspyct; 24.11.2013
comment
Ваш код на GitHub выглядит интересно, но у него нет лицензии — не могли бы вы уточнить лицензирование? - person Isaac; 31.07.2014

Вы можете посмотреть видеоролики с сессий WWDC 2013 на веб-сайте разработчиков (https://developer.apple.com/wwdc/videos/) и, в частности, «Интеграция JavaScript в нативные приложения», в котором цитируется описание «Представляем новый API Objective-C для JavaScriptCore. Разработчики iOS теперь могут интегрировать сценарии в свои приложения, не имея для объединения пользовательских языковых интерпретаторов. Этот API построен на основе существующего API C для JavaScriptCore доступного на Mac и делает программирование с помощью JavaScript намного проще и менее подверженным ошибкам». Существует раздел об использовании его с WebView, например. используя: -webView:didCreateJavaScriptContext:forFrame:

person VaughanR    schedule 19.12.2013
comment
Похоже, это доступно только для Mac OS X. - person Stunner; 01.02.2014

JavaScriptCore существует для того, чтобы разработчики могли использовать среду выполнения JavaScript из Objective-C. Единственный известный мне способ доступа к среде выполнения UIWebView — это метод stringByEvaluatingJavaScriptFromString:, который, очевидно, не очень гибкий.

person Alex Medearis    schedule 29.10.2013