[React Native] react native webview


1. <MapView /> Component API

๐Ÿ˜…์ฐธ์กฐ GitHub - react-native-webview/react-native-webview: React Native Cross-Platform WebView

React Native WebView API Reference

React Native WebView API ์ฐธ์กฐ

์ด ๋ฌธ์„œ๋Š” React Native WebView์˜ ํ˜„์žฌ ๊ณต๊ฐœ๋œ ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ƒ‰์ธ

  • source
  • automaticallyAdjustContentInsets
  • automaticallyAdjustsScrollIndicatorInsets
  • injectedJavaScript
  • injectedJavaScriptBeforeContentLoaded
  • injectedJavaScriptForMainFrameOnly
  • injectedJavaScriptBeforeContentLoadedForMainFrameOnly
  • mediaPlaybackRequiresUserAction
  • nativeConfig
  • onError
  • onRenderProcessGone
  • onLoad
  • onLoadEnd
  • onLoadStart
  • onLoadProgress
  • onHttpError
  • onMessage
  • onNavigationStateChange
  • onContentProcessDidTerminate
  • onScroll
  • originWhitelist
  • renderError
  • renderLoading
  • scalesPageToFit
  • onShouldStartLoadWithRequest
  • startInLoadingState
  • style
  • containerStyle
  • decelerationRate
  • domStorageEnabled
  • javaScriptEnabled
  • javaScriptCanOpenWindowsAutomatically
  • androidLayerType
  • mixedContentMode
  • thirdPartyCookiesEnabled
  • userAgent
  • applicationNameForUserAgent
  • allowsFullscreenVideo
  • allowsInlineMediaPlayback
  • allowsAirPlayForMediaPlayback
  • bounces
  • overScrollMode
  • contentInset
  • contentInsetAdjustmentBehavior
  • contentMode
  • dataDetectorTypes
  • scrollEnabled
  • nestedScrollEnabled
  • setBuiltInZoomControls
  • setDisplayZoomControls
  • directionalLockEnabled
  • geolocationEnabled
  • allowFileAccessFromFileURLs
  • allowUniversalAccessFromFileURLs
  • allowingReadAccessToURL
  • keyboardDisplayRequiresUserAction
  • hideKeyboardAccessoryView
  • allowsBackForwardNavigationGestures
  • incognito
  • allowFileAccess
  • saveFormDataDisabled
  • cacheEnabled
  • cacheMode
  • pagingEnabled
  • allowsLinkPreview
  • sharedCookiesEnabled
  • textZoom
  • pullToRefreshEnabled
  • ignoreSilentHardwareSwitch
  • onFileDownload
  • limitsNavigationsToAppBoundDomains
  • textInteractionEnabled
  • mediaCapturePermissionGrantType
  • autoManageStatusBarEnabled
  • setSupportMultipleWindows
  • basicAuthCredential
  • enableApplePay
  • forceDarkOn
  • useWebView2
  • minimumFontSize
  • downloadingMessage
  • lackPermissionToDownloadMessage
  • allowsProtectedMedia

๋ฉ”์„œ๋“œ ์ƒ‰์ธ

  • goForward
  • goBack
  • reload
  • stopLoading
  • injectJavaScript
  • clearFormData
  • clearCache
  • clearHistory
  • requestFocus
  • postMessage

์ฐธ์กฐ

์†์„ฑ

source

WebView์—์„œ ์ •์  HTML ๋˜๋Š” URI(์„ ํƒ์  ํ—ค๋” ํฌํ•จ)์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ •์  HTML์€ย [originWhitelist](<https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md#originwhitelist>)ย ๋ฅผย ["*"]๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

source์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

URI ๋กœ๋“œ

  • uri(๋ฌธ์ž์—ด) - WebView์—์„œ ๋กœ๋“œํ•  URI์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋˜๋Š” ์›๊ฒฉ ํŒŒ์ผ์ด๋ฉฐ React ์ƒํƒœ ๋˜๋Š” ์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒˆ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • method(๋ฌธ์ž์—ด) - ์‚ฌ์šฉํ•  HTTP ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ GET์ž…๋‹ˆ๋‹ค. Android ๋ฐ Windows์—์„œ ์ง€์›๋˜๋Š” ๋ฐฉ๋ฒ•์€ GET ๋ฐ POST์ž…๋‹ˆ๋‹ค.
  • headers(๊ฐ์ฒด) - ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†กํ•  ์ถ”๊ฐ€ HTTP ํ—ค๋”์ž…๋‹ˆ๋‹ค. Android์—์„œ๋Š” GET ์š”์ฒญ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋” ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • body(๋ฌธ์ž์—ด) - ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†กํ•  HTTP ๋ฐ”๋””์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์œ ํšจํ•œ UTF-8 ๋ฌธ์ž์—ด์ด์–ด์•ผํ•˜๋ฉฐ ์ถ”๊ฐ€ ์ธ์ฝ”๋”ฉ(URL-escaping ๋˜๋Š” base64 ๋“ฑ)์ด ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ์ •ํ™•ํžˆ ์ง€์ •๋œ๋Œ€๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Android ๋ฐ Windows์—์„œ๋Š” POST ์š”์ฒญ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  HTML

_์ •์  HTML ์‚ฌ์šฉ ์‹œ WebView ์†์„ฑย originWhiteListย ๋ฅผย ['_']๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋น„๋””์˜ค ์ž„๋ฒ ๋“œ(์˜ˆ: Twitter ๋˜๋Š” Facebook ๊ฒŒ์‹œ๋ฌผ๊ณผ ๊ฐ™์€)๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ฝ˜ํ…์ธ ์˜ ๊ฒฝ์šฐ ๋น„๋””์˜ค ์žฌ์ƒ์„ ์œ„ํ•ด baseUrl์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.*

  • html(๋ฌธ์ž์—ด) - WebView์— ํ‘œ์‹œํ•  ์ •์  HTML ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
  • baseUrl(๋ฌธ์ž์—ด) - HTML์—์„œ ์ƒ๋Œ€์ ์ธ ๋งํฌ์— ์‚ฌ์šฉ๋  ๊ธฐ๋ณธ URL์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ WebView์—์„œ ๋งŒ๋“ค์–ด์ง„ CORS ์š”์ฒญ์˜ ์›๋ณธ ํ—ค๋”์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย ์•ˆ๋“œ๋กœ์ด๋“œ WebView ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
ํƒ€์ž…ํ•„์ˆ˜
๊ฐ์ฒด์•„๋‹ˆ์š”

automaticallyAdjustContentInsets

WebView์˜ ๋‚ด์šฉ ์ธ์…‹์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜
๋ถ€์šธ์•„๋‹ˆ์š”

automaticallyAdjustsScrollIndicatorInsets

๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”, ํƒญ ๋ฐ” ๋˜๋Š” ๋„๊ตฌ ๋ชจ์Œ ๋’ค์— ์œ„์น˜ํ•œ ์›น ๋ทฐ์˜ ์Šคํฌ๋กค ์ธ๋””์ผ€์ดํ„ฐ ์•ˆ์ชฝ ์—ฌ๋ฐฑ์„ ์กฐ์ •ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. (iOS 13+)

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS(13+)

injectedJavaScript

๋ฌธ์„œ ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์›น ํŽ˜์ด์ง€์— ์‚ฝ์ž…๋  JavaScript๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์ด ์œ ํšจํ•œ ์œ ํ˜• (์˜ˆ: true)์œผ๋กœ ํ‰๊ฐ€๋˜๊ณ  ์˜ˆ์™ธ๋ฅผ throwํ•˜์ง€ ์•Š๋„๋กํ•˜์‹ญ์‹œ์˜ค.

iOS์˜ ๊ฒฝ์šฐย [WKUserScriptInjectionTimeAtDocumentEnd]๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ๋นˆ ์กฐ์น˜๋„ ์•„๋‹ˆ๋ฉดย [onMessage]ย ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
string์•„๋‹ˆ์˜คiOS, Android, macOS, Windows

์ž์„ธํ•œ ๋‚ด์šฉ์€ย JS ๋ฐ Native๊ฐ„ ํ†ต์‹ ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ : Windows๋Š”ย [native support for alerts]๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, alert๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ:

window.location์˜ JSON ๊ฐœ์ฒด๋ฅผย [onMessage]ย ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ฉ”์‹œ์ง€ ๊ฒŒ์‹œ

const INJECTED_JAVASCRIPT = `(function() {
    window.ReactNativeWebView.postMessage(JSON.stringify(window.location));
})();`;

<WebView
  source=
  injectedJavaScript={INJECTED_JAVASCRIPT}
  onMessage={this.onMessage}
/>;

injectedJavaScriptBeforeContentLoaded

๋ฌธ์„œ ์š”์†Œ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ํ›„ ๋‹ค๋ฅธ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์›น ํŽ˜์ด์ง€์— ์‚ฝ์ž…๋  JavaScript๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์ด ์œ ํšจํ•œ ์œ ํ˜• (์˜ˆ: true)์œผ๋กœ ํ‰๊ฐ€๋˜๊ณ  ์˜ˆ์™ธ๋ฅผ throwํ•˜์ง€ ์•Š๋„๋กํ•˜์‹ญ์‹œ์˜ค.

iOS์˜ ๊ฒฝ์šฐย [WKUserScriptInjectionTimeAtDocumentStart]๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ฒฝ๊ณ  Android์—์„œ๋Š” ์ด ๋™์ž‘์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 100% ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์ฐธ์กฐย #1609ย ๋ฐย #1099).

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
string์•„๋‹ˆ์˜คiOS, macOS, Android (์‹คํ—˜์ )

์ž์„ธํ•œ ๋‚ด์šฉ์€ย JS ๋ฐ Native๊ฐ„ ํ†ต์‹ ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์˜ˆ:

window.location์˜ JSON ๊ฐœ์ฒด๋ฅผย [onMessage]ย ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ฉ”์‹œ์ง€ ๊ฒŒ์‹œ. ์ด ๋•Œย window.ReactNativeWebView.postMessageย ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

const INJECTED_JAVASCRIPT = `(function() {
    window.ReactNativeWebView.postMessage(JSON.stringify(window.location));
})();`;

<WebView
  source=
  injectedJavaScriptBeforeContentLoaded={INJECTED_JAVASCRIPT}
  onMessage={this.onMessage}
/>;

injectedJavaScriptForMainFrameOnly

trueย (๊ธฐ๋ณธ๊ฐ’; Android์—์„œ ํ•„์ˆ˜)์ด๋ฉดย injectedJavaScriptย ๋งŒ ๋ฉ”์ธ ํ”„๋ ˆ์ž„์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

falseย (iOS ๋ฐ macOS์—์„œ๋งŒ ์ง€์›)์ด๋ฉด ๋ชจ๋“  ํ”„๋ ˆ์ž„ (์˜ˆ: iframe)์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS ๋ฐ macOS (Android์—์„œ๋Š”ย trueย ๋งŒ ์ง€์›)

injectedJavaScriptBeforeContentLoadedForMainFrameOnly

trueย (๊ธฐ๋ณธ๊ฐ’; Android์—์„œ ํ•„์ˆ˜)์ด๋ฉดย injectedJavaScriptBeforeContentLoadedย ๋งŒ ๋ฉ”์ธ ํ”„๋ ˆ์ž„์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

falseย (iOS ๋ฐ macOS์—์„œ๋งŒ ์ง€์›)์ด๋ฉด ๋ชจ๋“  ํ”„๋ ˆ์ž„ (์˜ˆ: iframe)์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS ๋ฐ macOS (Android์—์„œ๋Š”ย trueย ๋งŒ ์ง€์›)

mediaPlaybackRequiresUserAction

HTML5 ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค๊ฐ€ ์žฌ์ƒ๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ํƒญํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ย true์ž…๋‹ˆ๋‹ค. (Android API ์ตœ์†Œ ๋ฒ„์ „ 17).

์ฐธ๊ณ : ๊ธฐ๋ณธ๊ฐ’ย true๋Š” iOS์—์„œ ์ผ๋ถ€ ๋น„๋””์˜ค๊ฐ€ ๋กœ๋”ฉ ์ค‘์— ๋ฉˆ์ถ”๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ดย false๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS, Android, macOS

nativeConfig

WebView๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋„ค์ดํ‹ฐ๋ธŒ WebView๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

nativeConfigย prop์€ ๋‹ค์Œ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

  • componentย (์•„๋ฌด๊ฑฐ๋‚˜)
  • propsย (๊ฐ์ฒด)
  • viewManagerย (๊ฐ์ฒด)
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
object์•„๋‹ˆ์˜คiOS, Android, macOS

onError

WebView ๋กœ๋“œ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onError={(syntheticEvent) => {
    const { nativeEvent } = syntheticEvent;
    console.warn("WebView error: ", nativeEvent);
  }}
/>

onError์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
code;
description;
didFailProvisionalNavigation;
domain;
loading;
target;
title;
url;

์ฐธ๊ณ : ๋„๋ฉ”์ธ์€ iOS์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

syntheticEvent๋Š”ย syntheticEvent.preventDefault()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


onLoad

WebView ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onLoad={(syntheticEvent) => {
    const { nativeEvent } = syntheticEvent;
    this.url = nativeEvent.url;
  }}
/>

onLoad์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
loading;
target;
title;
url;

onLoadEnd

WebView ๋กœ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onLoadEnd={(syntheticEvent) => {
    // update component to be aware of loading status
    const { nativeEvent } = syntheticEvent;
    this.isLoading = nativeEvent.loading;
  }}
/>

onLoadEnd์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
loading;
target;
title;
url;

onLoadStart

WebView ๋กœ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onLoadStart={(syntheticEvent) => {
    // update component to be aware of loading status
    const { nativeEvent } = syntheticEvent;
    this.isLoading = nativeEvent.loading;
  }}
/>

onLoadStart์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
loading;
target;
title;
url;

onLoadProgress

WebView๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
function์•„๋‹ˆ์˜คiOS, Android, macOS

์˜ˆ:

<WebView
  source=
  onLoadProgress={({ nativeEvent }) => {
    this.loadingProgress = nativeEvent.progress;
  }}
/>

onLoadProgress์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
loading;
progress;
target;
title;
url;

onHttpError

WebView๊ฐ€ http ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : Android API ์ตœ์†Œ ๋ ˆ๋ฒจ 23.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onHttpError={(syntheticEvent) => {
    const { nativeEvent } = syntheticEvent;
    console.warn(
      "WebView received error status code: ",
      nativeEvent.statusCode
    );
  }}
/>

onHttpError์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
description;
loading;
statusCode;
target;
title;
url;

์ฐธ๊ณ : ์„ค๋ช…์€ Android์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


onRenderProcessGone

WebView ํ”„๋กœ์„ธ์Šค๊ฐ€ Android์—์„œ OS์— ์˜ํ•ด ํฌ๋ž˜์‹œ ๋˜๋Š” ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : Android API ์ตœ์†Œ ๋ ˆ๋ฒจ 26. Android ์ „์šฉ

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์˜ˆ:

<WebView
  source=
  onRenderProcessGone={(syntheticEvent) => {
    const { nativeEvent } = syntheticEvent;
    console.warn("WebView Crashed: ", nativeEvent.didCrash);
  }}
/>

onRenderProcessGone์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด ์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

didCrash;

onMessage

WebView๊ฐ€ย window.ReactNativeWebView.postMessage๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด ์ด ๊ธ€๋กœ๋ฒŒ์ด WebView์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

window.ReactNativeWebView.postMessageย ์€ย dataย ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์ด๋ฒคํŠธ ๊ฐœ์ฒด,ย event.nativeEvent.data์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย data๋Š” ๋ฌธ์ž์—ด์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
function์•„๋‹ˆ์˜ค

์ž์„ธํ•œ ๋‚ด์šฉ์€ย JS ๋ฐ Native๊ฐ„ ํ†ต์‹ ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


onNavigationStateChange

WebView ๋กœ๋”ฉ์ด ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
ํ•จ์ˆ˜์•„๋‹ˆ์˜ค

์˜ˆ์ œ:

<WebView
  source=
  onNavigationStateChange={(navState) => {
    // Keep track of going back navigation within component
    this.canGoBack = navState.canGoBack;
  }}
/>

navState ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

canGoBack
canGoForward
loading
navigationType (iOS only)
target
title
url


onContentProcessDidTerminateโฌ†

WebView ์ฝ˜ํ…์ธ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS ๋ฐ macOS WKWebView

iOS Web View๋Š” ์›น ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. WebKit์€ ์ง€์ •๋œ ์›น ๋ทฐ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„์ด ๋ฐฉ๋ฒ•์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, iOS WebViews๋Š” ์•ฑ์˜ ์ด RAM์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์—ด๊ณ ์žˆ๋Š” ์ƒˆ ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์›น๋ทฐ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ:

<WebView
  source=
  onContentProcessDidTerminate={(syntheticEvent) => {
    const { nativeEvent } = syntheticEvent;
    console.warn("Content process terminated, reloading", nativeEvent);
    this.refs.webview.reload();
  }}
/>

onContentProcessDidTerminate์— ์ „๋‹ฌ ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

canGoBack;
canGoForward;
loading;
target;
title;
url;

onScrollโฌ†

WebView์—์„œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS, macOS, Android, Windows

์˜ˆ์ œ:

<Webview
  source=
  onScroll={(syntheticEvent) => {
    const { contentOffset } = syntheticEvent.nativeEvent;
    console.table(contentOffset);
  }}
/>

onScroll์— ์ „๋‹ฌ ๋œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์†์„ฑ์ด์žˆ๋Š” nativeEvent๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” SyntheticEvent์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

contentInset;
contentOffset;
contentSize;
layoutMeasurement;
velocity;
zoomScale;

originWhitelistโฌ†

ํƒ์ƒ‰ ํ•  ์ˆ˜์žˆ๋Š” ์›๋ž˜ ๋ฌธ์ž์—ด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์€ ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ ์ „์ฒด URL์ด ์•„๋‹Œ ๋งŒ ์›๋ž˜์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ ค๊ณ ํ•˜์ง€๋งŒ ์ƒˆ ํŽ˜์ด์ง€๊ฐ€์ด ๋ชฉ๋ก์— ์—†๋Š” ๊ฒฝ์šฐ URL์€ OS์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ—ˆ์šฉ ๋œ ์›๋ณธ์€ โ€œhttp://โ€ ๋ฐ โ€œhttps://โ€œ์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์˜ ๋ฐฐ์—ด์•„๋‹ˆ์˜คiOS, Android, macOS

์˜ˆ์ œ:

//only allow URIs that begin with https:// or git://
<WebView
  source=
  originWhitelist={["https://*", "git://*"]}
/>

renderErrorโฌ†

์˜ค๋ฅ˜๊ฐ€์žˆ์„ ๊ฒฝ์šฐ ํ‘œ์‹œ ํ• ๋ณด๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS, Android, macOS

์˜ˆ์ œ:

<WebView
  source=
  renderError={(errorName) => <Error name={errorName} />}
/>

renderError์— ์ „๋‹ฌ ๋œ ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜์˜ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


renderLoadingโฌ†

๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. startInLoadingState ํ”„๋กœํผํ‹ฐ๋Š” ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS, Android, macOS

์˜ˆ์ œ:

<WebView
  source=
  startInLoadingState={true}
  renderLoading={() => <Loading />}
/>

scalesPageToFitโฌ†

์›น ์ฝ˜ํ…์ธ ๋ฅผ๋ณด๊ธฐ์— ๋งž๊ฒŒ ํ™•๋Œ€ / ์ถ•์†Œํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๋ถˆ๋ฆฌ์–ธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คAndroid

onShouldStartLoadWithRequestโฌ†

์›น ๋ทฐ ์š”์ฒญ์„ ์‚ฌ์šฉ์ž ์ •์˜ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜์—์„œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์š”์ฒญ์„ ๊ณ„์†๋กœ๋“œํ•˜๊ณ  false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด๋กœ๋“œ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

Android์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋กœ๋“œ์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS, Android, macOS

์˜ˆ์ œ:

<WebView
  source=
  onShouldStartLoadWithRequest={(request) => {
    // Only allow navigating within this website
    return request.url.startsWith("<https://reactnative.dev>");
  }}
/>

request ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

title
url
loading
target
canGoBack
canGoForward
lockIdentifier
mainDocumentURL (iOS only)
navigationType (iOS only)
isTopFrame (iOS only)


startInLoadingStateโฌ†

์ฒซ ๋ฒˆ์งธ ๋กœ๋“œ์—์„œ WebView์—์„œ ๋กœ๋”ฉ๋ณด๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค.์ด ํ”„๋กœํผํ‹ฐ๋ฅผ true๋กœ ์„ค์ •ํ•ด์•ผrenderLoadingํ”„๋กœํผํ‹ฐ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS, Android, macOS

styleโฌ†

WebView ์Šคํƒ€์ผ์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•  ์ˆ˜์žˆ๋Š” ์Šคํƒ€์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ :height์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šคํƒ€์ผ์—flex : 0์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).

์œ ํ˜•ํ•„์ˆ˜
์Šคํƒ€์ผ์•„๋‹ˆ์˜ค

์˜ˆ์ œ:

<WebView
  source=
  style=
/>

containerStyleโฌ†

WebView ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•  ์ˆ˜์žˆ๋Š” ์Šคํƒ€์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ :height์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šคํƒ€์ผ์—flex : 0์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).

์œ ํ˜•ํ•„์ˆ˜
์Šคํƒ€์ผ์•„๋‹ˆ์˜ค

์˜ˆ์ œ:

<WebView
  source=
  containerStyle=
/>

decelerationRateโฌ†

์‚ฌ์šฉ์ž๊ฐ€ ์†๊ฐ€๋ฝ์„ ๋—€ ํ›„ ์Šคํฌ๋กค ๋ทฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๊ฐ์†๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋‹จ์ถ•ํ‚ค โ€œnormalโ€๋ฐ โ€œfastโ€๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ๊ฐ UIScrollViewDecelerationRateNormal ๋ฐ UIScrollViewDecelerationRateFast์— ํ•ด๋‹นํ•˜๋Š” iOS ํ•˜์œ„ ์„ค์ •๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜ : 0.998
  • ๋น ๋ฅธ : iOS ์›น๋ณด๊ธฐ์˜ ๊ธฐ๋ณธ๊ฐ’ ์ธ 0.99
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
์ˆซ์ž์•„๋‹ˆ์˜คiOS

domStorageEnabledโฌ†

DOM Storage๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. Android์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คAndroid

javaScriptEnabledโฌ†

WebView์—์„œ JavaScript๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
๋ถ€์šธ์•„๋‹ˆ์˜ค

javaScriptCanOpenWindowsAutomaticallyโฌ†

JavaScript๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์—†์ด ์ฐฝ์„ ์—ด ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜
๋ถ€์šธ์•„๋‹ˆ์˜ค

androidLayerTypeโฌ†

๊ณ„์ธต ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

androidLayerType์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • none (๊ธฐ๋ณธ๊ฐ’) - ๋ณด๊ธฐ์— ๋ ˆ์ด์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • software - ๋ทฐ์— ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ด์–ด๋Š” ๋น„ํŠธ๋งต์œผ๋กœ ์ง€์›๋˜๋ฉฐ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋”๋ผ๋„ Android์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • hardware - ๋ทฐ์— ํ•˜๋“œ์›จ์–ด ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ๋ ˆ์ด์–ด๋Š” ํ•˜๋“œ์›จ์–ด๋ณ„ ํ…์Šค์ฒ˜๋กœ ์ง€์›๋˜๋ฉฐ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด๋ณด๊ธฐ ๊ณ„์ธต ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ Android์˜ ํ•˜๋“œ์›จ์–ด ๋ Œ๋”๋ง ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
TypeRequiredPlatform
stringNoAndroid

mixedContentModeโฌ†

ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ  ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, WebView๋Š” ์•ˆ์ „ํ•œ ์ถœ์ฒ˜์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mixedContentMode์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • never (๊ธฐ๋ณธ๊ฐ’) - WebView๋Š” ์•ˆ์ „ํ•œ ์ถœ์ฒ˜์—์„œ ๋ถˆ์•ˆ์ „ํ•œ ์ถœ์ฒ˜์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • always - WebView๋Š” ์•ˆ์ „ํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์•ˆ์ „ํ•œ ์ถœ์ฒ˜์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • compatibility - WebView๋Š” ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ํ˜„๋Œ€์ ์ธ ์›น ๋ธŒ๋ผ์šฐ์ € ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

thirdPartyCookiesEnabledโฌ†

WebView์—์„œ ํƒ€์‚ฌ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๋กค๋ฆฌํŒ ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‚ท์บฃ ์ดํ•˜ ๋ฒ„์ „์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ€์‚ฌ ์ฟ ํ‚ค๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

userAgentโฌ†

WebView์˜ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS, ์•ˆ๋“œ๋กœ์ด๋“œ, macOS

applicationNameForUserAgentโฌ†

๊ธฐ์กด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. userAgent๋ฅผ ์„ค์ •ํ•˜๋ฉด ์žฌ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS, ์•ˆ๋“œ๋กœ์ด๋“œ, macOS
<WebView
  source=
  applicationNameForUserAgent={"DemoApp/1.1.0"}
/>
// ๊ฒฐ๊ณผ์ ์œผ๋กœ User-Agent๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
// Mozilla/5.0 (Linux; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.021; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36 DemoApp/1.1.0
// Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 DemoApp/1.1.0

allowsFullscreenVideoโฌ†

๋น„๋””์˜ค๋ฅผ ์ „์ฒด ํ™”๋ฉด์œผ๋กœ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

allowsInlineMediaPlaybackโฌ†

HTML5 ๋น„๋””์˜ค๊ฐ€ ์ธ๋ผ์ธ์œผ๋กœ ์žฌ์ƒ๋˜๋Š”์ง€ ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ „์ฒด ํ™”๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋น„๋””์˜ค๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ์žฌ์ƒํ•˜๋ ค๋ฉด ์ด ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ HTML ๋ฌธ์„œ์˜ ๋น„๋””์˜ค ์š”์†Œ์— webkit-playsinline ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

allowsAirPlayForMediaPlaybackโฌ†

AirPlay๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS ๋ฐ macOS

bouncesโฌ†

์ฝ˜ํ…์ธ  ๊ฐ€์žฅ์ž๋ฆฌ์— ๋„๋‹ฌํ•˜๋ฉด WebView๊ฐ€ ํŠ•๊ธฐ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

overScrollModeโฌ†

์˜ค๋ฒ„ ์Šคํฌ๋กค ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

overScrollMode์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • always (๊ธฐ๋ณธ๊ฐ’) - ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ๋Š” ๋ทฐ๋ผ๋ฉด ํ•ญ์ƒ ์˜ค๋ฒ„ ์Šคํฌ๋กค์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • content - ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฐ ๊ฒฝ์šฐ์—๋งŒ ์˜ค๋ฒ„์Šคํฌ๋กค๋ง์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • never - ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ทฐ์—์„œ ์˜ค๋ฒ„ ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

contentInsetโฌ†

์Šคํฌ๋กค ๋ทฐ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ WebView ์ฝ˜ํ…์ธ ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋“ค์–ด๊ฐˆ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ {top: 0, left: 0, bottom: 0, right: 0}์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๊ฐ์ฒด: {top: number, left: number, bottom: number, right: number}์•„๋‹ˆ์˜คiOS

contentInsetAdjustmentBehaviorโฌ†

์ด ์†์„ฑ์€ ์•ˆ์ „ ์˜์—ญ ์‚ฝ์ž…์ด ์Šคํฌ๋กค ๋ณด๊ธฐ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์˜ ๊ธฐ๋ณธ๊ฐ’์€ โ€œneverโ€์ž…๋‹ˆ๋‹ค. iOS 11 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ never์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’:

  • automatic
  • scrollableAxes
  • never
  • always
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS

contentModeโฌ†

๋กœ๋“œํ•  ์ฝ˜ํ…์ธ ์˜ ์œ ํ˜•์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. iOS 13 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ recommended์ž…๋‹ˆ๋‹ค. iPhone ๋ฐ iPad Mini์— ๋ชจ๋ฐ”์ผ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋” ํฐ iPad์—๋Š” ๋ฐ์Šคํฌํ†ฑ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ iPad์—์„œ ๋ฐ์Šคํฌํ†ฑ๊ธ‰ ๋ธŒ๋ผ์šฐ์ง• ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’:

  • recommended
  • mobile
  • desktop
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS

dataDetectorTypesโฌ†

WebView ์ฝ˜ํ…์ธ ์—์„œ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ URL๋กœ ๋ณ€ํ™˜ํ•  ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „ํ™”๋ฒˆํ˜ธ๋งŒ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์œ ํ˜• ๋˜๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dataDetectorTypes์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • phoneNumber
  • link
  • address
  • calendarEvent
  • none
  • all
  • trackingNumber
  • flightNumber
  • lookupSuggestion
์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด ๋˜๋Š” ๋ฐฐ์—ด์•„๋‹ˆ์˜คiOS

scrollEnabledโฌ†

WebView์—์„œ ์Šคํฌ๋กค์ด ํ™œ์„ฑํ™”๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด WebView์ด ์ž…๋ ฅ ํ•„๋“œ ์œ„์— ํ‚ค๋ณด๋“œ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ๋ฌธ์„œ ๋ณธ๋ฌธ์„ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS ๋ฐ macOS

nestedScrollEnabledโฌ†

Android์˜ย ScrollViewย ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๋•Œย WebView์—์„œ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๋ฉดย WebView์—์„œ ์Šคํฌ๋กคํ•  ๋•Œย ScrollView๊ฐ€ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

setBuiltInZoomControlsโฌ†

WebView๊ฐ€ ๋‚ด์žฅ๋œ ์คŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ•€์น˜ ์ œ์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜ค์•ˆ๋“œ๋กœ์ด๋“œ

setDisplayZoomControlsโฌ†

๋‚ด์žฅ ์คŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์ฐธ์กฐ setBuiltInZoomControls)์„ ์‚ฌ์šฉํ•  ๋•Œ WebView๊ฐ€ ํ™”๋ฉด์— ์คŒ ์ปจํŠธ๋กค์„ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คAndroid

directionalLockEnabledโฌ†

ํŠน์ • ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กค์ด ๋น„ํ™œ์„ฑํ™”๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS

showsHorizontalScrollIndicatorโฌ†

WebView์—์„œ ์ˆ˜ํ‰ ์Šคํฌ๋กค ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS, Android, macOS

showsVerticalScrollIndicatorโฌ†

WebView์—์„œ ์ˆ˜์ง ์Šคํฌ๋กค ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS, Android, macOS

geolocationEnabledโฌ†

WebView์—์„œ Geolocation์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. Android์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คAndroid

allowFileAccessFromFileURLsโฌ†

ํŒŒ์ผ ์ฒด๊ณ„ URL์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ ์ฒด๊ณ„ URL์—์„œ ์ฝ˜ํ…์ธ ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS, Android, macOS

allowUniversalAccessFromFileURLsโฌ†

ํŒŒ์ผ ์ฒด๊ณ„ URL์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript๊ฐ€ ์–ด๋–ค ์›๋ณธ์—์„œ๋„ ์ฝ˜ํ…์ธ ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ์ผ ์ฒด๊ณ„ URL์—์„œ ์ฝ˜ํ…์ธ ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
bool์•„๋‹ˆ์˜คiOS, Android, macOS

allowingReadAccessToURLโฌ†

WebView์˜ ํŒŒ์ผ์ด ์Šคํฌ๋ฆฝํŠธ, AJAX ์š”์ฒญ ๋ฐ CSS ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” URL์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ โ€˜file: //โ€™ URL๋กœ ์„ค์ •๋œ source.uri๋ฅผ๋กœ๋“œํ•˜๋Š” WebView์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ source.uri์—์„œ ์ œ๊ณต๋œ URL์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์•ก์„ธ์Šค๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS ๋ฐ macOS

keyboardDisplayRequiresUserActionโฌ†

false์ธ ๊ฒฝ์šฐ ์›น ์ฝ˜ํ…์ธ ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ‚ค๋ณด๋“œ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS

hideKeyboardAccessoryViewโฌ†

true์ธ ๊ฒฝ์šฐ ํ‚ค๋ณด๋“œ ์•ก์„ธ์„œ๋ฆฌ ๋ทฐ (< > ๋ฐ Done)๊ฐ€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS

allowsBackForwardNavigationGesturesโฌ†

true์ธ ๊ฒฝ์šฐ ๊ฐ€๋กœ ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS ๋ฐ macOS

incognitoโฌ†

WebView์˜ ์ˆ˜๋ช… ๋™์•ˆ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS, Android, macOS

allowFileAccessโฌ†

true์ธ ๊ฒฝ์šฐ file://' URI๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คAndroid

saveFormDataDisabledโฌ†

WebView๊ฐ€ ์–‘์‹ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Android API ๋ ˆ๋ฒจ 26 ์ด์ƒ์—์„œ๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋™ ์ฑ„์šฐ๊ธฐ ๊ธฐ๋Šฅ์ด ์–‘์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คAndroid

cacheEnabledโฌ†

WebView๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€๊ธฐ๋ณธ๊ฐ’ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คtrueiOS, Android, macOS

cacheModeโฌ†

์บ์‹œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ํƒ์ƒ‰ ์œ ํ˜•์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํŽ˜์ด์ง€ ๋กœ๋“œ์˜ ๊ฒฝ์šฐ ์บ์‹œ๊ฐ€ ํ™•์ธ๋˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ค์‹œ ์œ ํšจ์„ฑ์ด ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค. ๋’ค๋กœ ํƒ์ƒ‰ํ•  ๋•Œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ค์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  ์บ์‹œ์—์„œ ์ฝ˜ํ…์ธ ๋งŒ ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€์ด ๋™์ž‘์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • LOAD_DEFAULTย - ๊ธฐ๋ณธ ์บ์‹œ ์‚ฌ์šฉ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ํƒ์ƒ‰ ์œ ํ˜•์ด ํŠน์ • ๋™์ž‘์„ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์บ์‹œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„คํŠธ์›Œํฌ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • LOAD_CACHE_ELSE_NETWORKย - ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ๋ผ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์บ์‹œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„คํŠธ์›Œํฌ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • LOAD_NO_CACHEย - ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„คํŠธ์›Œํฌ์—์„œ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • LOAD_CACHE_ONLYย - ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ์—์„œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€๊ธฐ๋ณธ๊ฐ’ํ”Œ๋žซํผ
string์•„๋‹ˆ์˜คLOAD_DEFAULTAndroid

pagingEnabledโฌ†

์ด ์†์„ฑ์ด true์ธ ๊ฒฝ์šฐ ์Šคํฌ๋กค ๋ทฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค ํ•  ๋•Œ ์Šคํฌ๋กค ๋ทฐ์˜ ๊ฒฝ๊ณ„์˜ ๋ฐฐ์ˆ˜์—์„œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS

allowsLinkPreviewโฌ†

๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ชฉ์ ์ง€์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. iOS์—์„œ๋Š” 3D Touch๋ฅผ ์ง€์›ํ•˜๋Š” ๊ธฐ๊ธฐ์—์„œ ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOS 10 ์ดํ›„์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด true์ด๋ฉฐ, ๊ทธ ์ด์ „์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด false์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS ๋ฐ macOS

sharedCookiesEnabledโฌ†

WebView์—์„œ [NSHTTPCookieStorage sharedHTTPCookieStorage]์˜ ๊ณต์œ  ์ฟ ํ‚ค๋ฅผ ๋ชจ๋“  ๋กœ๋“œ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
boolean์•„๋‹ˆ์˜คiOS ๋ฐ macOS

textZoomโฌ†

์‚ฌ์šฉ์ž๊ฐ€ Android ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ธ€๊ผด ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ WebView์—์„œ ์‚ฌ์ดํŠธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ถˆํ•„์š”ํ•œ ์Šค์ผ€์ผ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ textZoom (100) ๋งค๊ฐœ๋ณ€์ˆ˜ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด์ด ๋ถˆํ•„์š”ํ•œ ํšจ๊ณผ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
number์•„๋‹ˆ์˜คAndroid

์˜ˆ:

<WebView textZoom={100} />


pullToRefreshEnabledโฌ†

WebView์—์„œ pull to refresh gesture๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด bounces๊ฐ€ ์ž๋™์œผ๋กœ true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

ignoreSilentHardwareSwitchโฌ†

(only on ios)

true๋กœ ์„ค์ •ํ•˜๋ฉด ํ•˜๋“œ์›จ์–ด silent ์Šค์œ„์น˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: false

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

onFileDownloadโฌ†

์ด ์†์„ฑ์€ iOS ์ „์šฉ์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

iOS 13 ์ด์ƒ: ์›น๋ทฐ๊ฐ€ โ€˜attachmentโ€ฆโ€˜์ด๋ผ๋Š” Content-Disposition ํ—ค๋”๋กœ ๋๋‚˜๋Š” HTTP ์‘๋‹ต URL๋กœ ์ด๋™ํ•˜๋ฉด ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

iOS 8 ์ด์ƒ: MIME ์œ ํ˜•์ด ์›น๋ทฐ์—์„œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉด ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. 13 ์ด์ „์˜ iOS ๋ฒ„์ „์—์„œ๋Š” ์ด๊ฒƒ์ด ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์œ ์ผํ•œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹ค์ œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ์ž์ฒด ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ์›น๋ทฐ๊ฐ€ ํŒŒ์ผ์„ ๋ Œ๋”๋งํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

<WebView
  source=
  onFileDownload={({ nativeEvent: { downloadUrl } }) => {
    // downloadUrl ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  }}
/>
ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS

limitsNavigationsToAppBoundDomainsโฌ†

true์ด๋ฉด WKWebView๊ฐ€ app-bound ๋„๋ฉ”์ธ์œผ๋กœ๋งŒ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ WebKit์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. iOS 14 ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •ํ•˜๋ฉด app-bound ๋„๋ฉ”์ธ์—์„œ ๋ฒ—์–ด๋‚˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„๋Š” โ€œApp-bound domain failureโ€ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ƒˆ๋กœ์šด Info.plist ํ‚ค WKAppBoundDomains๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ 10๊ฐœ์˜ โ€œapp-boundโ€ ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋Š” App-Bound Domains๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

์˜ˆ์‹œ:

<WebView limitsNavigationsToAppBoundDomains={true} />

textInteractionEnabledโฌ†

false์ด๋ฉด WKWebView๊ฐ€ ํ…์ŠคํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. iOS 14.5 ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

์˜ˆ์‹œ:

<WebView textInteractionEnabled={false} />

mediaCapturePermissionGrantType

๋ฏธ๋””์–ด ์บก์ฒ˜ ๊ถŒํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ โ€˜promptโ€™์ด๋ฉฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”Œ๋žซํผ์€ iOS 15 ์ด์ƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’:

  • grantIfSameHostElsePrompt : ๊ถŒํ•œ ์š”์ฒญ์˜ ๋ณด์•ˆ ์›๋ณธ ํ˜ธ์ŠคํŠธ๊ฐ€ WebView์˜ ํ˜„์žฌ URL์˜ ํ˜ธ์ŠคํŠธ์™€ ๊ฐ™์œผ๋ฉด ๊ถŒํ•œ์ด ์ด์ „์— ๋ถ€์—ฌ๋˜์—ˆ์œผ๋ฉด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • grantIfSameHostElseDeny : ๊ถŒํ•œ ์š”์ฒญ์˜ ๋ณด์•ˆ ์›๋ณธ ํ˜ธ์ŠคํŠธ๊ฐ€ WebView์˜ ํ˜„์žฌ URL์˜ ํ˜ธ์ŠคํŠธ์™€ ๊ฐ™์œผ๋ฉด ๊ถŒํ•œ์ด ์ด์ „์— ๋ถ€์—ฌ๋˜์—ˆ์œผ๋ฉด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.
  • deny
  • grant : ๊ถŒํ•œ์ด ์ด์ „์— ๋ถ€์—ฌ๋˜์—ˆ์œผ๋ฉด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
  • prompt

๊ถŒํ•œ์ด ์ด๋ฏธ ๋ถ€์—ฌ๋œ ๊ฒฝ์šฐ์—๋„ ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์˜คiOS

์˜ˆ์‹œ:

<WebView mediaCapturePermissionGrantType={"grantIfSameHostElsePrompt"} />

autoManageStatusBarEnabled

true๋กœ ์„ค์ •ํ•˜๋ฉด ์ƒํƒœ ํ‘œ์‹œ์ค„์ด WebView์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆจ๊ฒจ์ง€๊ฑฐ๋‚˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. false์ด๋ฉด WebView์ด ์ƒํƒœ ํ‘œ์‹œ์ค„์„ ์ „ํ˜€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คiOS

์˜ˆ์‹œ:

<WebView autoManageStatusBarEnabled={false} />

setSupportMultipleWindows

WebView๊ฐ€ ์—ฌ๋Ÿฌ ์ฐฝ์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋Š” Android ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ์•…์„ฑ iframe์ด ์ƒ์œ„ ๋ ˆ์ด์–ด DOM์œผ๋กœ ์ดํƒˆํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ทจ์•ฝ์ ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€๊ธฐ๋ณธ๊ฐ’ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คtrueAndroid

์˜ˆ์‹œ:

<WebView setSupportMultipleWindows={false} />

enableApplePay

true๋กœ ์„ค์ •ํ•˜๋ฉด WebView๊ฐ€ Apple Pay ์ง€์›์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๋ฉด ์›น ์‚ฌ์ดํŠธ๊ฐ€ React Native Webview์—์„œ Apple Pay๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. injectJavaScript, html5 History, sharedCookiesEnabled, injectedJavaScript, injectedJavaScriptBeforeContentLoaded ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Apple Pay Release Note์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์•ฑ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์›น ํŽ˜์ด์ง€๋Š” ๋ช…์‹œ์ ์œผ๋กœ webkit message handler๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  react native ์ชฝ์˜ onMessage ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ด๋ฅผ ์ˆ˜์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

window.webkit.messageHandlers.ReactNativeWebView.postMessage("hello apple pay");
ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€๊ธฐ๋ณธ๊ฐ’ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คfalseiOS

์˜ˆ์‹œ:

<WebView enableApplePay={true} />

forceDarkOn

๋‹คํฌ ํ…Œ๋งˆ ๊ตฌ์„ฑ

์ฐธ๊ณ : force dark ์„ค์ •์€ ์ง€์†์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ฐค<->๋‚ฎ ๋ชจ๋“œ ์ „ํ™˜์€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ๋™์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜๊ณ  ์ƒˆ ๊ฐ’์œผ๋กœ ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋„๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คAndroid

์˜ˆ์‹œ:

<WebView forceDarkOn={false} />

์„ ํƒํ•œ ํ…์ŠคํŠธ ๋‹ค์Œ์— ๋‚˜ํƒ€๋‚˜๋Š” UIMenu์— ์ถ”๊ฐ€๋  ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๊ฐ์ฒด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. onCustomMenuSelection๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๊ฐ์ฒด ๋ฐฐ์—ด: {label: string, key: string}์•„๋‹ˆ์˜คiOS

์˜ˆ์‹œ:

<WebView
  menuItems={[
    { label: "Tweet", key: "tweet" },
    { label: "Save for later", key: "saveForLater" },
  ]}
/>

onCustomMenuSelection

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์ด ์„ ํƒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Native ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ์—๋Š” label, key, selectedText ์„ธ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ • ํ‚ค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
ํ•จ์ˆ˜์•„๋‹ˆ์˜คiOS
<WebView
  menuItems={[
    { label: "Tweet", key: "tweet" },
    { label: "Save for later", key: "saveForLater" },
  ]}
  onCustomMenuSelection={(webViewEvent) => {
    const { label } = webViewEvent.nativeEvent; // ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ์ด๋ฆ„, ์ฆ‰ 'Tweet'
    const { key } = webViewEvent.nativeEvent; // ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ํ‚ค, ์ฆ‰ 'tweet'
    const { selectedText } = webViewEvent.nativeEvent; // ์„ ํƒํ•œ ํ…์ŠคํŠธ
  }}
/>

basicAuthCredential

๊ธฐ๋ณธ ์ธ์ฆ์— ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง€์ •ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

  • username(๋ฌธ์ž์—ด) - ๊ธฐ๋ณธ ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • password(๋ฌธ์ž์—ด) - ๊ธฐ๋ณธ ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธ์ž…๋‹ˆ๋‹ค.
ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€
๊ฐ์ฒด์•„๋‹ˆ์˜ค

useWebView2

๋„ค์ดํ‹ฐ๋ธŒ ์›น๋ทฐ๋กœ WebView ๋Œ€์‹  WinUI WebView2 ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. WebView2 ์ปจํŠธ๋กค์€ Microsoft Edge(Chromium) ๋ Œ๋”๋ง ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” WinUI ์ปจํŠธ๋กค์ž…๋‹ˆ๋‹ค. ์˜ต์…˜์€ ๋Ÿฐํƒ€์ž„์—์„œ ํ† ๊ธ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Fast Refresh๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์˜คWindows

์˜ˆ์‹œ:

<WebView useWebView2={true} />

minimumFontSize

Android๋Š”์ด ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์†Œ ๊ธ€๊ผด ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. 1์—์„œ 72 ์‚ฌ์ด์˜ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ •์ˆ˜. ์ง€์ •๋œ ๋ฒ”์œ„ ์™ธ์˜ ์ˆซ์ž๋Š” ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 8์ž…๋‹ˆ๋‹ค. ๋” ์ž‘์€ ๊ธ€๊ผด ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ „์ฒด ์ฐฝ์„ ํ•œ ํ™”๋ฉด์— ๋งž์ถ”๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€ํ”Œ๋žซํผ
์ˆซ์ž์•„๋‹ˆ์˜คAndroid
<WebView minimumFontSize={1} />

์˜ˆ์‹œ:

downloadingMessage

WebView๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ Toast์— ํ‘œ์‹œ๋˜๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€๋Š” โ€œ๋‹ค์šด๋กœ๋“œ ์ค‘โ€์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์š”Android

lackPermissionToDownloadMessage

์›น๋ทฐ๊ฐ€ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์—†์„ ๋•Œ Toast์— ํ‘œ์‹œ๋˜๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€๋Š” โ€œ์ ‘๊ทผ ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋˜์–ด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ์ €์žฅ์†Œ์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์ฃผ์„ธ์š”.โ€์ž…๋‹ˆ๋‹ค.

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ฌธ์ž์—ด์•„๋‹ˆ์š”Android

allowsProtectedMedia

WebView๊ฐ€ DRM์œผ๋กœ ๋ณดํ˜ธ๋œ ๋ฏธ๋””์–ด๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. /! \์ด ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ํ˜„์žฌ ์›น ํŽ˜์ด์ง€์— ์ด๋ฏธ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ๋กœ๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. /! \

์œ ํ˜•ํ•„์ˆ˜ํ”Œ๋žซํผ
๋ถ€์šธ์•„๋‹ˆ์š”Android

๋ฉ”์†Œ๋“œ

goForward()โฌ†

goForward();

์›น ๋ทฐ์˜ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ํ•œ ํŽ˜์ด์ง€๋ฅผ ์•ž์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

goBack()โฌ†

goBack();

์›น ๋ทฐ์˜ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋’ค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

reload()โฌ†

reload();

ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

stopLoading()โฌ†

stopLoading();

ํ˜„์žฌ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

injectJavaScript(str)โฌ†

injectJavaScript("... javascript string ...");

JavaScript ๋ฌธ์ž์—ด์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ย JS ๋ฐ Native ๊ฐ„์˜ ํ†ต์‹ ย ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

requestFocus()โฌ†

requestFocus();

WebView์— ํฌ์ปค์Šค ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. (TV ์•ฑ์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”!)

postMessage(str)โฌ†

postMessage("message");

WebView์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.ย [onMessage](<https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md#onmessage>)์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

clearFormData()โฌ†

(Android ์ „์šฉ)

clearFormData();

ํ˜„์žฌ ํฌ์ปค์Šค ๋œ ์–‘์‹ ํ•„๋“œ์—์„œ ์ž๋™ ์™„์„ฑ ํŒ์—…์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.ย developer.android.com reference

clearCache(bool)โฌ†

(Android ์ „์šฉ)

clearCache(true);

๋ฆฌ์†Œ์Šค ์บ์‹œ๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์บ์‹œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‹น์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ์ž‘์—…์€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  WebViews์˜ ์บ์‹œ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.ย developer.android.com reference

clearHistory()โฌ†

(Android ์ „์šฉ)

clearHistory();

๋‚ด๋ถ€ ๋ฐฑ / ํฌ์›Œ๋“œ ๋ชฉ๋ก์„ ์ง€์šฐ๋„๋ก์ด WebView์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.ย developer.android.com reference

๊ธฐํƒ€ ๋ฌธ์„œ

์‹œ์ž‘ ๊ฐ€์ด๋“œย ๋ฐย ์‹ฌ์ธต ๊ฐ€์ด๋“œ๋„ ํ™•์ธํ•˜์„ธ์š”.

๋ฒˆ์—ญ

์ด ํŒŒ์ผ์€ ๋‹ค์Œ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.