Ios7 如果JavaScriptCore能够';t访问UIWebView';什么是运行时间?

Ios7 如果JavaScriptCore能够';t访问UIWebView';什么是运行时间?,ios7,javascriptcore,Ios7,Javascriptcore,这是对本博客的回应: iOS开发者的想法是什么?这对于运行应用程序中托管的与web无关的JavaScript非常有用。想一想,如果你有一堆用JavaScript编写的代码,你不想重新编写?您可以在不使用UIWebView的情况下使用JavaScriptCore在流程中承载该代码。我还可以想象它被用来向iOS应用程序添加用户脚本能力。可能性是无穷的 这里值得一提的另一件事是UIWebView非常需要资源(毕竟,这就像在流程中运行Safari的副本);它分配了大量的内存,你永远也回不来了。如果您不

这是对本博客的回应:


iOS开发者的想法是什么?

这对于运行应用程序中托管的与web无关的JavaScript非常有用。想一想,如果你有一堆用JavaScript编写的代码,你不想重新编写?您可以在不使用UIWebView的情况下使用JavaScriptCore在流程中承载该代码。我还可以想象它被用来向iOS应用程序添加用户脚本能力。可能性是无穷的


这里值得一提的另一件事是UIWebView非常需要资源(毕竟,这就像在流程中运行Safari的副本);它分配了大量的内存,你永远也回不来了。如果您不特别需要web渲染,JavaScriptCore可以用更少的资源做很多事情。有关UIWebView资源消耗的详细信息,请参阅。

您可以用JavaScript实现应用程序逻辑,并在iOS和其他平台上使用JS代码。这减少了在iOS、Android、Web等平台上支持应用程序的工作量


是一个围绕这一思想的框架。

您可以从UIWebView获得一个JSContext,其中包含一个关键路径:

UIWebView *webView = [[UIWebView alloc] init];
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"document"][@"body"][@"style"][@"background"] = @"steelblue";
苹果从未着手记录任何新的JavaScriptCore API,因此我不确定这是否算作内部/未记录的API。我有一个使用此方法的已批准应用程序

更新:上建议的另一个替代解决方案是在
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

我提出了一种获取
UIWebView
JSContext
的方法,它不同于KVC方法

基本上,通过了解WebKit的一些细节,我们可以在NSObject上实现委托回调方法,并在创建JSContext时将其交给它。详情如下:


您可以使用JavaScript编写ios7应用程序:


运行用户贡献的任意JS脚本的能力会被应用商店拒绝吗?我不是应用商店规则方面的专家,但我的理解是,如果用户输入它,那么你可以运行它,但你不能通过网络下载代码。请参阅此示例。不必在意,我现在使用JavaScript来执行此操作。我希望本机Obj-C代码注入JavaScript,而无需JavaScript的垃圾收集。建议使用此库,您可以使用UIWebView轻松地在javascript和objc之间进行通信:是否有其他人使用了这两种方法中的任何一种,并让苹果接受了他们的应用程序?web视图上的关键路径是如何发现的?我在运行时标题中看到了一个
\u documentView
getter,但我很好奇有人是如何进一步挖掘的。优秀的代码示例。我不知道要调用这些方法,它们需要是JSExport协议的一部分