概要
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()
}
}