gpt4 book ai didi

objective-c - 如何在 iOS 上注入(inject)用户脚本?

转载 作者:技术小花猫 更新时间:2023-10-29 10:27:16 28 4
gpt4 key购买 nike

我正在研究 Fahrii ,本质上是一个支持用户脚本的移动浏览器。目前,我在调用加载到 UIWebView 的网页上的脚本时遇到问题。如果可能的话,我想保留这个公共(public) API。如果没有,概念证明至少会很好,这样我可以更好地理解它是如何工作的。我正在尝试在 webViewDidFinishLoad: 方法中执行此操作。

我尝试通过读取 webView 的内容(使用 JavaScript)然后使用 loadHTML:baseURL: 将其加载回来来进行注入(inject),但这会导致无限递归。 (完成的加载导致脚本被注入(inject),这反过来又导致完成的“加载”。)

接下来,我试过这样的事情:

    [self.browser stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerHTML = %@", originalHTMLWithScriptsInjected]];

脚本好像被注入(inject)了,但是没有运行。

我让它工作的唯一方法是使用 ASIHTTPRequest 库发出实际请求,但后来我在登录表单方面遇到了麻烦,除此之外,在这种情况下我必须发出两次请求。

我可能正在做一些不可能的事情,或者我只是做错了。 那么,我如何使用从 Web 加载的内容在现有 UIWebView 上调用用户脚本?

编辑:

这里有更多代码,包括@rich 提出的更改:

 //
// Run the remaining scripts
//

NSMutableString *scriptTextToInject = [[NSMutableString alloc]init];

//
// Add each script into the page
//

for (Userscript *script in scriptsToExecute) {

//
// Read the userscript
//

NSString *scriptToLoad = [NSString stringWithContentsOfURL:[NSURL URLWithString:script.pathToScript] encoding:NSUTF8StringEncoding error:&error];

NSLog(@"Script to load: %@", scriptToLoad);

[scriptTextToInject appendFormat:@"%@\n\n",scriptToLoad];
}

NSString *documentHeadBefore = [self.browser stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('head')[0].innerHTML"];

//
// Inject the scripts
//

NSString *scriptWrappedInATag = [NSString stringWithFormat:@"window.onload() = function(){var script = document.createElement('script');\n"
"script.charset = 'UTF-8'"
"script.setAttribute(\"type\",\"text/javascript\");\n"
"text = \"function u(){\n"
"%@"
"}\";\n"
"document.getElementsByTagName('head')[0].appendChild(script);}", scriptTextToInject];
NSLog(@"Scripts wrapped in a tag: %@", scriptWrappedInATag);

NSString *runResults = [self.browser stringByEvaluatingJavaScriptFromString:@"u();"];

NSString *documentHeadAfter = [self.browser stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('head')[0].innerHTML"];

NSLog(@"Before: %@ \n\n\n\n After: %@", documentHeadBefore, documentHeadAfter);

最佳答案

下面是一个这样做的例子。在我意识到需要将 js 注入(inject)页面之前,我遇到了同样的问题。要正确注入(inject) js,您需要将其写入 dom 的头部,如下所示。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"function myFunction() { "
"window.scrollTo(100,100)"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];

[webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
}

关于objective-c - 如何在 iOS 上注入(inject)用户脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6963028/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com