Slide 1

Slide 1 text

ϒϥ΢βΞϓϦʰ4NPP[ʱΛ࡞ΔதͰձಘͨ͠ WKWebviewͷ3ͭͷTips Ξεπʔϧגࣜձࣾ Ճ౻༤Ұ

Slide 2

Slide 2 text

ϒϥ΢β͕ݡ͘ͳΔͱ ωοτ͕΋ͬͱָ͘͠ͳΔ

Slide 3

Slide 3 text

ࢸۃͷλϒૢ࡞ ৽نλϒ ੾Γସ͑ ด͡Δ

Slide 4

Slide 4 text

ࣗવݴޠղੳʹΑΔݕࡧ୯ޠ༧ଌ ಡΈࠐΈதʹݴޠղੳ ݕࡧ୯ޠΛ͓͢͢Ί

Slide 5

Slide 5 text

εϚʔτϒοΫϚʔΫ ίϝϯτ͕ಡΊΔ ϒοΫϚʔΫ౤ߘ λΠϜϥΠϯ

Slide 6

Slide 6 text

8FC7JFX͕ਅͬനʹͳΔ໰୊ 1

Slide 7

Slide 7 text

໰୊ɿ ͨ͘͞ΜͷλϒΛ։͘ͱ ΢Σϒϖʔδ͕ਅͬന ʹͳͬͯ͠·͏

Slide 8

Slide 8 text

4BGBSJͰ΋ɺ࠷ۙ։͍ͨλϒ͸͙͢ಡΈࠐΊΔ͚ Ͳɺগ͠લʹ։͍ͨλϒΛ։͜͏ͱ͢ΔͱϦϩʔ υ͕͔͔Δ

Slide 9

Slide 9 text

ݪҼɿ 8,8FCWJFXͷϝϞϦফඅྔ͕ҰఆྔΛ௒͑Δ ͱ04͕উखʹݹ͍σʔλΛ੾Γ཭͍ͯ͘͠

Slide 10

Slide 10 text

ղܾํ๏ɿ +4Ͱ΢Σϒϖʔδͷσʔλ͕ଘࡏ͢Δ͔Λ֬ೝ͠ɺ ଘࡏ͠ͳ͚Ε͹Ϧϩʔυ͢Δ webView.evaluateJavaScript("document.querySele ctor('body').innerHTML") {(result, error) in if error != nil { Ϧϩʔυॲཧ }

Slide 11

Slide 11 text

ϦϯΫͷλονΞοϓͰ͸ͳ͘ λονμ΢ϯΛऔಘ͍ͨ͠ 2

Slide 12

Slide 12 text

໰୊ɿ ௕ԡ͠தͷϑΟʔυόοΫΛฦͨ͢Ίʹɺ ϦϯΫΛλονͨ͠ॠؒʹ%FUFDU͍͕ͨ͠ɺ 8,8FCWJFX%FMFHBUF͸λονΞοϓ͔࣌͠ݺ ͹Εͳ͍ɻ

Slide 13

Slide 13 text

ղܾํ๏ɿ ɾʮλονμ΢ϯͨ͜͠ͱʯͱʮλονͨ͠Ґஔʯ ɹΛωΠςΟϒͰऔಘ ɾλονͨ͠ҐஔʹϦϯΫ͕͋Δ͔Ͳ͏͔Λ+4Ͱ ɹऔಘ

Slide 14

Slide 14 text

UIGestureRecognizerͷαϒΫϥεΛ࡞Γɺ TouchesBeganͰλονμ΢ϯݕ஌ UIGestureRecognizerͰɺλονҐஔऔಘ override func touchesBegan(_ touches: Set, with event: UIEvent) { } let touch = touches.first touchLocation = touch!.location(in: self.view)

Slide 15

Slide 15 text

JSͰࢦఆͷҐஔʹϦϯΫ͕͋Δ͔֬ೝ͢Δ function getURLs(x, y) { var urls = { link: null, image: null }; var e = document.elementFromPoint(x,y); while (e) { var name = e.tagName if (name == 'A') { urls.link = e.getAttribute('href') || null; } e = e.parentNode; } return urls; } LinkDetection.js

Slide 16

Slide 16 text

JSΛWKWebViewʹInject͢Δ class WebViewConfiguration: WKWebViewConfiguration { fileprivate class UserContentController: WKUserContentController { static let sharedInstance = UserContentController() fileprivate override init() { super.init() do { let scriptURL = Bundle.main.path(forResource:”LinkDetection”, ofType: "js") let scriptContent = try String(contentsOfFile: scriptURL!, encoding: String.Encoding.utf8) let script = WKUserScript(source: scriptContent, injectionTime: .atDocumentEnd, forMainFrameOnly: true) addUserScript(script) } catch { print(#function, error) } }

Slide 17

Slide 17 text

௕ԡ͠׬ྃͨ͠Βɺ͖ͬ͞ͷscriptΛ࣮ߦͯ͠λονҐஔʹ ϦϯΫ͕͋Δ͔Λ൑ఆ͢Δ extension WKWebView { internal func getHTMLElementAt(_ point: CGPoint) { let js = "getURLs(\(point.x), \(point.y))” evaluateJavaScript(js) { (urls, error) in url͕͋Ε͹৽͍͠λϒΛ։͘ } } }

Slide 18

Slide 18 text

8,8FC7JFX಺ͷ+4Λσόοά ͍ͨ͠ 3

Slide 19

Slide 19 text

Demo

Slide 20

Slide 20 text

TouchstartΛݕ஌͢Δςετ༻JavascirptΛ WKWebViewʹInject Build (࣮ػͰ΋SimulatorͰ΋) MacͰSafari্ཱͪ͛

Slide 21

Slide 21 text

SafariͰ ։ൃ > Simulator > ΞϓϦ໊ > URLΛબ୒ WebΠϯεϖΫλʔ্ཱ͕͕ͪΔ

Slide 22

Slide 22 text

Simulator / ࣮ػ WebΠϯεϖΫλʔ Tap!

Slide 23

Slide 23 text

8,8FC7JFXΛ࢖ͬͯΑ͔ͬͨ͜ͱ ɾ҆ఆ͍ͯ͠Δ ɾ଎͍ ɾηΩϡϦςΟ͕ݻ͍ ɾλΠτϧɺURLɺϓϩάϨε͕औΕΔ ɾAppleͷܧଓతͳϝϯςφϯε͕ظ଴Ͱ͖Δ ɾ̍ϖʔδͰԿ౓΋Delegateϝιου͕ݺ͹Εͳ͍ ·ͱΊ

Slide 24

Slide 24 text

ϒϥ΢β͕ݡ͘ͳΔͱ ωοτ͕΋ͬͱָ͘͠ͳΔ ΤϯδχΞ͞Μɺେืूதʂ iOS, Rails, Python(ࣗવݴޠॲཧ)