Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
自社コンテンツ配信 のためのWebView Tips
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Shinji Kobayashi
April 28, 2017
Programming
5.7k
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
480
実践Protocol-Extension
gentlesoft
0
86
UIKitDynamicsの活用法
gentlesoft
0
620
iOS9のUIKitDynamics
gentlesoft
0
53
SwiftでUIKitDynamics
gentlesoft
0
60
CoreDataによるデータ駆動型プログラミング
gentlesoft
0
200
Other Decks in Programming
See All in Programming
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
430
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.4k
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
130
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
440
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
XHTMLが残したもの
yosuke_furukawa
PRO
2
640
Webの地図
yosuke_furukawa
PRO
5
3.9k
信頼性の目標を誰も求めてない
shubox
0
500
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
230
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
770
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
The browser strikes back
jonoalderson
0
1.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
GitHub's CSS Performance
jonrohan
1033
470k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
9
36k
Building the Perfect Custom Keyboard
takai
2
870
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
The Cult of Friendly URLs
andyhume
79
7k
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ػೳઃఆ๛ͳͷͰɺΧελϚΠ ζ࣍ୈͰ৭ʑͰ͖·͢ •ϋϚΓͲ͜Ζ͍ͬͺ͍͋ΔͷͰɺҙͯͬ͠ ͍͖ͯ·͠ΐ͏ •ϋϚͬͨΒͲ͔͜Ͱڞ༗ͯ͘͠ΕΔͱتͼ·͢