Domanda

Qualcuno che abbia familiarità con il webkit può spiegare o indicarmi la giusta direzione sul perché il seguente codice non funziona

Quello che sto cercando di fare è caricare una pagina, farla analizzare da webkit e semplicemente stampare il titolo.

Ecco cosa ho:

#include <iostream>
#include <WebKit/WebKit.h>

using namespace std;

/*
 Seek Help
*/
int main (int argc, char * const argv[]) {      
    NSAutoreleasePool    *autoreleasepool = [[NSAutoreleasePool alloc] init];

     WebFrame * mainFrame;
     WebView * view = [[WebView alloc] initWithFrame: NSMakeRect (0,0,640,480)];

    mainFrame = [view mainFrame];
    NSString * url = @"http://test.com";
    [[view mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

    NSString * data = @"<html><head><title>testing</title></head><body>tester</body></html>";
    [[view mainFrame] loadHTMLString:data baseURL: nil];

    // NSString * urlString = [[NSString alloc] initWithUTF8String:"<html><head><title>Hello World</title></head><body><p>My first Web page.</p></body></html>"];

    //[[view mainFrame] loadHTMLString:urlString baseURL:nil];    

    NSString * outerHtml = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] innerHTML];

     cout << "Html: " << [outerHtml UTF8String] << endl;

    NSString * title = [view mainFrameTitle];

    cout << "title: " << [title UTF8String] << endl;

    [autoreleasepool release];

     return 0;
}

L'output è sia html che il titolo sono vuoti

Grazie per aver letto

È stato utile?

Soluzione

Non funziona perché WebKit si basa su RunLoop per caricare il contenuto, anche se si tratta solo di contenuto statico.

Devi aggiungere un ciclo di esecuzione standard come:

while (!done) {
    pool = [[NSAutoreleasePool alloc] init];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                             beforeDate:[NSDate distantPast]];
    [pool release];
}

E crea una classe personalizzata che imposti come WebFrameLoadDelegate ( webView.frameLoadDelegate = thatObject ) e nel - (void) webView: (WebView *) mittente didFinishLoadForFrame: (WebFrame * ) frame dovresti essere in grado di accedere al DOM. Inoltre, al termine del caricamento, impostare il flag done su YES.

Altri suggerimenti

Se vuoi solo analizzare l'HTML, perché non usare un NSXMLDocument invece di un WebView. Credo che l'inizializzatore initWithContentsOfURL blocchi fino a quando l'URL non viene caricato. E se non funziona, prova a creare un NSURLRequest per l'URL e quindi usa [NSURLConnection sendSynchronousRequest: ..] per caricarlo e quindi inviarlo a NSXMLDocument.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top