Skip to content

Commit bd7118c

Browse files
committed
add post
1 parent a874155 commit bd7118c

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
---
2+
layout: post
3+
title: "[iOS] WKWebView์„ ์ด์šฉํ•œ iOS ์•ฑ๊ณผ ์›นํŽ˜์ด์ง€ ๊ฐ„์˜ ํ†ต์‹  (2) - Control Flow"
4+
tags: [iOS, WKWebView, Javascript, if, switch, statement]
5+
---
6+
{% include JB/setup %}
7+
8+
์ด์ „ ๊ธ€์—์„œ `WKScriptMessageHandler` ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์†Œ๋“œ `func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)`๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์—์„œ iOS ์•ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
9+
10+
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” `userContentController` ๋ฉ”์†Œ๋“œ์—์„œ ๊ตฌํ˜„๋˜๋Š” if ๋ฌธ๊ณผ switch ๋ฌธ๊ณผ ๊ฐ™์€ ํ๋ฆ„์ œ์–ด(Control Flow) ์ฝ”๋“œ๋กœ ์ธํ•ด `WKWebView`์™€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๊ณผ์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
11+
12+
### Control Flow
13+
14+
Swift๋Š” if, switch ๋ฌธ๊ณผ ๊ฐ™์ด ์ œ์–ด๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์›น์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ ๋‹ค์‹œ ์›น์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋“ฑ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
15+
16+
์ œ์–ดํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์–ด๋–ค ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๊ณ„์†ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฐ ๋„๋ฉ”์ธ์—์„œ ํ•„์š”ํ•œ Action์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค๋ฉด `userContentController` ๋Š” ๋งŽ์€ ๋„๋ฉ”์ธ๊ณผ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.
17+
18+
๋‹ค์Œ ์ฝ”๋“œ๋Š” ์›นํŽ˜์ด์ง€์—์„œ ์ „๋‹ฌ๋ฐ›์€ message์˜ action์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
19+
20+
```swift
21+
// WKScriptMessageHandler ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
22+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
23+
guard
24+
message.name == "actionHandler",
25+
let messageBody = message.body as? [String: Any],
26+
let action = messageBody["action"] as? String
27+
else { return }
28+
29+
switch action {
30+
case "loading": loading(body: messageBody)
31+
case "openCard": openCard(body: messageBody)
32+
case "payment": payment(body: messageBody)
33+
case "log": log(body: messageBody)
34+
default: break
35+
}
36+
37+
func loading(body: [String: Any]) {
38+
guard let value = body["show"] as? Bool else { return }
39+
40+
switch value {
41+
case true: ShowLoading()
42+
case false: HideLoading()
43+
}
44+
}
45+
func payment(body: [String: Any]) {
46+
guard
47+
let id = body["paymentId"] as? String
48+
let info = body["paymentInfo"] as? [String: String]
49+
else { return }
50+
51+
cardPayment(paymentId: id, paymentInfo: info)
52+
}
53+
}
54+
```
55+
56+
์œ„ ์ฝ”๋“œ์˜ switch ๋ฌธ์—์„œ loading, openCard, payment, log Action์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ action์€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
57+
58+
์ฆ‰, switch ๋ฌธ์€ ๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์›นํŽ˜์ด์ง€์—์„œ ์ „๋‹ฌ๋ฐ›์€ action์ด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ ธ, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
59+
60+
๊ทธ๋ ‡๋‹ค๋ฉด, ๋‹ค์–‘ํ•œ Action์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?
61+
62+
### Inject Action Handler
63+
64+
`Action`์„ Key๋กœ ์‚ฌ์šฉํ•˜๊ณ , `messageBody`๋ฅผ ๋ฐ›์•„ ์ˆ˜ํ–‰ํ•˜๋Š” `Closure`๋ฅผ ๊ฐ€์ง€๋Š” Dictonary์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
65+
66+
```swift
67+
struct WKScriptMessageActioHandler {
68+
let closure: (_ body: [String: Any], _ webView: WKWebView?) -> Void
69+
}
70+
71+
class ViewController: UIViewController, WKScriptMessageHandler {
72+
var actionHandlers: [String: ActioHandler] = [:]
73+
var webView: WKWebView?
74+
75+
init(actionHandlers: [String : ActioHandler]) {
76+
self.actionHandlers = actionHandlers
77+
78+
super.init(nibName: nil, bundle: nil)
79+
}
80+
...
81+
82+
// WKScriptMessageHandler ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
83+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
84+
guard
85+
message.name == "actionHandler",
86+
let messageBody = message.body as? [String: Any],
87+
let action = messageBody["action"] as? String
88+
else { return }
89+
90+
actionHandlers[action]?.closure(messageBody, webView)
91+
}
92+
}
93+
```
94+
95+
`userContentController` ๋ฉ”์†Œ๋“œ์—์„œ `actionHandlers` Dictionary์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” `WKScriptMessageActioHandler`๋ฅผ ์ฐพ์•„ `closure`๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๊ฐ™์ด switch ๋ฌธ์„ ํ†ตํ•ด action์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์›นํŽ˜์ด์ง€์—์„œ ์ „๋‹ฌ๋ฐ›์€ action์ด ๋งŽ์•„์ง€๋”๋ผ๋„, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
96+
97+
`WKScriptMessageActioHandler`๋Š” Closure๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ๊ฐ ActionHandler๊ฐ€ messageBody์˜ ๊ฐ’์„ ๊ฒ€์ฆํ•˜์—ฌ ์œ ํšจํ•œ ๊ฐ’์ธ ๊ฒฝ์šฐ์—๋งŒ Closure๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”?
98+
99+
๊ทธ ๋‚ด์šฉ์€ ๋‹ค์ŒํŽธ์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

0 commit comments

Comments
ย (0)