WKWebViewの使用(二)

3412 ワード

WKWebViewWKNavigationDelegateの使用について述べましたが、ここで残りのものを説明します.
一、WKUIDelegateの使用WKUIDelegateは、WebKitがユーザインタラクションのための処理エージェントであり、JavaScriptにおけるプロンプトの代わりに原生のプロンプトボックスを使用することができ、JavaScriptにおいてできることは元のものと似ていますが、入力された処理があれば、やはり元のものよりは便利です.Delegateには三つの提示枠の修正が提供されています.Alert、Confirm、Prmpt:
/*     */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    [[[UIAlertView alloc] initWithTitle:@"   " message:message delegate:nil cancelButtonTitle:@"  " otherButtonTitles: nil] show];
    completionHandler();
}
///**     */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
    [[[UIAlertView alloc] initWithTitle:@"   " message:message delegate:nil cancelButtonTitle:@"  " otherButtonTitles: nil] show];

    completionHandler(1);
}
/**      */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
    [[[UIAlertView alloc] initWithTitle:@"   " message:prompt delegate:nil cancelButtonTitle:@"  " otherButtonTitles: nil] show];
 completionHandler(@"   !");
}
この他にもDelegateには2つの方法があります.- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;は、新しいWebViewを作成する際に、設定オブジェクト、ナビゲーション動作オブジェクト、window特性を指定するために使用される.もしこの方法を実現していないならば、リンクをロードすることはできなくて、帰ったのがもとのwebviewだならば崩壊します.- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);この方法は、webViewを閉じるときに呼び出しを行い、環境のクリアなどの動作を行うことができる.
二、ローカルリソースのロードWKWebViewはサポートされていません.直接にWindows中のローカルファイルをロードします.処理しないと、ページが正常に表示されなくなります.個別のhtmlファイルをロードするだけであれば、直接コンテンツを読み込むことができ、- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;方法でロードすることができます.しかし、JSファイルとcssファイルが含まれているなら、次の方法を使わなければなりません.
iOS 9および以上のバージョンのシステムでは、方法- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL;を使用してロードすることができるが、iOS 8システムでは、ローカルリソースのコンテンツをcopyしてからロードしなければならない.

- (NSString *)copyToDocumentPath:(NSString *)urlPath {
    NSString *wkWebViewPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"wkWebView"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:wkWebViewPath]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:wkWebViewPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSString *dstPath = [wkWebViewPath stringByAppendingPathComponent:urlPath];

    if (![[NSFileManager defaultManager] fileExistsAtPath:dstPath]) {
        NSString *srcPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:urlPath];
        [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dstPath error:nil];
    }

    return dstPath;
}