WebView > JavaScript fertig?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • WebView > JavaScript fertig?

    Hallo zusammen,

    ich habe gerade ein altes Projekt ausgegraben, das ich gerne mal fertigstellen möchte.
    Darin habe ich das Problem, dass ich nicht weiß wann ein WebView fertig geladen ist.

    Das WebView selbst sendet am Ende die Info via Delegate und die "reine Website" ist da.
    Leider wird einiges mit JavaScript "nachbearbeitet".

    Kann ich irgendwie prüfen, ob noch ein JavaScript nudelt?
    Das es möglich eines mit Timer sein kann ist mir klar.

    WebView auf macOS…

    Danke.

    Viele Grüße
  • Du könntest, wenn alle JavaScript Scripte durch sind, eine Message an die App senden. Schau Dir mal das Protokol WKScriptMessageHandler an.

    Voraussetzung ist jedoch, dass Du unter macOS den WKWebView und nicht den WebView verwendest. Alternativ gibt es für den WebView vielleicht etwas ähnliches, um auf JavaScript Messages zu reagieren.

    Alternativ suche mal nach WebView und JavaScript Bridge.
  • Teil 1 von x:

    Ungewollt hat sich damit auch ein damaliges Problem gelöst.
    Das Ausgaben von der "Größe" der Website. Falls jemand mal danach sucht, siehe unten.

    Viele Grüße

    C-Quellcode

    1. -(WKWebViewConfiguration*)webViewConfiguration
    2. {
    3. // …
    4. NSString *string = @"window.webkit.messageHandlers.sizeNotification.postMessage({width: document.body.scrollWidth, height: document.body.scrollHeight});";
    5. if([string length] < 1)
    6. {
    7. return nil;
    8. }
    9. // …
    10. WKUserScript *userScript = [[[WKUserScript alloc] initWithSource:string
    11. injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
    12. forMainFrameOnly:YES] autorelease];
    13. if(userScript == nil)
    14. {
    15. return nil;
    16. }
    17. // …
    18. WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    19. if(userContentController == nil)
    20. {
    21. return nil;
    22. }
    23. // …
    24. [userContentController addUserScript:userScript];
    25. [userContentController addScriptMessageHandler:self
    26. name:@"sizeNotification"];
    27. // …
    28. WKWebViewConfiguration *webViewConfiguration = [[[WKWebViewConfiguration alloc] init] autorelease];
    29. if(webViewConfiguration == nil)
    30. {
    31. return nil;
    32. }
    33. // …
    34. [webViewConfiguration setUserContentController:userContentController];
    35. // …
    36. return webViewConfiguration;
    37. // …
    38. }
    39. #pragma mark WKScriptMessageHandler
    40. -(void)userContentController:(WKUserContentController *)userContentController
    41. didReceiveScriptMessage:(WKScriptMessage *)message
    42. {
    43. // …
    44. WKWebView *webView = [message webView];
    45. if(webView != self.contentWebView)
    46. {
    47. return;
    48. }
    49. // …
    50. NSString *string = [message name];
    51. if([string length] < 1)
    52. {
    53. return;
    54. }
    55. // …
    56. if([string isEqualToString:@"sizeNotification"] == YES)
    57. {
    58. [self handleSizeScriptMessage:message];
    59. }
    60. // …
    61. }
    62. #pragma mark Size
    63. -(BOOL)handleSizeScriptMessage:(WKScriptMessage *)message
    64. {
    65. // …
    66. if(message == nil)
    67. {
    68. return NO;
    69. }
    70. // …
    71. id body = [message body];
    72. if(body == nil)
    73. {
    74. return NO;
    75. }
    76. // …
    77. WKWebView *webView = self.contentWebView;
    78. if(webView == nil)
    79. {
    80. return NO;
    81. }
    82. // …
    83. CGSize size = [webView frame].size;
    84. // …
    85. {
    86. // …
    87. id object = [body valueForKey:@"width"];
    88. if([object isKindOfClass:[NSNumber class]] == YES)
    89. {
    90. // …
    91. NSNumber *number = object;
    92. // …
    93. CGFloat value = [number floatValue];
    94. // …
    95. if(value > 1.0)
    96. {
    97. size.width = value;
    98. }
    99. // …
    100. }
    101. // …
    102. }
    103. // …
    104. {
    105. // …
    106. id object = [body valueForKey:@"height"];
    107. if([object isKindOfClass:[NSNumber class]] == YES)
    108. {
    109. // …
    110. NSNumber *number = object;
    111. // …
    112. CGFloat value = [number floatValue];
    113. // …
    114. if(value > 1.0)
    115. {
    116. size.height = value;
    117. }
    118. // …
    119. }
    120. // …
    121. }
    122. // …
    123. [webView setFrameSize:size];
    124. // …
    125. return YES;
    126. // …
    127. }
    Alles anzeigen
  • Ähm, hat schon mal jemand ein WKWebView zu einem PDF gedruckt?
    Gibt leider nur eine weiße Seite…

    Viele Grüße

    C-Quellcode

    1. -(BOOL)writePDFFromWebView:(WKWebView *)webView
    2. {
    3. // …
    4. if(webView == nil)
    5. {
    6. return NO;
    7. }
    8. // …
    9. NSURL *URL = [self logFileURLWithPathExtension:WPFileExtensionPDF];
    10. if(URL == nil)
    11. {
    12. return NO;
    13. }
    14. // …
    15. NSRect rect = [webView frame];
    16. NSSize size = rect.size;
    17. // …
    18. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
    19. if(mutableDictionary == nil)
    20. {
    21. return NO;
    22. }
    23. // …
    24. [mutableDictionary setObject:NSPrintSaveJob
    25. forKey:NSPrintJobDisposition];
    26. [mutableDictionary setObject:URL
    27. forKey:NSPrintJobSavingURL];
    28. // …
    29. NSPrintInfo *printInfo = [[NSPrintInfo alloc] initWithDictionary:mutableDictionary];
    30. if(printInfo == nil)
    31. {
    32. return NO;
    33. }
    34. // …
    35. [printInfo setPaperSize:size];
    36. [printInfo setTopMargin:0.0];
    37. [printInfo setLeftMargin:0.0];
    38. [printInfo setRightMargin:0.0];
    39. [printInfo setBottomMargin:0.0];
    40. // …
    41. NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:webView
    42. printInfo:printInfo];
    43. if(printOperation == nil)
    44. {
    45. return NO;
    46. }
    47. // …
    48. [printOperation setShowsPrintPanel:NO];
    49. [printOperation setShowsProgressPanel:NO];
    50. // …
    51. [printOperation runOperation];
    52. // …
    53. return YES;
    54. // …
    55. }
    Alles anzeigen