4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WKWebViewでTwitter,Facebookログイン

Posted at

概要

WKWebView上で、Twitter,Facebookにログインしたい。
通常Twitter,Facebookログインすると新しいウィンドウを開いてしまうため、ログイン画面へ行けないなど問題がおきてしまう

解決

新しいウィンドウを開くような処理が来たら、WKWebviewを新しく作ってそれでログイン処理させる

ソースファイル元:https://github.com/ppengotsu/ios9WebviewSample

createWebViewWithでウィンドウを開く処理だったら、
wkweviewを新しく作って処理する

ViewController.swift

//
//  PPWKWebViewController.swift
//  ios9WebviewSample
//
//  Created by ppengotsu on 2015/09/07.
//  Copyright © 2015年 ppengotsu. All rights reserved.
//


import UIKit
import WebKit

class PPWKWebViewController: UIViewController{
    
    //WKWebviewを設置するview
    @IBOutlet var baseView:UIView!
    
    //メインのwebview
    var mainWebView: WKWebView!
    
    //ポップウィンドウ用のwkwebview. 普段は非表示。ポップアップ処理があるときのみ表示される
    var popupWindowWebview:WKWebView!
    
    //前の画面で入力されたURL文字列
    var viewUrlString: String = ""
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //ボタン
        //ナビボタン追加
        let rightButton = UIBarButtonItem(title: "閉じる"
            , style:UIBarButtonItemStyle.plain , target: self, action:   #selector(self.touchedCloseButton(_:)))
        self.navigationItem.setRightBarButton(rightButton, animated: true)
        
        
        //キャッシュ系列削除
        self.deleteAllWebviewCache()
        
        
        //メインのwebviewの設定
        self.mainWebView = WKWebView(frame: CGRect(x: 0,
                                                   y: 0,
                                                   width: baseView.frame.width,
                                                   height: baseView.frame.height))
        self.baseView.addSubview(self.mainWebView)
        
        self.mainWebView.uiDelegate = self
        self.mainWebView.navigationDelegate = self
        
        let url: URL = URL(string: viewUrlString)!//前の画面で入力されたURL文字列を設定
        let urlRequest: URLRequest = URLRequest(url: url)
        self.mainWebView.load(urlRequest)
        
    }
    
    override func viewDidLayoutSubviews() {
        self.mainWebView.frame = CGRect(x: 0, y: 0, width: self.baseView.frame.width, height: self.baseView.frame.height)
        
        if(self.popupWindowWebview != nil){
            self.popupWindowWebview.frame = CGRect(x: 0, y: 0, width: self.baseView.frame.width, height: self.baseView.frame.height)
        }
        
        super.viewDidLayoutSubviews()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // MARK:  データ操作系
    
    //wkwebview系列の全てのキャッシュを削除
    //ログイン状態などが解除されます
    func deleteAllWebviewCache(){
         //(参考:http://qiita.com/bbq-all-stars/items/b107693f61278d75bd69)
        
        // WKWebView用キャッシュ削除
        let websiteDataTypes = NSSet(array: [
            WKWebsiteDataTypeDiskCache,
            WKWebsiteDataTypeMemoryCache,
            WKWebsiteDataTypeCookies,
            WKWebsiteDataTypeLocalStorage,
            WKWebsiteDataTypeSessionStorage,
            WKWebsiteDataTypeWebSQLDatabases,
            WKWebsiteDataTypeIndexedDBDatabases,
            WKWebsiteDataTypeOfflineWebApplicationCache])
        WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: Date(timeIntervalSince1970: 0), completionHandler: {})
        
        // アプリ全体のキャッシュをとにかく削除
        let pathArray = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, .userDomainMask, true)
        for path in pathArray {
            //ライブラリディレクトリのキャッシュディレクトリを削除
            try? FileManager().removeItem(atPath: path)
        }
        
        ////ライブラリディレクトリのテンポラリディレクトリを削除
        try? FileManager().removeItem(atPath: NSTemporaryDirectory())
    }
    
    
    // MARK: 外部クラスからの操作系
    
    func setURLString(_ urlString: String){
        
        viewUrlString = urlString
    }
    
    // MARK:   ボタンアクション系
    
    internal func touchedCloseButton(_ sender:UIButton){
        dismiss(animated: true, completion: nil)
    }
}


// MARK:  - WKWebviewのdelegate系列1
extension PPWKWebViewController:WKUIDelegate{
    
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        
        
        //_blank対応 参考:http://qiita.com/milkit/items/a23b0b109f434a28ab8b
        //ウィンドウを開くような処理(例:window.open)がよばれたとき
        if navigationAction.targetFrame == nil {
            
            //ウィンドウを開くところを、メインのwebview以外のwebviewで表示することで、
            //対応する
            if(self.popupWindowWebview != nil){
              self.popupWindowWebview.removeFromSuperview()//前表示していたら削除
            }
            self.popupWindowWebview = WKWebView(frame: CGRect(x: 0,
                                                              y: 0,
                                                              width: self.baseView.frame.width,
                                                              height: self.baseView.frame.height),
                                                configuration: configuration)
            self.popupWindowWebview.uiDelegate = self
            self.popupWindowWebview.navigationDelegate = self
            self.popupWindowWebview.load(navigationAction.request)
            self.baseView.addSubview(self.popupWindowWebview)
            return self.popupWindowWebview
        }
        
        return nil
        
        
        
    }
    
    
    func webViewDidClose(_ webView: WKWebView) {
        print("javascriptでwindow.closeなどが呼ばれた")

        self.popupWindowWebview.removeFromSuperview()
    }
}




// MARK:  - WKWebviewのdelegate系列2
extension PPWKWebViewController:WKNavigationDelegate{
    
    
    //実行中のプロセスが死んだときに呼ばれる
    func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
        print("実行中のプロセスが死にました。リロードします。")
        webView.reload()
    }
}





4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?