Как мне внедрить пользовательский скрипт в iOS?

Я работаю над Fahrii , который, по сути, является мобильным браузером с поддержкой пользовательского скрипта. В настоящий момент у меня возникают проблемы с вызовом скриптов на веб-странице, загруженной в UIWebView. Я хотел бы, если возможно, сохранить эти общедоступные API. В противном случае было бы неплохо, по крайней мере, доказать концепцию, чтобы я мог лучше понять, как это работает. Я пытаюсь сделать это с помощью метода webViewDidFinishLoad: .

Я пробовал вводить, считывая содержимое webView (используя JavaScript), а затем загружая его обратно с помощью loadHTML: baseURL: , но это вызывает бесконечную рекурсию. (Завершенная загрузка вызывает внедрение сценария, что, в свою очередь, вызывает завершенную "загрузку".)

Затем я пробовал что-то вроде этого:

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

Кажется, что сценарий внедрен, но не запущен.

Единственный способ заставить это работать - это использовать библиотеку ASIHTTPRequest для выполнения фактических запросов, но затем у меня возникли проблемы с формами входа в систему, кроме которых в этом случае я должен делать каждый запрос дважды.

​​Я могу делать что-то невозможное, или я просто делаю это неправильно. Итак, как я могу вызвать пользовательский сценарий в существующем 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);

13
задан Moshe 28 December 2011 в 16:21
поделиться