質問

Webkitに精通している人が、次のコードが機能しない理由について説明したり、正しい方向を教えてくれたりできますか

私がやろうとしているのは、ページをロードし、ウェブキットにそれを解析させ、タイトルを印刷するだけです。

これは私が持っているものです:

#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;
}

出力はhtmlであり、タイトルは空白です

読んでくれてありがとう

役に立ちましたか?

解決

WebKitはRunLoopに依存してコンテンツを読み込むため、たとえ静的コンテンツであっても機能しません。

次のような標準の実行ループを追加する必要があります。

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

そして、WebFrameLoadDelegate( webView.frameLoadDelegate = thatObject )として設定し、-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame * )frame コールバックを使用すると、DOMにアクセスできるはずです。また、ロードが完了したら、 done フラグをYESに設定します。

他のヒント

HTMLを解析するだけの場合は、WebViewの代わりにNSXMLDocumentを使用してください。 URLがロードされるまで、そのinitWithContentsOfURLイニシャライザーはブロックすると考えています。それでもうまくいかない場合は、URLのNSURLRequestを作成してから、[NSURLConnection sendSynchronousRequest:..]を使用してロードし、NSXMLDocumentにフィードしてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top