Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自社コンテンツ配信 のためのWebView Tips
Search
Shinji Kobayashi
April 28, 2017
Programming
5.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自社コンテンツ配信 のためのWebView Tips
Swift愛好会 vol18
Shinji Kobayashi
April 28, 2017
More Decks by Shinji Kobayashi
See All by Shinji Kobayashi
5分でできる UITableViewのDrag & Drop
gentlesoft
0
470
実践Protocol-Extension
gentlesoft
0
84
UIKitDynamicsの活用法
gentlesoft
0
610
iOS9のUIKitDynamics
gentlesoft
0
50
SwiftでUIKitDynamics
gentlesoft
0
59
CoreDataによるデータ駆動型プログラミング
gentlesoft
0
200
Other Decks in Programming
See All in Programming
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
550
ふつうのFeature Flag実践入門
irof
7
3.9k
AIで効率化できた業務・日常
ochtum
0
140
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
400
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
240
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
250
JavaDoc 再入門
nagise
1
350
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
110
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
330
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Building AI with AI
inesmontani
PRO
1
1.1k
Become a Pro
speakerdeck
PRO
31
6k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
How STYLIGHT went responsive
nonsquared
100
6.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Transcript
ࣗࣾίϯςϯπ৴ ͷͨΊͷWebView Tips Shinji Kobayashi TOPLOG / Gentlesoft SwiftѪձ vol18
NameɿShinji Kobayashi Twitterɿ@gentlejkov GentleSoft Who are you? http://gentlesoft.net
NameɿShinji Kobayashi Twitterɿ@gentlejkov GentleSoft Who are you? http://gentlesoft.net ดத ετΞআ
Work https://toplog.jp/ TOPLOG iOS Engineer
TOPLOG ࣗࣾͰاըʗ࡞͍ͯ͠Δɺ ΞϓϦʹ࠷దԽͨ͠ϑΝογϣϯهࣄΛ৴
TOPICS • දࣔͷ֦େʗԡ͠ͷϝχϡʔͳͲΛېࢭ ͍ͨ͠ • ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ • ಈըΛࣗಈ࠶ੜ͍ͨ͠ • ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠
• ಛघͳϦϯΫΛઃఆͯ͠ΞϓϦʹಛఆͷಈ ࡞Λ͍ͤͨ͞
TOPICS • දࣔͷ֦େʗԡ͠ͷϝχϡʔͳͲΛېࢭ ͍ͨ͠ • ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ • ಈըΛࣗಈ࠶ੜ͍ͨ͠ • ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠
• ಛघͳϦϯΫΛઃఆͯ͠ΞϓϦʹಛఆͷಈ ࡞Λ͍ͤͨ͞
// બېࢭ͢ΔCSS let css = "body{-webkit-user-select:none;-webkit-user-drag:none;- webkit-touch-callout: none;}" // CSSΛಡΈࠐΜͩHTMLʹద༻͢Δjavascript
let js = "var style = document.createElement('style');" + "style.type = 'text/css';" + "var cssContent = document.createTextNode('\(css)');" + "style.appendChild(cssContent);" + "document.body.appendChild(style);" // javascriptΛϖʔδಡΈࠐΈྃ࣌ʹຖճ࣮ߦ͢ΔΑ͏ઃఆ let noneSelectScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) //WebView࡞ let config = WKWebViewConfiguration() config.userContentController.addUserScript(noneSelectScript) let webView = WKWebView.init(frame: rect, configuration: config) දࣔͷ֦େʗԡ͠ͷϝχϡʔ Λېࢭ͍ͨ͠
// બېࢭ͢ΔCSS let css = "body{-webkit-user-select:none;-webkit-user-drag:none;- webkit-touch-callout: none;}" // CSSΛಡΈࠐΜͩHTMLʹద༻͢Δjavascript
let js = "var style = document.createElement('style');" + "style.type = 'text/css';" + "var cssContent = document.createTextNode('\(css)');" + "style.appendChild(cssContent);" + "document.body.appendChild(style);" // javascriptΛϖʔδಡΈࠐΈྃ࣌ʹຖճ࣮ߦ͢ΔΑ͏ઃఆ let noneSelectScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) //WebView࡞ let config = WKWebViewConfiguration() config.userContentController.addUserScript(noneSelectScript) let webView = WKWebView.init(frame: rect, configuration: config) දࣔͷ֦େʗԡ͠ͷϝχϡʔ Λېࢭ͍ͨ͠ HTMLʹCSS Λࢦఆͯ͠ྑ͍
// બېࢭ͢ΔCSS let css = "body{-webkit-user-select:none;-webkit-user-drag:none;- webkit-touch-callout: none;}" // CSSΛಡΈࠐΜͩHTMLʹద༻͢Δjavascript
let js = "var style = document.createElement('style');" + "style.type = 'text/css';" + "var cssContent = document.createTextNode('\(css)');" + "style.appendChild(cssContent);" + "document.body.appendChild(style);" // javascriptΛϖʔδಡΈࠐΈྃ࣌ʹຖճ࣮ߦ͢ΔΑ͏ઃఆ let noneSelectScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) //WebView࡞ let config = WKWebViewConfiguration() config.userContentController.addUserScript(noneSelectScript) let webView = WKWebView.init(frame: rect, configuration: config) දࣔͷ֦େʗԡ͠ͷϝχϡʔ Λېࢭ͍ͨ͠
// બېࢭ͢ΔCSS let css = "body{-webkit-user-select:none;-webkit-user-drag:none;- webkit-touch-callout: none;}" // CSSΛಡΈࠐΜͩHTMLʹద༻͢Δjavascript
let js = "var style = document.createElement('style');" + "style.type = 'text/css';" + "var cssContent = document.createTextNode('\(css)');" + "style.appendChild(cssContent);" + "document.body.appendChild(style);" // javascriptΛϖʔδಡΈࠐΈྃ࣌ʹຖճ࣮ߦ͢ΔΑ͏ઃఆ let noneSelectScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) //WebView࡞ let config = WKWebViewConfiguration() config.userContentController.addUserScript(noneSelectScript) let webView = WKWebView.init(frame: rect, configuration: config) දࣔͷ֦େʗԡ͠ͷϝχϡʔ Λېࢭ͍ͨ͠
// બېࢭ͢ΔCSS let css = "body{-webkit-user-select:none;-webkit-user-drag:none;- webkit-touch-callout: none;}" // CSSΛಡΈࠐΜͩHTMLʹద༻͢Δjavascript
let js = "var style = document.createElement('style');" + "style.type = 'text/css';" + "var cssContent = document.createTextNode('\(css)');" + "style.appendChild(cssContent);" + "document.body.appendChild(style);" // javascriptΛϖʔδಡΈࠐΈྃ࣌ʹຖճ࣮ߦ͢ΔΑ͏ઃఆ let noneSelectScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) //WebView࡞ let config = WKWebViewConfiguration() config.userContentController.addUserScript(noneSelectScript) config.selectionGranularity = .character let webView = WKWebView.init(frame: rect, configuration: config) NG: දࣔͷ֦େʗԡ͠ͷϝχϡʔ Λېࢭ͍ͨ͠ ͜ͷࢦఆNG
TOPICS • දࣔͷ֦େʗԡ͠ͷϝχϡʔͳͲΛېࢭ ͍ͨ͠ • ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ • ಈըΛࣗಈ࠶ੜ͍ͨ͠ • ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠
• ಛघͳϦϯΫΛઃఆͯ͠ΞϓϦʹಛఆͷಈ ࡞Λ͍ͤͨ͞
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ //WebViewઃఆ let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true
config.userContentController.addUserScript(noneSelectScript) if #available(iOS 10.0, *) { config.mediaTypesRequiringUserActionForPlayback = [] } else { config.requiresUserActionForMediaPlayback = false } //WebView࡞ let config = WKWebViewConfiguration() let webView = WKWebView.init(frame: rect, configuration: config)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ //WebViewઃఆ let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true
config.userContentController.addUserScript(noneSelectScript) if #available(iOS 10.0, *) { config.mediaTypesRequiringUserActionForPlayback = [] } else { config.requiresUserActionForMediaPlayback = false } //WebView࡞ let config = WKWebViewConfiguration() let webView = WKWebView.init(frame: rect, configuration: config) ΠϯϥΠϯಈը࠶ੜΛڐՄ͢Δ
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ //WebViewઃఆ let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true
config.userContentController.addUserScript(noneSelectScript) if #available(iOS 10.0, *) { config.mediaTypesRequiringUserActionForPlayback = [] } else { config.requiresUserActionForMediaPlayback = false } //WebView࡞ let config = WKWebViewConfiguration() let webView = WKWebView.init(frame: rect, configuration: config) ࣗಈ࠶ੜΛڐՄ͢Δ (iOS ʙ9)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ //WebViewઃఆ let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true
config.userContentController.addUserScript(noneSelectScript) if #available(iOS 10.0, *) { config.mediaTypesRequiringUserActionForPlayback = [] } else { config.requiresUserActionForMediaPlayback = false } //WebView࡞ let config = WKWebViewConfiguration() let webView = WKWebView.init(frame: rect, configuration: config) ࣗಈ࠶ੜΛڐՄ͢Δ (iOS 10ʙ)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ <video src=“XXXXX.mp4” autoplay webkit-playsinline playsinline></video>
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ <video src=“XXXXX.mp4” autoplay webkit-playsinline playsinline></video> ࣗಈ࠶ੜͷઃఆ(PC, AndroidؚΉ)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ <video src=“XXXXX.mp4” autoplay webkit-playsinline playsinline></video> ΠϯϥΠϯ࠶ੜͷઃఆ(ʙiOS 9 WebViewͷΈ)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ ಈըΛࣗಈ࠶ੜ͍ͨ͠ <video src=“XXXXX.mp4” autoplay webkit-playsinline playsinline></video> ΠϯϥΠϯ࠶ੜͷઃఆ(iOS 10ʙ, WebView
/ Safari)
ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ NG: ಈըΛࣗಈ࠶ੜ͍ͨ͠ //WebViewઃఆ let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback =
true config.userContentController.addUserScript(noneSelectScript) if #available(iOS 10.0, *) { config.mediaTypesRequiringUserActionForPlayback = [] } else { config.requiresUserActionForMediaPlayback = false } //WebView࡞ let config = WKWebViewConfiguration() let webView = WKWebView.init(frame: rect, configuration: config) ҰൠͷαΠτΛࢀর͢ΔWebViewʹ ઃఆ͠ͳ͍ํ͕ྑ͍
NG: ΠϯϥΠϯͰಈըΛ ࠶ੜͨ͠··ը໘ભҠ͢Δ
ը໘ભҠ͢Δલʹ࠶ੜதͷಈըΛ શͯఀࢭ͢Δ NG: ΠϯϥΠϯͰಈըΛ ࠶ੜͨ͠··ը໘ભҠ͢Δ
ը໘ભҠ͢Δલʹ࠶ੜதͷಈըΛ શͯఀࢭ͢Δ //࠶ੜதͷϜʔϏʔΛఀࢭ͢Δ func stopAllMovie() { let js = "var
v = document.getElementsByTagName('video');" + "for (var i = 0; i < v.length; ++i) { v[i].pause(); }" webView.evaluateJavaScript(js, completionHandler: nil) } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) self.stopAllMovie() }
TOPICS • දࣔͷ֦େʗԡ͠ͷϝχϡʔͳͲΛېࢭ ͍ͨ͠ • ಈըΛΠϯϥΠϯͰ࠶ੜ͍ͨ͠ • ಈըΛࣗಈ࠶ੜ͍ͨ͠ • ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠
• ಛघͳϦϯΫΛઃఆͯ͠ΞϓϦʹಛఆͷಈ ࡞Λ͍ͤͨ͞
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy)
-> Void) { var result = WKNavigationActionPolicy.cancel defer { decisionHandler(result) } guard let url = navigationAction.request.url else { return } if let info = TLConfig.getIndexUrlInfo(url.absoluteString) { // TOPLOGͷURLͰ͋Δ هࣄ༻ͷ7JFX$POUSPMMFSΛ࡞͠/BWJHBUJPO$POUSPMMFSʹPush } else { // ֎෦ͷ63-Ͱ͋Δ ผͷ8FC7JFXΛ࡞͠ϞʔμϧͰදࣔ } ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠
ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠ func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) { var result = WKNavigationActionPolicy.cancel defer { decisionHandler(result) } guard let url = navigationAction.request.url else { return } if let info = TLConfig.getIndexUrlInfo(url.absoluteString) { // TOPLOGͷURLͰ͋Δ هࣄ༻ͷ7JFX$POUSPMMFSΛ࡞͠/BWJHBUJPO$POUSPMMFSʹPush } else { // ֎෦ͷ63-Ͱ͋Δ ผͷ8FC7JFXΛ࡞͠ϞʔμϧͰදࣔ } WKNavigationDelegateͷ decidePolicyFornavigationActionΛ࣮ WebViewͷભҠΛϑοΫ͢Δ
ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠ func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) { var result = WKNavigationActionPolicy.cancel defer { decisionHandler(result) } guard let url = navigationAction.request.url else { return } if let info = TLConfig.getIndexUrlInfo(url.absoluteString) { // TOPLOGͷURLͰ͋Δ هࣄ༻ͷ7JFX$POUSPMMFSΛ࡞͠/BWJHBUJPO$POUSPMMFSʹPush } else { // ֎෦ͷ63-Ͱ͋Δ ผͷ8FC7JFXΛ࡞͠ϞʔμϧͰදࣔ } decisionHandlerʹWKNavigationActionPolicy.cancelΛ ηοτ͢ΔͱભҠ͠ͳ͍
ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠ func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) { var result = WKNavigationActionPolicy.cancel defer { decisionHandler(result) } guard let url = navigationAction.request.url else { return } if let info = TLConfig.getIndexUrlInfo(url.absoluteString) { // TOPLOGͷURLͰ͋Δ هࣄ༻ͷ7JFX$POUSPMMFSΛ࡞͠/BWJHBUJPO$POUSPMMFSʹPush } else { // ֎෦ͷ63-Ͱ͋Δ ผͷ8FC7JFXΛ࡞͠ϞʔμϧͰදࣔ } deferͰηοτ͓ͯ͘͠ͱguardͰఆͨ͠ޙʹ return͢Δ͚ͩͰྑ͍ͷͰॻ͖͍͢
ભҠઌʹΑͬͯը໘ͷಈ࡞Λมߋ͍ͨ͠ func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) { var result = WKNavigationActionPolicy.cancel defer { decisionHandler(result) } guard let url = navigationAction.request.url else { return } if let info = TLConfig.getIndexUrlInfo(url.absoluteString) { // TOPLOGͷURLͰ͋Δ هࣄ༻ͷ7JFX$POUSPMMFSΛ࡞͠/BWJHBUJPO$POUSPMMFSʹPush } else { // ֎෦ͷ63-Ͱ͋Δ ผͷ8FC7JFXΛ࡞͠ϞʔμϧͰදࣔ } URL͕ࣗࣾͷͷ͔Ͳ͏͔Λఆ
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ // ֎෦ͷ63-Ͱ͋Δ switch url.scheme! { case "safari-http": fallthrough
case "safari-https": let str = url.absoluteString guard let url = URL(string: str.substring(from: str.index(str.startIndex, offsetBy: "safari-".characters.count))) else { return } // Safariىಈ UIApplication.shared.openURL(url) case "http": fallthrough case "https": …
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ // ֎෦ͷ63-Ͱ͋Δ switch url.scheme! { case "safari-http": fallthrough
case "safari-https": let str = url.absoluteString guard let url = URL(string: str.substring(from: str.index(str.startIndex, offsetBy: "safari-".characters.count))) else { return } // Safariىಈ UIApplication.shared.openURL(url) case "http": fallthrough case "https": … SafariΛىಈ͢ΔಛघURL
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ // ֎෦ͷ63-Ͱ͋Δ switch url.scheme! { case "safari-http": fallthrough
case "safari-https": let str = url.absoluteString guard let url = URL(string: str.substring(from: str.index(str.startIndex, offsetBy: "safari-".characters.count))) else { return } // Safariىಈ UIApplication.shared.openURL(url) case "http": fallthrough case "https": … URL͔Βsafari-ΛऔΓআ͍ͯ OpenURLͰsafariΛىಈ
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": if navigationAction.targetFrame?.isMainFrame ??
false { // ϝΠϯը໘ͷભҠͷ߹ guard let host = url.host else { return } if directNavigationHosts.index(of: host) != nil { // ભҠ UIApplication.shared.openURL(url) } else { // ֎෦ࢀর༻ϒϥβΛϞʔμϧͰىಈ } } else { // ຒΊࠐΈͷ߹ result = WKNavigationActionPolicy.allow } …
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": if navigationAction.targetFrame?.isMainFrame ??
false { // ϝΠϯը໘ͷભҠͷ߹ guard let host = url.host else { return } if directNavigationHosts.index(of: host) != nil { // ભҠ UIApplication.shared.openURL(url) } else { // ֎෦ࢀর༻ϒϥβΛϞʔμϧͰىಈ } } else { // ຒΊࠐΈͷ߹ result = WKNavigationActionPolicy.allow } … ભҠ͢Δը໘͕ϝΠϯͷ ϑϨʔϜ͔Ͳ͏͔ΛνΣοΫ
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": if navigationAction.targetFrame?.isMainFrame ??
false { // ϝΠϯը໘ͷભҠͷ߹ guard let host = url.host else { return } if directNavigationHosts.index(of: host) != nil { // ભҠ UIApplication.shared.openURL(url) } else { // ֎෦ࢀর༻ϒϥβΛϞʔμϧͰىಈ } } else { // ຒΊࠐΈͷ߹ result = WKNavigationActionPolicy.allow } … ભҠ͍ͤͨ͞HostΛ ϦετΞοϓͯ͠ఆ (itunes.apple.comͳͲ)
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": if navigationAction.targetFrame?.isMainFrame ??
false { // ϝΠϯը໘ͷભҠͷ߹ guard let host = url.host else { return } if directNavigationHosts.index(of: host) != nil { // ભҠ UIApplication.shared.openURL(url) } else { // ֎෦ࢀর༻ϒϥβΛϞʔμϧͰىಈ } } else { // ຒΊࠐΈͷ߹ result = WKNavigationActionPolicy.allow } … SFSafariViewControllerผͷ֎෦ϒϥβ༻ ViewControllerΛϞʔμϧͰදࣔ
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": if navigationAction.targetFrame?.isMainFrame ??
false { // ϝΠϯը໘ͷભҠͷ߹ guard let host = url.host else { return } if directNavigationHosts.index(of: host) != nil { // ભҠ UIApplication.shared.openURL(url) } else { // ֎෦ࢀর༻ϒϥβΛϞʔμϧͰىಈ } } else { // ຒΊࠐΈͷ߹ result = WKNavigationActionPolicy.allow } … iFrameͳͲ
case "http": fallthrough case "https": … case "globalsetting-toplog": //ઃఆΛ։͘ case
"nextpage": //࣍ϖʔδ case "toplog-login": //ϩάΠϯ case "toplog-display-close": //Ϟʔμϧը໘Λด͡Δ … default: //֎෦ΞϓϦΛىಈ UIApplication.shared.openURL(url) } ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ ΞϓϦʹಈ࡞ΛϑΟʔυόοΫ
ಛघͳϦϯΫΛઃఆͯ͠ ΞϓϦʹಛఆͷಈ࡞Λ͍ͤͨ͞ case "http": fallthrough case "https": … case "globalsetting-toplog":
//ઃఆΛ։͘ case "nextpage": //࣍ϖʔδ case "toplog-login": //ϩάΠϯ case "toplog-display-close": //Ϟʔμϧը໘Λด͡Δ … default: //֎෦ΞϓϦΛىಈ UIApplication.shared.openURL(url) } ผΞϓϦͷURLεΩʔϜ
ࠓͤͳ͔ͬͨTOPICS • LINE SDKΛυΩϡϝϯτʹै࣮ͬͯͨ͠ ΒWebViewͰ͕ग़ͨ • WebViewͷcontentInsetͷ᠘ • WebViewͷϩʔυΛૣ͘ݟ͔͚ͤΔ
·ͱΊ •WebViewػೳઃఆ๛ͳͷͰɺΧελϚΠ ζ࣍ୈͰ৭ʑͰ͖·͢ •ϋϚΓͲ͜Ζ͍ͬͺ͍͋ΔͷͰɺҙͯͬ͠ ͍͖ͯ·͠ΐ͏ •ϋϚͬͨΒͲ͔͜Ͱڞ༗ͯ͘͠ΕΔͱتͼ·͢