質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

【swift】WebViewで実行している処理をJavaScriptで記載できるのか

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 538

JavaScriptCoreというものを最近知り、勉強したいと思っています。
なかなか調べても良いサンプルなどが出てこなかったので質問させてください。

今、swiftのWebviewで以下のような処理を書いています
1ログイン
2ログインOKであれば、OK処理へ遷移

これをJavaScriptに置き換えることができるのでしょうか?
WebViewのdelegateなどがどうなるのかが理解できておらず、教えていただけるとありがたいです。

今書いているソースを記載します。

import Foundation
import WebKit
import SafariServices
import UIKit

var isOkServiceText = "{\"status\":\"OK\"}"

class IMSWebView: CommonViewController, WKNavigationDelegate {

    //WebViewの生成
    var articleWebView: WKWebView!

    //URL
    var siteUrl: URL!

    // ページURL情報
    var loadedHtmlString: String = ""
    var lastUrl: String = ""

    // 初期ログイン情報
    var isLogin = false

    // インジケータ
    var activityIndicatorView = UIActivityIndicatorView()

    override func viewDidLoad() {

        // viewDidLoad
        super.viewDidLoad()

        // URLの初期設定
        self.siteUrl = URL(string:getOKServiceUrl())

        WKWebsiteDataStore.default().removeData(ofTypes: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeOfflineWebApplicationCache], modifiedSince: Date(timeIntervalSince1970: 0), completionHandler: {})

        // WebViewを生成.
        articleWebView = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
        articleWebView.navigationDelegate = self
        articleWebView.translatesAutoresizingMaskIntoConstraints = false

        // subViewにあったviewを削除
        let subviews = self.view.subviews
        for subview in subviews {
            subview.removeFromSuperview()
        }

        // navigationbarの戻るボタンの非表示
        self.navigationItem.setHidesBackButton(true, animated: false)

        // subViewに加える
        self.view.addSubview(articleWebView)

        // インジケータ生成
        activityIndicatorView.center = view.center
        activityIndicatorView.style = .whiteLarge
        activityIndicatorView.color = .gray
        view.addSubview(activityIndicatorView)
    }

    override func viewWillAppear(_ animated: Bool) {
        // 初期ページのロード
        let request: URLRequest = URLRequest(url: siteUrl)

        //該当ページへジャンプ
        articleWebView.load(request)
        articleWebView.allowsBackForwardNavigationGestures = true

        // インジケータスタート
        activityIndicatorView.startAnimating()
    }

    override func viewWillDisappear(_ animated: Bool) {
        // ローディング中止
        articleWebView.stopLoading()
    }

    //通信終了
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        // インジケータ終了
        self.activityIndicatorView.stopAnimating()

        //cookie取得
        let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
        cookieStore.getAllCookies() { (cookies) in
            for cookie in cookies {
                print("cookie名:\(cookie.name)")
                print("cookieドメイン:\(cookie.domain)")
                //Cookieのセット
                HTTPCookieStorage.shared.setCookie(cookie)
            }
        }

        // WKWebViewで表示されるJSONを取得する
        webView.evaluateJavaScript("document.body.innerText", completionHandler: { (html, error) -> Void in
            if html is String {

                self.loadedHtmlString = (html as! String)
                self.lastUrl = (webView.url?.absoluteString)!

                // dataを取り出す
                var data:Data?

                let replace = self.loadedHtmlString.replace(target: " ", withString: "").replace(target: "\n", withString: "").replace(target: "\r", withString: "").replace(target: "\t", withString: "")

                data = replace.data(using: .utf8)!

                if replace == isOkServiceText {
                    //ログインOK
                    self.goNextView()
                }
            }

        })
    }

    func goNextView(){
        // OK処理へ遷移
    }

    //ネットワークに繋がらない場合など(中断以外)
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        let errorCode = (error as NSError).code

        // インジケータ終了
        self.activityIndicatorView.stopAnimating()

        // エラーメッセージ
        apiErrorDialog("\(Message.TUSHIN_ERROR)\nエラーコード:\(errorCode)")
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る