์น๋ทฐ(WebView) ๊ฐ๋ฐ ์ ์ฉ๊ธฐ
- #WebView
- #Web
- #App
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ๋ ธ๋จธ์ค ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ง์๋ฏผ์ ๋๋ค.
์ด ๊ธ์์๋ ์ ํฌ๊ฐ ๊ฐ๋ฐํ ํ๋กฌ์ฑ๋ ์๋น์ค์์ ์น๋ทฐ ๊ธฐ์ ์ ์ ์ฉํ ๊ฒฝํ์ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค.
์น๋ทฐ๋ ๋ฌด์์ธ์ง, ์ ์น๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์น๋ทฐ๋?
์น๋ทฐ(WebView)๋ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์น ์ฝํ ์ธ ๋ฅผ ํ์ํ ์ ์๋ ์ปดํฌ๋ํธ์ ๋๋ค.
์นํ์ด์ง๋ฅผ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์ ํฌํจ์ํฌ ์ ์์ผ๋ฉฐ, JavaScript์ ๊ฐ์ ์น ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ดํฐ๋ธ ์ฑ์ฒ๋ผ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
๐ ์ฅ์
ํฌ๋ก์ค ํ๋ซํผ ๊ฐ๋ฐ
ํ ๋ฒ์ ๊ฐ๋ฐ๋ก iOS์ Android ๋ชจ๋์์ ๋์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ๋ฐ ๋น์ฉ๊ณผ ์๊ฐ์ ์ ์ฝํ๊ฒ ํด์ค๋๋ค.
๋น ๋ฅธ ์ ๋ฐ์ดํธ
์น ์๋ฒ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ฉด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ฆ์ ์ ๋ฐ์ดํธ๋ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฑ ์คํ ์ด ์ฌ์ฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ ์ฆ๊ฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๋ค์ํ ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ ์ ์์ด ๊ฐ๋ฐ์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๐ ๋จ์
์ฑ๋ฅ ์ด์
๋ค์ดํฐ๋ธ ์ปดํฌ๋ํธ๋ณด๋ค ์น๋ทฐ๊ฐ ๋ ๋ฌด๊ฑฐ์ธ ์ ์์ผ๋ฉฐ, ๋ก๋ฉ ์๊ฐ์ด ๋น๊ต์ ๋๋ฆด ์ ์์ต๋๋ค. HTML, CSS, JS ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ฐ์ ํ์ฑํ๊ณ ๋ ๋๋งํ๋๋ฐ ์๊ฐ์ด ์์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ํ๋ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ ์ ๊ทผ
์น๋ทฐ๋ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์ ๊ทผํ๋ ๋ฐ ์ ํ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด์๋ ์ถ๊ฐ์ ์ธ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ธ๋ฆฟ์ง ์ฝ๋๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์ผ๊ด์ฑ ๋ฌธ์
์๋ก ๋ค๋ฅธ ํ๋ซํผ(iOS, Android)์์ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฐ ํ๋ซํผ์์์ ๋์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ ์ฉํ๊ธฐ
๊ฐ๋ฐ ํ๊ฒฝ ์ธํ
์น๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ ์ ์ ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋จผ์ ์ธํ ํด์ผ ํฉ๋๋ค.
- iOS: Xcode๋ฅผ ์ค์นํ๊ณ , iOS ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ iPhone, iPad ๊ธฐ๊ธฐ์์์ ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
- Android: Android Studio๋ฅผ ์ค์นํ๊ณ , Android ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ค์ํ Android ๊ธฐ๊ธฐ์ ํด์๋์์์ ํ ์คํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. localhost ๋์ 10.0.2.2 ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ์๋ฒ์ ์ ๊ทผํ๋๋ก ์ค์ ํฉ๋๋ค.
์น๊ณผ ์ฑ๊ฐ์ ์ธํฐํ์ด์ค ์ค๊ณ
์น๋ทฐ๋ฅผ ํตํด ์น์ฑ๊ณผ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ๊ฐ ํ๋ซํผ(iOS, Android)์์ ํด๋น ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ปค๋งจ๋ ๋ฑ๋ก ๋ฐ ์คํ ์์
const { runCommand } = createCommandHandler()
.registerCommand<'openBrowser', {url: string}>({
ios({ url }) {
window.webkit.messageHandlers.Fromm.postMessage({
command: 'openBrowser',
url
});
},
android({ url }) {
window.Fromm.openBrowser(url);
},
})
.registerCommand<'openInAppBrowser', {url: string}>(
{
ios({url}) {
window.webkit.messageHandlers.Fromm.postMessage({
command: 'openInAppBrowser',
url
});
},
android({url}) {
window.Fromm.openInAppBrowser(url);
}
}
)
.registerCommand<'closeInAppBrowser'>(
{
ios() {
window.webkit.messageHandlers.Fromm.postMessage({
command: 'closeInAppBrowser'
});
},
android() {
window.Fromm.closeInAppBrowser();
}
}
)
์์ ์ฝ๋๋ openBrowser
, openInAppBrowser
, closeInAppBrowser
๋ผ๋ ์ปค๋งจ๋๋ฅผ ๋ฑ๋กํ๊ณ , ๊ฐ ํ๋ซํผ๋ณ๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํด๋น ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ์ฝ๋์
๋๋ค.
iOS์์๋ window.webkit.messageHandlers
๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ๋ฉ์์ง๋ฅผ ์ ์กํ๊ณ , Android์์๋ window.Fromm
์ ํตํด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
import React from 'react';
...
return (
<ChannelButton onClick={() =>
runCommand({
key: 'openBrowser',
url: 'https://store.frommyarti.com/campaign/channel'
})}
/>
)
React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ ํด๋ฆญ์ openBrowser
์ปค๋งจ๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ runCommand
ํจ์๋ฅผ ํธ์ถํ์ฌ ํน์ URL์ ์ฑ์์ ์ด๋๋ก ์ค์ ํฉ๋๋ค.
์ฑ ๋ฒ์ ์ ๋ฐ๋ฅธ ๋ก์ง ๋ถ๋ฆฌ
์ฑ์ ๋ฒ์ ์ ๋ฐ๋ผ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ด ์์ ๋ ์ ์์ต๋๋ค. ๊ตฌ๋ฒ์ ์ ์ฌ์ฉ์๋ ์ฑ์ ๊ณ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฉด์, ์ต์ ๋ฒ์ ์ ์ฌ์ฉ์์๊ฒ๋ ์๋ก์ด ๊ธฐ๋ฅ ์ ๊ณตํ ์ ์๋๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ผํฉ๋๋ค.
if(checkAppVersion(1.17.0)){
runCommand({
key: 'openPostFanFeed'
});
return;
}
showAlertDialog({
title: '์
๋ฐ์ดํธ ์๋ด',
message:'๋ณด๋ค ๋์ ์๋น์ค ์ด์ฉ์ ์ํด ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค.'
})
checkAppVersion
ํจ์๋ ํ์ฌ ์ฑ์ ๋ฒ์ ์ด 1.17.0 ์ด์์ด๋ฉด ํด๋น ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌ๋ฒ์ ์ฌ์ฉ์์๊ฒ๋ ์
๋ฐ์ดํธ ์๋ด ํ์
์ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
์ฑ ๋ฒ์ ์ ๋ฐ๋ฅธ ์ฝ๋ ๋ถ๋ฆฌ๋ฅผ ํตํด ๋ค์ํ ๋ฒ์ ์ ์ฑ์์ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ์์ ์ ์ธ ๊ธฐ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ๊ฒฝํ ์ผ๊ด์ฑ
์ฌ์ฉ์ ๊ฒฝํ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ ์น๋ทฐ๋ฅผ ํตํด ๊ตฌํ๋ ๋ถ๋ถ์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋ค์ดํฐ๋ธ ๋ถ๋ถ๊ณผ ์ด์ฐ๋ฌ์ง๋๋ก ๊ตฌํํด์ผํฉ๋๋ค. ํ ์คํธ ๋ฉ์์ง์ ๊ฐ์ UI ์์๋ ๋ค์ดํฐ๋ธ ์ฑ๊ณผ ์ ์ฌํ๊ฒ ๊ตฌํํ์ฌ ์ฌ์ฉ์๊ฐ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฝํํ ์ ์๋๋ก ํด์ผํฉ๋๋ค.
ํ ์คํธ
์น๋ทฐ๋ฅผ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง์ ๋ณด์ฅํ๊ธฐ ์ํด ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ ๋๋ก ๋์ํ๋์ง, ๋ค์ํ ๊ธฐ๊ธฐ์ ๊ฐ ์ด์์ฒด์ ๋ฒ์ ์์์ ํธํ์ฑ์ ํ์ธํด์ผํฉ๋๋ค.
์ ํฌ๋ ์ฃผ๋ก ์๋ฎฌ๋ ์ดํฐ์ ์ค์ ๋๋ฐ์ด์ค์์ ์น๊ณผ ์ฑ์ ํตํฉ์ ์ธ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค. ์๋์ผ๋ก ํ ์คํธํ ์์๋ ๋ค์ํ ๊ธฐ๊ธฐ์ ๋ฒ์ ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์๊ฐ์ด ์์๋ ์ ์์ผ๋ฉฐ, ๋ํ ๋์น๋ ์ผ์ด์ค๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
์์ผ๋ก๋ ์๋ํ ํ ์คํธ ๋๊ตฌ๋ฅผ ๋์ ํ์ฌ ์น๋ทฐ ํ ์คํธ๋ฅผ ํจ์จํํ๊ณ ์ ํ์ฑ์ ๋์ด๊ณ ์ ํฉ๋๋ค. ์๋ํ ํ ์คํธ๋ฅผ ํตํด ์์ ์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ฉฐ ๋ ์ ์ํ๊ณ ์ผ๊ด๋ ํ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง ๊ฒ์ ๋๋ค.
๋ง์น๋ฉฐ
์น๋ทฐ๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฐ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ ์ดํดํ๊ณ ์ ์ ํ ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด ๊ธ์์๋ ์น๋ทฐ๋ ๋ฌด์์ธ์ง, ์น๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๊ทธ ์ฅ๋จ์ , ๊ทธ๋ฆฌ๊ณ ์ ์ฉ ๊ณผ์ ์์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ์ดํด๋ณด์์ต๋๋ค. ์น๋ทฐ ๊ฐ๋ฐ์ ๋ํด ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค.
์ง๊ธ ๋ฐ๋ก ํ๋กฌ์ฑ๋์ ๊ฐ์ ํ์ฌ ์๋น์ค๋ฅผ ๊ฒฝํํด๋ณด์ธ์!
๊ฐ์ฌํฉ๋๋ค.