这是对这个博客的回应:
http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
iOS 开发人员对 SO 的想法?
你可以从UIWebView获取一个带有键路径的JSContext:
UIWebView *webView = [[UIWebView alloc] init];
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"document"][@"body"][@"style"][@"background"] = @"steelblue";
Apple从未记录过任何新的JavaScriptCore API,所以我不确定这是否算作内部/未记录的API。我已批准使用此方法的应用程序。
更新:https://github.com/TomSwift/UIWebView-TS_JavaScriptContext 中建议的另一种替代解决方案是在 NSObject
上创建一个类别,并使用它来实现 WebKit 记录的didCreateJavaScriptContext
委托回调。为了解释该实现,您可以调用[NSObject contextForWebView:myWebView]
来获取UIWebView的JSContext:
@implementation NSObject(JSContextTracker)
+ (NSMapTable *)JSContextTrackerMap {
static NSMapTable *contextTracker;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
contextTracker = [NSMapTable strongToWeakObjectsMapTable];
});
return contextTracker;
}
- (void)webView:(id)unused didCreateJavaScriptContext:(JSContext *)ctx forFrame:(id)alsoUnused {
NSAssert([ctx isKindOfClass:[JSContext class]], @"bad context");
if (!ctx)
return;
NSMapTable *map = [NSObject JSContextTrackerMap];
static long contexts = 0;
NSString *contextKey = [NSString stringWithFormat:@"jsctx_%@", @(contexts++)];
[map setObject:ctx forKey:contextKey];
ctx[@"JSContextTrackerMapKey"] = contextKey; // store the key to the map in the context itself
}
+ (JSContext *)contextForWebView:(UIWebView *)webView {
// this will trigger didCreateJavaScriptContext if it hasn't already been called
NSString *contextKey = [webView stringByEvaluatingJavaScriptFromString:@"JSContextTrackerMapKey"];
JSContext *ctx = [[NSObject JSContextTrackerMap] objectForKey:contextKey];
return ctx;
}
@end
我想出了一种与KVC方法不同的方法来获得UIWebView
JSContext
。
基本上,通过了解有关WebKit的一些细节,我们可以在NSObject上实现一个委托回调方法,并在创建JSContext时将其交给它。 详情请见此处:
https://github.com/TomSwift/UIWebView-TS_JavaScriptContext
它对于运行托管在应用程序中的非 Web 相关 JavaScript 很有用。想想如果你有一堆用JavaScript编写的现有代码,你不想重写?您可以使用没有 UIWebView 的 JavaScriptCore 来托管流程中的代码。我还可以想象它被用来为iOS应用程序添加用户脚本可编写性。可能性是无穷无尽的!
这里值得一提的另一件事是 UIWebView 非常耗费资源(毕竟,这就像在你的过程中运行 Safari 的副本);它分配了一吨你永远不会回来的内存。如果你不是特别需要Web渲染,JavaScriptCore可以用更少的资源做很多事情。有关UIWebView资源消耗的详细信息,请参阅此处的回答。
您可以在 JavaScript 中实现应用程序逻辑,并在 iOS 和其他平台上使用 JS 代码。这减少了在iOS,Android,Web等上支持应用程序的工作。
Calatrava是围绕这个想法的框架。
您可以使用 JavaScript 编写 ios7 应用程序:
http://www.youtube.com/watch?v=y-nodF6Cp1Y