WKWebView内で画像を保存するとクラッシュする時の対処方

はじめに

WKWebViewの中で画像を長押しして保存を行うとクラッシュするというバグにぶち当たりました。
ログを見てみるとカメラアクセスのpermissionが足りていないせいでクラッシュしていました。

しかし、そもそも画像は保存しなくて良いのでpermissionを追加せずに画像を保存させなくする対応も調べてみたので一緒にまとめます

解決策1(Permissionを設定する)

info.plistにNSPhotoLibraryAddUsageDescriptionを登録して説明文をつける。

[イメージを保存する]ボタンを押した際に登録した文言がアラートとして表示されます。

解決策2(WebViewで長押しを禁止する)

WKUserContentController()にScriptを追加することでユーザからの操作を制限することが可能です。

以下のコードのように指定をしてあげることでWebView内のコンテンツを長押ししてもポップメニューなどが表示されなくなります。

//WebViewの中で長押しメニューを出さないようにする
let disableCalloutScriptString = "document.documentElement.style.webkitTouchCallout='none';"
let disableCalloutScript = WKUserScript(source: disableCalloutScriptString, injectionTime: .atDocumentEnd, forMainFrameOnly: true)

//ユーザーコンテントのインスタンスを作成し入れる
let userContentController = WKUserContentController()
userContentController.addUserScript(disableCalloutScript)

let webConfig = WKWebViewConfiguration()
//作ったものを設定する
webConfig.userContentController = userContentController
wkWebView = WKWebView(frame: .zero, configuration: webConfig)

参考文献

WKWebView でテキスト選択禁止や長押しによるメニュー表示禁止(TouchCallout)など

iOS(swift)ガワアプリの作成で色々苦労した話

iOS11では画像をアルバム保存するアプリはPrivacyへの追記が必要になりました