# Javascript 웹뷰 API 문서

스윙투앱에서 제공하는 웹뷰와 푸시전용 프로토타입의 앱을 제어할 수 있는 javascript API 입니다.

공통적으로 아래의 js 파일을 include 하여 사용하시고 아래의 API 명세를 통해서

필요한 기능을 실행하시면 됩니다.

{% hint style="info" %}
공통 js 파일 HTML 파일에 아래의 js 파일을 포함시켜주세요
{% endhint %}

{% code overflow="wrap" %}

```html
<script src="https://pcdn2.swing2app.co.kr/swing_public_src/v3/2026_03_31_001/js/swing_app_on_web.js"></script>
```

{% endcode %}

## 웹뷰 Javascript API 명세서

## 웹뷰 제어관련 Method

### • 웹뷰 뒤로가기  <a href="#back-webview" id="back-webview"></a>

웹뷰에서 이전 페이지로 이동 웹브라우저에서 뒤로가기 기능과 동일한 동작

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.webview.back();
```

{% endcode %}

### • 웹뷰 앞으로 가기 <a href="#forward-webview" id="forward-webview"></a>

웹뷰에서 앞의 페이지로 이동 웹브라우저에서 앞으로가기 기능과 동일한 동작

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.webview.forward();
```

{% endcode %}

### • 웹뷰 홈으로 이동 <a href="#go-to-home" id="go-to-home"></a>

웹뷰에서 스윙투앱에 셋팅된 홈 페이지(설정된 초기 페이지)로 이동하는 기능

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.webview.navigateToHome()
```

{% endcode %}

### • 웹뷰 캐시 초기화 <a href="#webview-clear-cache" id="webview-clear-cache"></a>

웹뷰에서 캐시를 초기화 하는 Command

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.webview.clearCache()
```

{% endcode %}

### • 웹뷰 Navigation History 초기화 <a href="#webview-clear-routh-history" id="webview-clear-routh-history"></a>

웹뷰에서 Navigation History 를 초기화하는 기능

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.webview.clearWebViewRouteHistory()
```

{% endcode %}

## 툴바 제어관련 Method <a href="#toolbar" id="toolbar"></a>

### • 툴바 활성화 설정하기 <a href="#toolbar-setting" id="toolbar-setting"></a>

푸시전용 프로토타입에서 Toolbar 를 API 통해서 제어할 수 있습니다.

앱 실행상태에서 툴바를 숨기거나 활성화 그리고 자동 숨김 옵션까지 모두 제어할 수 있습니다.&#x20;

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
// toolbar 활성화 , 자동숨김 비활성화 
// swingWebViewPlugin.app.webview.updateToolbar(true,false)
// toolbar 활성화 , 자동숨김 활성화 
// swingWebViewPlugin.app.webview.updateToolbar(true,true)
// toolbar 비활성화 , 자동숨김 비활성화 
// swingWebViewPlugin.app.webview.updateToolbar(false,false)
swingWebViewPlugin.app.webview.updateToolbar(false,false)
```

{% endcode %}

## 어플리케이션 관련 Method

### • 플랫폼 정보 가져오기 <a href="#get-platform-info" id="get-platform-info"></a>

웹상에서 플랫폼 정보를 가져오기 위한 함수

{% code lineNumbers="true" %}

```javascript
if( swingWebViewPlugin.app.methods.getCurrentPlatform() == 'android' )
{
    console.log('android');
}
else if( swingWebViewPlugin.app.methods.getCurrentPlatform() == 'ios' )
{
    console.log('ios');
}
else
{
    console.log('web browser');
}
```

{% endcode %}

### • 버전 및 기기정보 가져오기 <a href="#get-version-device-info" id="get-version-device-info"></a>

앱의 버전및 기기의 H/W 그리고 S/W 정보를 가져오는 함수

{% code lineNumbers="true" %}

```javascript
// android
swingWebViewPlugin.app.methods.getAppVersion(function(value){
    var appVersion = JSON.parse(value);

    console.log('model : ' + appVersion.model);
    console.log('sdk_version : ' + appVersion.sdk_version);
    console.log('version_release : ' + appVersion.version_release);
    console.log('manufacturer : ' + appVersion.manufacturer);
    console.log('app_version : ' + appVersion.app_version);
    console.log('radio_version : ' + appVersion.radio_version);
    console.log('package_name : ' + appVersion.package_name);
    console.log('uuid : ' + appVersion.uuid);
    console.log('deviceToken : ' + appVersion.device_token);
});

// ios
swingWebViewPlugin.app.methods.getAppVersion(function(value){
    var appVersion = JSON.parse(value);
    
    console.log('model : ' + appVersion.model);
    console.log('name : ' + appVersion.name);
    console.log('systemVersion : ' + appVersion.systemVersion);
    console.log('appVersion : ' + appVersion.appVersion);
    console.log('bundleVersion : ' + appVersion.bundleVersion);
    console.log('bundleID : ' + appVersion.bundleID);
    console.log('uuid : ' + appVersion.uuid);
    console.log('deviceToken : ' + appVersion.deviceToken);
});
```

{% endcode %}

### • 앱 종료 기능 <a href="#how-to-exit-app" id="how-to-exit-app"></a>

&#x20;실행중인 앱을 종료하는 명령어

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.doExitApp();
```

{% endcode %}

### • 외부 브라우저로 URL 실행하기 <a href="#open-external-browser-specific-url" id="open-external-browser-specific-url"></a>

크롬 또는 사파리등 앱의 기본 브라우저로 특정 페이지를 열고 싶을때 아래의 함수를 이용할 수 있다.

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.doExternalOpen('https://www.swing2app.com');
```

{% endcode %}

### • 내장 브라우저로 URL 실행하기 <a href="#open-browser-specific-url" id="open-browser-specific-url"></a>

안드로이드와 iOS 자체적으로 제공하는 앱 내장 브라우저를 이용해서 실행

크롬과 사파리등을 반드시 이용해야 하는 경우 아래의 코드를 통해서 앱 내부에서 크롬과 사파리를 호출 할 수 있다.

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.openBrowser('https://www.swing2app.com');
```

{% endcode %}

### • 현재 페이지를 공유하기 <a href="#share-current-page" id="share-current-page"></a>

현재 웹 페이지를 공유하는 기능을 위한 아래의 코드를 실행

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.doShareCurrentPage();
```

{% endcode %}

### • 지정 URL 공유하기 <a href="#share-specific-url" id="share-specific-url"></a>

지정한 URL을 공유하고자 할 경우 아래와 같이 코드를 실행

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.doShareWithUrl('https://www.swing2app.com');
```

{% endcode %}

### • 어플리케이션의 알림 설정 상태를 확인하기 <a href="#set-notification" id="set-notification"></a>

어플리케이션에서 푸시 알람 설정에 대한 상태를 확인하는 기능

푸시가 비활성화 되었을 경우 OS 자체적으로 푸시가 Off 되었을 경우와

앱 자체적인 설정으로 Off 가 되었을경우를 확인할 수 있다.

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.isNotificationEnabled(function (result) {
    if( result == '1' ) // 푸시를 발송 할 수 있는 상태
    {
        console.log('push active');
    }
    else if( result == 'off_on_permission' )    // android 13 이상에서 푸시 권한이 없을 경우
    {
        console.log('push inactive');    
    }
    else if( result == 'off_on_system' )    // 시스템 설정에 의한 앱 푸시 비활성화
    {
        console.log('push inactive');
    }
    else if( result == 'off_on_app' )       // 앱 설정에 의한 앱 푸시 비활성화
    {
        console.log('push inactive');
    }
});
```

{% endcode %}

Ex:) 푸시 설정에 따라 Off 설정일 경우 활성화 권장을 위한 코드예제

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.isNotificationEnabled(function (result) {
    if( result == '1' ) // 푸시를 발송 할 수 있는 상태
    {
        console.log('push active');
    }
    else if( result == 'off_on_permission' )    // android 13 이상에서 푸시 권한이 없을 경우
    {
        console.log('push inactive');    
        swingWebViewPlugin.app.permission.android.requestPermission('android.permission.POST_NOTIFICATIONS', function(status) {
            if (status == 'granted') {
                console.log('Push notification permission granted');
            } else {
                console.log('Push notification permission denied');
            }
        });        
    }
    else if( result == 'off_on_system' )    // 시스템 설정에 의한 앱 푸시 비활성화
    {
        console.log('push inactive');
        swingWebViewPlugin.app.methods.goToNotificationSetting("system"); // 시스템 설정 Open
    }
    else if( result == 'off_on_app' )       // 앱 설정에 의한 앱 푸시 비활성화
    {
        console.log('push inactive');
        swingWebViewPlugin.app.screen.setting.show();    // 앱 설정 Open
    }
});
```

{% endcode %}

### • 알람 설정 이동하기 <a href="#go-to-set-notification" id="go-to-set-notification"></a>

어플리케이션 또는 시스템의 알람설정을 이동할 수 있는 기능

(1) 어플리케이션 자체적인 알람 설정을 할 수 있는 화면으로 이동

```javascript
swingWebViewPlugin.app.screen.setting.show();
```

(2) 시스템(안드로이드, iOS) 자체적인 알람 설정을 할 수 있는 화면으로 이동

```javascript
swingWebViewPlugin.app.methods.goToNotificationSetting('system');
```

### • 클립보드에 텍스트 저장하기 <a href="#clipboard-write" id="clipboard-write"></a>

클립보드에 텍스트를 저장할 수 있는 기능

웹뷰에서는 보안상의 이슈로 window\.navigator.clipboard.writeText API 가 정상동작하지 않기 때문에

스윙투앱 웹뷰에서는 아래의 API 를 이용하여 clipboard 에 저장하면 됩니다.

```javascript
swingWebViewPlugin.app.methods.copyToClipboard("copyToClipboard 텍스트 테스트");
```

### • 푸시메시지 수신 활성화 하기 <a href="#active-push" id="active-push"></a>

푸시메시지 수신설정을 활성화 하기 위한 API

```javascript
swingWebViewPlugin.app.methods.activePush();
```

### • 푸시메시지 수신 비활성화 하기  <a href="#inactive-push" id="inactive-push"></a>

푸시메시지 수신설정을 비활성화 하기 위한 API

```javascript
swingWebViewPlugin.app.methods.inactivePush();
```

### • 디바이스에 변수 저장하기 <a href="#save-localstorage" id="save-localstorage"></a>

앱내에 Storage 변수 저장하기

앱내의 Storage 저장하고 싶은 데이터가 있다면 아래의 함수를 이용해서 저장할 수 있습니다.

다음 기능을 활용해서 웹 사이트 자동 로그인을 쉽게 구현할 수 있습니다.

<mark style="background-color:blue;">\*js lib 2025\_02\_14\_001 버전으로 업데이트 됨</mark>

{% code lineNumbers="true" %}

```javascript
// 앱과 웹 모두 사용할 경우
swingWebViewPlugin.app.methods.setVariable('id','test', {type : 'app_n_web'}); // 앱과 웹에 모두 저장
// 앱에만 데이터를 저장할 경우
swingWebViewPlugin.app.methods.setVariable('id','test', {type : 'app'}); // 앱에만 저장

// 'app_n_web' 앱과 웹 모두 저장할 경우 앱이 아닌 웹 환경에서도 loadVariable 호출할 경우 localStorage 를 통해 값을 가져올 수 있습니다.
// 'app' 으로 사용할 경우 앱 환경에서만 저장되며, 웹 환경에서는 loadVariable 호출할 경우 값은 null이 반환됩니다.
```

{% endcode %}

### • (New)디바이스에 저장된 변수 불러오기 <a href="#load-localstorage" id="load-localstorage"></a>

앱내에 Storage 저장된 변수값 가져오기

변수값을 저장할때 setVariable 함수의 옵션에 따라 앱 또는 웹 저장소에 저장된 값을 가져오게 됩니다.

<mark style="background-color:blue;">\*js lib 2025\_02\_14\_001 버전 부터 사용 가능, 2025년 2월 14일 이후 제작된 앱에서만 실행가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.loadVariable('id',function(value) {
    console.log(value);
    // 출력예시 : test
});
```

{% endcode %}

### • (Old)디바이스에 저장된 변수 불러오기 <a href="#load-localstorage" id="load-localstorage"></a>

앱내에 Storage 저장된 변수값 가져오기

웹에서는 callback 함수가 실행되지 않으며 앱으로 구동 되었을때만 callback 함수가 실행됩니다.

<mark style="background-color:blue;">\*js lib 2023\_12\_20\_001 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.getVariable('id',function(value) {
    console.log(JSON.parse(value).value);
    // 출력예시 : test
});
```

{% endcode %}

### • TTS 재생하기(프리미엄 기능) - 커스터마이징 필요 <a href="#speak-tts" id="speak-tts"></a>

텍스트를 음성으로 출력하는 TTS 기능을 활성화하는 기능&#x20;

<mark style="background-color:blue;">\*js lib 2023\_12\_20\_001 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.speakOutViaTTS('안녕하세요');
```

{% endcode %}

### • 앱 첫 실행 여부 확인하기 <a href="#check-first-run" id="check-first-run"></a>

앱이 처음실행 했는지는 확인할 수 있는 API , 앱의 첫 실행여부를 판단하는 함수

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_001 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.isFirstRun(function (value) {
    if (JSON.parse(value).result) // 앱 첫실행 될 경우
    {
        console.log('앱 첫 실행');
    }
});
```

{% endcode %}

### • 앱 리뷰 요청하기  <a href="#open-review" id="open-review"></a>

사용자에게 앱 리뷰를 요청하는 기능을 호출하는 함수

\*iOS 에서 리뷰 요청기능에 대한 호출 제한이 있어 호출 제한이 걸릴 경우 앱스토어 이동하도록 처리되어있습니다.

<mark style="background-color:blue;">\*js lib 2025\_03\_14\_001 버전 부터 사용 가능, 25년 3월 14일 앱 제작 이후에 만든앱 부터 동작합니다.</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.methods.doOpenReview();
```

{% endcode %}

<figure><img src="https://684031119-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FmsJj00k8mj8AcVpnn9Xs%2Fuploads%2FsAF1AQRoHoTYkfpJdIlI%2F%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B71.png?alt=media&#x26;token=390ab5b1-5323-44c9-9a66-ce8c5431d470" alt=""><figcaption><p>앱에서 리뷰 기능을 호출한 화면</p></figcaption></figure>

## 앱 UI 제어관련 Method <a href="#ui-control" id="ui-control"></a>

### • iOS 배경색상 설정하기 <a href="#change-ios-backcolor" id="change-ios-backcolor"></a>

&#x20;iOS 의 디바이스 노치 및 홈바 UI 로 인해 설정된 SafeArea 영역 및 메인 색상을 설정하는 옵션입니다.

색상은 hex 값으로 #을 제외하고 입력해주시면 됩니다. 해당 설정은 iOS 에서만 동작합니다.

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_001 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.ui.setIosBackColor('00ff00');
```

{% endcode %}

### • 앱 화면모드 확인하기(다크모드,라이트모드) <a href="#device-ui-mode" id="device-ui-mode"></a>

시스템에서 설정한 화면 모드(라이트모드,다크모드)를 확인하는 코드 입니다.

이 코드를 활용해서 사용자의 폰에 설정된 화면모드에 따라 웹페이지 컨텐츠를 변경해보세요.

<mark style="background-color:blue;">\*js lib 2024\_07\_23\_001 버전 부터 사용 가능(24년 7월30일 이후 제작된 버전부터 동작)</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.ui.getDeviceUiStyle(function (mode) {
    if( mode == 'light' )
    {
        console.log('light');        
    }
    else if( mode == 'dark' )
    {
        console.log('dark');
    }
});
```

{% endcode %}

### •  상태바 감추기(Android) <a href="#hide-statusbar" id="hide-statusbar"></a>

안드로이드에서 상태바를 가리고 전체화면으로 변경하는 명령.

( wifi,배터리,이동통신 표시 등)

<mark style="background-color:blue;">\*js lib 2025\_07\_04\_001 버전 부터 사용 가능(25년 7월4일 이후 제작된 버전부터 동작)</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.ui.hideStatusBar();
```

{% endcode %}

### •  상태바 보여주기(Android) <a href="#show-statusbar" id="show-statusbar"></a>

안드로이드에서 상태바를 보여주도록 변경하는 명령.

( wifi,배터리,이동통신 표시 등)

<mark style="background-color:blue;">\*js lib 2025\_07\_04\_001 버전 부터 사용 가능(25년 7월4일 이후 제작된 버전부터 동작)</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.ui.showStatusBar();
```

{% endcode %}

## 앱 화면 제어관련 Method <a href="#screen-control" id="screen-control"></a>

### • 설정화면으로 이동하기 <a href="#go-to-setting" id="go-to-setting"></a>

설정화면으로 이동하는 API Command.

툴바 또는 메뉴바를 이용하지 않고 설정화면으로 이동할 수 있습니다.

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.screen.setting.show();
```

{% endcode %}

### • 알림목록화면으로 이동하기 <a href="#go-to-notification-list" id="go-to-notification-list"></a>

알림목록화면으로 이동하는 API Command.

툴바 또는 메뉴바를 이용하지 않고 알림목록화면으로 이동할 수 있습니다.

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.screen.notificationList.show();
```

{% endcode %}

### • 메뉴화면으로 이동하기 <a href="#go-to-menu" id="go-to-menu"></a>

메뉴화면으로 이동하는 API Command.

툴바를 이용하지 않고 메뉴화면으로 이동할 수 있습니다.

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.screen.menu.show();
```

{% endcode %}

### • 북마크목록화면으로 이동하기 <a href="#go-to-bookmark-list" id="go-to-bookmark-list"></a>

북마크목록화면으로 이동하는 API Command.

메뉴 또는 툴바를 이용하지 않고 북마크목록화면으로 이동할 수 있습니다.

<mark style="background-color:blue;">\*js lib 2024\_02\_28\_002 버전 부터 사용 가능</mark>

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.screen.bookmarkList.show();
```

{% endcode %}

## 어플리케이션 Event

앱의 Native Event 를 관리할 수 있는 명령어 입니다.

### • 안드로이드 앱 Back key 웹뷰 Navigation 이벤트 추가하기 <a href="#add-event-exit-app" id="add-event-exit-app"></a>

앱의 Back 버튼의 종료 이벤트를 추가할 경우 Back버튼을 인한  뒤로가기 기능이 동작하지 않습니다.

따라서 backEvent 추가할 경우 Back key 로 인해 웹뷰 Navigation Back되는 상황에서 뒤로가기 기능이&#x20;

동작하지 않고 직접 구현해주셔야 합니다.

```javascript
swingWebViewPlugin.event.addEvent('backEvent' , function() {
    // 안드로이드 back event 
    swingWebViewPlugin.app.webview.back(); // 웹뷰 뒤로가기 예시
})
```

### • 안드로이드 앱 Back key로 인해 종료 이벤트 추가하기 <a href="#add-event-back-key" id="add-event-back-key"></a>

앱의 back 버튼의 종료 이벤트를 추가할 경우 back버튼을 인한 앱에서는 종료 기능이 동작하지 않습니다.

따라서 backExitEvent 추가할 경우 종료에 대한 처리를 callback 함수내에서 직접 구현해야 합니다.

```javascript
swingWebViewPlugin.event.addEvent('backExitEvent' , function() {
    // 앱 종료 Logic 직접 구현
    swingWebViewPlugin.app.methods.doExitApp();    // 앱 종료 Command 호출 예시
});
```

## 어플리케이션 권한제어 Method <a href="#permission-control" id="permission-control"></a>

Android 및 iOS 플랫폼에서 웹뷰를 사용하여 권한을 요청하고 확인하는 방법을 설명합니다.&#x20;

아래의 예제 코드와 함께 권한을 요청하고 확인하는 방법을 안내합니다.

<mark style="background-color:blue;">\*js lib 2024\_07\_23\_001 버전 부터 사용 가능</mark>

<mark style="background-color:blue;">\*앱은 2024년 7월 23일 제작된 버전 이후부터 사용가능</mark>

### • 권한 요청 (Android) <a href="#permission-request-android" id="permission-request-android"></a>

**각 권한별 파라미터 설명**

* **카메라**: `android.permission.CAMERA`
* **위치**: `android.permission.ACCESS_FINE_LOCATION`
* **푸시 알림**: `android.permission.POST_NOTIFICATIONS` (Andriod 13 이상에서 사용)
* **마이크**: `android.permission.RECORD_AUDIO`

각 권한별로 호출 예시(Ex:카메라 권한 요청)

```javascript
swingWebViewPlugin.app.permission.android.requestPermission('android.permission.CAMERA', function(status) {
    if (status == 'granted') {
        console.log('Camera permission granted');
    } else {
        console.log('Camera permission denied');
    }
});
```

위치 권한 요청

```javascript
swingWebViewPlugin.app.permission.android.requestPermission('android.permission.ACCESS_FINE_LOCATION', function(status) {
    if (status == 'granted') {
        console.log('Location permission granted');
    } else {
        console.log('Location permission denied');
    }
});
```

\*사용자가 권한을 거부한 경우

사용자가 권한 요청을 거부한 경우, 이후 동일한 권한 요청 시 시스템에서 팝업을 표시하지 않습니다.&#x20;

사용자는 시스템 설정에서 권한을 수동으로 허용해야 합니다.

### • 권한 확인 (Android) <a href="#permission-check-android" id="permission-check-android"></a>

**각 권한별 파라미터 설명**

* **카메라**: `android.permission.CAMERA`
* **위치**: `android.permission.ACCESS_FINE_LOCATION`
* **푸시 알림**: `android.permission.POST_NOTIFICATIONS` (Andriod 13 이상에서만 사용가능)
* **마이크**: `android.permission.RECORD_AUDIO`

**권한 확인 후 권한이 없는 경우 요청하는 코드 예시**

카메라 권한 확인 후 요청

```javascript
swingWebViewPlugin.app.permission.android.checkPermission('android.permission.CAMERA', function(status) {
    if (status == 'granted') {
        console.log('Camera permission already granted');
    } else {
        swingWebViewPlugin.app.permission.android.requestPermission('android.permission.CAMERA', function(status) {
            if (status == 'granted') {
                console.log('Camera permission granted');
            } else {
                console.log('Camera permission denied');
            }
        });
    }
});
```

**권한이 없을 경우 메시지 처리 예시**

```javascript
swingWebViewPlugin.app.permission.android.checkPermission('android.permission.CAMERA', function(status) {
    if (status == 'granted') {
        console.log('Camera permission already granted');
    } else {
        alert('Camera permission is required to use this feature.');
        swingWebViewPlugin.app.permission.android.requestPermission('android.permission.CAMERA', function(status) {
            if (status == 'granted') {
                console.log('Camera permission granted');
            } else {
                console.log('Camera permission denied');
            }
        });
    }
});

```

모든 callback 의 결과는 granted 와 denied 로 return 값을 제공

### • 권한 요청 (iOS) <a href="#permission-request-ios" id="permission-request-ios"></a>

**각 권한별 파라미터 설명**

* **카메라**: `'camera'`
* **위치**: `'location'`
* **푸시 알림**: `'push'`
* **앨범**: `'album'`
* **마이크**: `'microphone'`
* **사용자 추적**: `'userTracking'`

각 권한별로 호출 예시(Ex:카메라 권한 요청)

```javascript
swingWebViewPlugin.app.permission.ios.requestPermission('camera', function(status) {
    if (status == 'granted') {
        console.log('Camera permission granted');
    } else {
        console.log('Camera permission denied');
    }
});
```

위치 권한 요청

```javascript
swingWebViewPlugin.app.permission.ios.requestPermission('location', function(status) {
    if (status == 'granted') {
        console.log('Location permission granted');
    } else {
        console.log('Location permission denied');
    }
});

```

\*사용자가 권한을 거부한 경우

사용자가 권한 요청을 거부한 경우, 이후 동일한 권한 요청 시 시스템에서 팝업을 표시하지 않습니다.&#x20;

사용자는 시스템 설정에서 권한을 수동으로 허용해야 합니다.

### • 권한 확인 (iOS) <a href="#permission-check-ios" id="permission-check-ios"></a>

**각 권한별 파라미터 설명**

* **카메라**: `'camera'`
* **위치**: `'location'`
* **푸시 알림**: `'push'`
* **앨범**: `'album'`
* **마이크**: `'microphone'`
* **사용자 추적**: `'userTracking'`

**권한 확인 후 권한이 없는 경우 요청하는 코드 예시**

카메라 권한 확인 후 요청

```javascript
swingWebViewPlugin.app.permission.ios.checkPermission('camera', function(status) {
    if (status == 'granted') {
        console.log('Camera permission already granted');
    } else {
        swingWebViewPlugin.app.permission.ios.requestPermission('camera', function(status) {
            if (status == 'granted') {
                console.log('Camera permission granted');
            } else {
                console.log('Camera permission denied');
            }
        });
    }
});
```

**권한이 없을 경우 메시지 처리 예시**

```javascript
swingWebViewPlugin.app.permission.ios.checkPermission('camera', function(status) {
    if (status == 'granted') {
        console.log('Camera permission already granted');
    } else {
        alert('Camera permission is required to use this feature.');
        swingWebViewPlugin.app.permission.ios.requestPermission('camera', function(status) {
            if (status == 'granted') {
                console.log('Camera permission granted');
            } else {
                console.log('Camera permission denied');
            }
        });
    }
});

```

userTracking 제외하고는 모두 granted 와 denied 로 return 값을 제공

**사용자 추적 권한 요청(userTracking)**&#x20;

userTracking 권한의 경우 좀 더 다양한 return 값을 제공한다.(requestPermission 도 동일)

```javascript
swingWebViewPlugin.app.permission.ios.checkPermission('userTracking', function(status) {
    if (status == 'granted') {
        console.log('User tracking permission granted');
    } else if (status == 'denied') {
        console.log('User tracking permission denied');
    } else if (status == 'unset_desc') {
        console.log('User tracking usage description not set in Info.plist');
    } else if (status == 'unset_os') {
        console.log('User tracking not supported on this iOS version');
    }
});
```

이와 같이 권한 요청 및 확인 기능을 사용하여 웹뷰에서 Android 및 iOS 플랫폼의 다양한 권한을 관리할 수 있습니다.&#x20;

필요에 따라 각 플랫폼에 맞는 권한을 요청하고 확인하여 사용자 경험을 향상시키세요.

## 추가 기능 API <a href="#additional-functions" id="additional-functions"></a>

웹사이트에서 직접 앱내의 애드몹 광고를 관리할 수 있는 명령어 입니다.

아래의 내용을 참고하셔서 광고들을 활용해보세요.

{% hint style="info" %}
반드시 애드몹이 활성된 앱의 경우만 동작하는 명령어 입니다.
{% endhint %}

### • 애플 아이디로 로그인하기 구현 <a href="#apple-signin" id="apple-signin"></a>

애플에서는 외부 로그인(예:네이버,카카오,구글 등)이 존재할 경우 반드시 애플 로그인을 제공해야 합니다.

복잡한 애플 로그인 구현을 앱의 네이티브 API 를 활용하면 손쉽게 단 몇줄로 애플 로그인을 구현하실 수 있습니다.

해당 코드는 네이티브 API 를 활용한것이기 때문에 <mark style="background-color:yellow;">**iOS 에서만 동작합니다.**</mark>

<mark style="background-color:blue;">\*js lib 2024\_12\_23\_001 버전 부터 사용 가능</mark>

**로그인 처리(Front-end 처리 방식)**

```javascript
swingWebViewPlugin.app.ios.doAppleSignIn(function (result) {
    if( result.result )
    {
        // 로그인 성공
        // 개인정보에 해당하는 정보는 최초 로그인 1회만 제공되며, 이후에는 userId 와 authTime 만 제공됩니다.
        var loginTokenResult = swingWebViewPlugin.utils.parseJWT(result.identityToken);
        var loginResult = {
            fullName : result.fullName,
            givenName : result.givenName,
            familyName : result.familyName,
            email : loginTokenResult.email,
            userId : loginTokenResult.sub,
            authTime : loginTokenResult.auth_time
        }

        console.log(JSON.stringify(loginResult));
        alert(JSON.stringify(loginResult));
    }
    else
    {
        alert('로그인 실패');
    }
});
```

**로그인 처리(Back-end 처리 방식)**

```javascript
swingWebViewPlugin.app.ios.doAppleSignIn(function (result) {
    if( result.result )
    {
        // 로그인 성공
        // 개인정보에 해당하는 정보는 최초 로그인 1회만 제공되며, 이후에는 userId 와 authTime 만 제공됩니다.
        // 파라미터로 전달된 identifyToken 을 서버에서 복호화해서 아래의 데이터를 가져와 로그인 및 회원가입을 처리한다.
        // fullName, givenName, familyName, email, userId, authTime
        location.href = '/loginWithApple?token=' + result.identityToken;
    }
    else
    {
        alert('로그인 실패');
    }
});
```

**identityToken 처리 방법(Server-Side)**

전달된 identifyToken 은 JWT(Java JSON Web Token) 형식으로  암호화 되어있습니다.

각 언어별로 JWT 토큰 파싱 방법은 쉽게 검색할 수 있습니다.

```javascript
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;

public class DecoderMain {
    public static void main(String[] args) {
        // 테스트용 JWT (실제 토큰 사용 시 변경)
        String identityToken = "identifyToken 값";  

        // 토큰 디코딩 및 값 추출
        Map<String, Object> loginResult = decodeIdentityToken(identityToken);

        // 결과 출력
        System.out.println("Decoded Identity Token Data:");
        loginResult.forEach((key, value) -> System.out.println(key + " : " + value));
    }

    public static Map<String, Object> decodeIdentityToken(String token) {
        Map<String, Object> result = new HashMap<>();

        try {
            // JWT는 "header.payload.signature" 형태이므로, 두 번째 부분(payload)만 추출
            String[] parts = token.split("\\.");
            if (parts.length < 2) {
                throw new IllegalArgumentException("유효하지 않은 JWT 형식");
            }

            // Base64Url 디코딩 (패딩 처리)
            String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]));

            // JSON 파싱 (JDK 기본 기능만 사용할 경우 직접 String 파싱 필요)
            JSONObject json = new JSONObject(payloadJson);

            // 필요한 정보 추출
            result.put("fullName", json.optString("fullName", null));
            result.put("givenName", json.optString("given_name", null));
            result.put("familyName", json.optString("family_name", null));
            result.put("email", json.optString("email", null));
            result.put("userId", json.optString("sub", null));
            result.put("authTime", json.optLong("auth_time", 0));

        } catch (Exception e) {
            System.err.println("토큰 디코딩 오류: " + e.getMessage());
        }

        return result;
    }
}

```

## 디바이스 관련 Method <a href="#device-method" id="device-method"></a>

### 진동 실행하기 <a href="#do-vibration" id="do-vibration"></a>

디바이스 진동을 실행하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 진동
swingWebViewPlugin.app.device.vibrate();

// 진동 시간 지정 (Android만 효과)
swingWebViewPlugin.app.device.vibrate({ duration: 500 });

// 패턴 진동 [대기, 진동, 대기, 진동, ...]
swingWebViewPlugin.app.device.vibrate({ pattern: [100, 200, 100, 400] });

// iOS Haptic 타입 사용 (light, medium, heavy, success, warning, error)
swingWebViewPlugin.app.device.vibrate({ type: 'success' });
```

| Parameter | 타입     | 필수 | 기본값       | 설명                                                            |
| --------- | ------ | -- | --------- | ------------------------------------------------------------- |
| duration  | Number | N  | 200       | 진동 지속 시간 (ms) - Android만 지원                                   |
| pattern   | Array  | N  | -         | 진동 패턴 배열                                                      |
| type      | String | N  | 'default' | iOS Haptic 타입 (light, medium, heavy, success, warning, error) |

## 토스트/알림 관련 Method <a href="#toast-method" id="toast-method"></a>

### 토스트 메시지 표시하기 <a href="#show-toast-message" id="show-toast-message"></a>

화면에 토스트 메시지를 표시하는 기능. 커스텀 위치, 색상을 지원합니다.

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 토스트
swingWebViewPlugin.app.ui.showToast('저장되었습니다.');

// 상단 토스트 + 커스텀 스타일
swingWebViewPlugin.app.ui.showToast('새 메시지가 도착했습니다.', {
    duration: 3000,
    position: 'top',
    backgroundColor: '#4CAF50',
    textColor: '#FFFFFF'
});

// 중앙 토스트
swingWebViewPlugin.app.ui.showToast('로딩 중...', {
    position: 'center',
    duration: 5000
});
```

| Parameter       | 타입     | 필수 | 기본값       | 설명                        |
| --------------- | ------ | -- | --------- | ------------------------- |
| message         | String | Y  | -         | 표시할 메시지                   |
| duration        | Number | N  | 2000      | 표시 시간 (ms)                |
| position        | String | N  | 'bottom'  | 'top', 'center', 'bottom' |
| backgroundColor | String | N  | '#333333' | 배경색 (hex)                 |
| textColor       | String | N  | '#FFFFFF' | 텍스트 색상 (hex)              |

## 키보드 제어 관련 Method <a href="#keypad-method" id="keypad-method"></a>

### 키보드 숨기기 <a href="#hide-keypad" id="hide-keypad"></a>

소프트 키보드를 숨기는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.keyboard.hide();

// 폼 제출 후 키보드 숨기기 예시
document.getElementById('myForm').addEventListener('submit', function(e) {
    e.preventDefault();
    swingWebViewPlugin.app.keyboard.hide();
});
```

### 키보드 표시 상태 확인하기 <a href="#keypad-status-check" id="keypad-status-check"></a>

키보드가 현재 표시되어 있는지 확인하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.keyboard.isVisible(function(isVisible) {
    console.log('키보드 표시 상태:', isVisible);
});
```

## QR코드/바코드 관련 Method <a href="#qrcode-method" id="qrcode-method"></a>

### QR/바코드 스캔하기 <a href="#scan-qr-code" id="scan-qr-code"></a>

QR코드/바코드 스캐너를 실행하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 스캔
swingWebViewPlugin.app.scanner.scan({}, function(result) {
    if (result.success) {
        console.log('스캔된 데이터:', result.data);
        console.log('포맷:', result.format);
    } else if (result.cancelled) {
        console.log('사용자가 취소했습니다.');
    } else {
        console.error('스캔 실패:', result.error);
    }
});

// QR코드만 스캔
swingWebViewPlugin.app.scanner.scan({
    type: 'qr',
    title: '출석 QR 스캔',
    beepOnScan: true,
    vibrateOnScan: true
}, function(result) {
    if (result.success) {
        processAttendance(result.data);
    }
});
```

| Parameter     | 타입      | 필수 | 기본값     | 설명                     |
| ------------- | ------- | -- | ------- | ---------------------- |
| type          | String  | N  | 'all'   | 'qr', 'barcode', 'all' |
| title         | String  | N  | '코드 스캔' | 스캐너 화면 타이틀             |
| beepOnScan    | Boolean | N  | true    | 스캔 시 비프음               |
| vibrateOnScan | Boolean | N  | true    | 스캔 시 진동                |

**Callback 결과:**

| 파라미터      | 타입      | 설명                          |
| --------- | ------- | --------------------------- |
| success   | Boolean | 성공 여부                       |
| data      | String  | 스캔된 데이터                     |
| format    | String  | 코드 포맷 (QR\_CODE, EAN\_13 등) |
| cancelled | Boolean | 사용자 취소 여부                   |
| error     | String  | 에러 메시지 (실패 시)               |

### QR코드 표시하기 <a href="#show-qr-code" id="show-qr-code"></a>

QR코드를 화면에 팝업으로 표시하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 QR코드 표시
swingWebViewPlugin.app.qr.show('https://myapp.com/profile/12345');

// 커스텀 옵션
swingWebViewPlugin.app.qr.show('https://payment.example.com/pay?order=ABC123', {
    title: '결제 QR코드',
    size: 300,
    closeButtonText: '확인'
});
```

| Parameter       | 타입     | 필수 | 기본값  | 설명              |
| --------------- | ------ | -- | ---- | --------------- |
| data            | String | Y  | -    | QR코드에 인코딩할 데이터  |
| size            | Number | N  | 250  | QR코드 크기 (dp/pt) |
| title           | String | N  | -    | 다이얼로그 타이틀       |
| closeButtonText | String | N  | '닫기' | 닫기 버튼 텍스트       |

## 이미지/PDF 뷰어 관련 Method <a href="#image-pdf-method" id="image-pdf-method"></a>

### 이미지 뷰어 열기 <a href="#open-image-viewer" id="open-image-viewer"></a>

전체 화면 이미지 뷰어를 표시하는 기능. 줌, 스와이프 네비게이션을 지원합니다.

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 단일 이미지
swingWebViewPlugin.app.viewer.showImage('https://example.com/photo.jpg');

// 여러 이미지 (갤러리)
swingWebViewPlugin.app.viewer.showImage([
    'https://example.com/photo1.jpg',
    'https://example.com/photo2.jpg',
    'https://example.com/photo3.jpg'
], {
    startIndex: 1,
    showPageIndicator: true,
    showThumbnails: true
});
```

| Parameter         | 타입           | 필수 | 기본값       | 설명                |
| ----------------- | ------------ | -- | --------- | ----------------- |
| images            | String/Array | Y  | -         | 이미지 URL 또는 URL 배열 |
| startIndex        | Number       | N  | 0         | 시작 이미지 인덱스        |
| showPageIndicator | Boolean      | N  | true      | 페이지 인디케이터 표시      |
| showThumbnails    | Boolean      | N  | false     | 썸네일 목록 표시         |
| backgroundColor   | String       | N  | '#000000' | 배경색               |

### PDF 뷰어 열기 <a href="#open-pdf-viewer" id="open-pdf-viewer"></a>

PDF 파일을 뷰어로 표시하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 PDF 열기
swingWebViewPlugin.app.viewer.showPDF('https://example.com/document.pdf');

// 옵션 지정
swingWebViewPlugin.app.viewer.showPDF('https://example.com/manual.pdf', {
    title: '사용자 매뉴얼',
    showPageIndicator: true,
    showThumbnails: true
});
```

| Parameter         | 타입      | 필수 | 기본값       | 설명           |
| ----------------- | ------- | -- | --------- | ------------ |
| url               | String  | Y  | -         | PDF 파일 URL   |
| title             | String  | N  | 'PDF 뷰어'  | 뷰어 타이틀       |
| showPageIndicator | Boolean | N  | true      | 페이지 인디케이터 표시 |
| showThumbnails    | Boolean | N  | false     | 썸네일 네비게이션    |
| backgroundColor   | String  | N  | '#FFFFFF' | 배경색          |

## 팝업 관련 Method <a href="#popup-method" id="popup-method"></a>

### 배너 팝업 표시하기 <a href="#show-banner-popup" id="show-banner-popup"></a>

배너 형태의 팝업을 표시하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 배너 팝업
swingWebViewPlugin.app.popup.showBannerPopup({
    imageUrl: 'https://example.com/event-banner.jpg',
    linkUrl: '/event/summer-sale'
});

// 상단 배너
swingWebViewPlugin.app.popup.showBannerPopup({
    imageUrl: 'https://example.com/notice.jpg',
    position: 'top',
    height: 150,
    autoDismiss: 5000
});
```

| Parameter       | 타입      | 필수 | 기본값       | 설명                        |
| --------------- | ------- | -- | --------- | ------------------------- |
| imageUrl        | String  | Y  | -         | 배너 이미지 URL                |
| position        | String  | N  | 'bottom'  | 'top', 'center', 'bottom' |
| height          | Number  | N  | 200       | 배너 높이 (dp/pt)             |
| backgroundColor | String  | N  | '#FFFFFF' | 배경색                       |
| showCloseButton | Boolean | N  | true      | 닫기 버튼 표시                  |
| autoDismiss     | Number  | N  | 0         | 자동 닫힘 시간 (ms, 0=비활성)      |
| linkUrl         | String  | N  | -         | 클릭 시 이동 URL               |

### 풀스크린 팝업 표시하기 <a href="#show-fullscreen-popup" id="show-fullscreen-popup"></a>

전체 화면 팝업을 표시하는 기능. 앱 투어(온보딩), 이벤트 팝업에 활용할 수 있습니다.

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 앱 투어 / 온보딩
swingWebViewPlugin.app.popup.showFullScreen({
    type: 'tour',
    pages: [
        {
            image: 'https://example.com/onboarding/step1.png',
            title: '환영합니다!',
            description: '앱의 주요 기능을 소개해드릴게요.'
        },
        {
            image: 'https://example.com/onboarding/step2.png',
            title: '쉬운 주문',
            description: '3번의 터치로 간편하게 주문하세요.'
        },
        {
            image: 'https://example.com/onboarding/step3.png',
            title: '지금 시작해보세요!',
            description: '회원가입하고 첫 주문 할인 받으세요.',
            buttonText: '시작하기'
        }
    ],
    showPageIndicator: true,
    actionButtonText: '시작하기',
    popupId: 'app-tour-v1'
}, function(result) {
    if (result.action === 'complete') {
        localStorage.setItem('onboarding_completed', 'true');
    }
});

// 프로모션 팝업
swingWebViewPlugin.app.popup.showFullScreen({
    type: 'promotion',
    pages: [{
        image: 'https://example.com/promo.jpg',
        title: '여름 세일!',
        description: '전 상품 30% 할인'
    }],
    showDontShowAgain: true,
    popupId: 'summer-sale-2024'
});
```

| Parameter            | 타입      | 필수 | 기본값       | 설명                            |
| -------------------- | ------- | -- | --------- | ----------------------------- |
| type                 | String  | N  | 'tour'    | 'tour', 'promotion', 'notice' |
| pages                | Array   | Y  | -         | 페이지 배열                        |
| pages\[].image       | String  | N  | -         | 이미지 URL                       |
| pages\[].title       | String  | N  | -         | 제목                            |
| pages\[].description | String  | N  | -         | 설명                            |
| showCloseButton      | Boolean | N  | true      | 닫기 버튼 표시                      |
| showPageIndicator    | Boolean | N  | true      | 페이지 인디케이터                     |
| showDontShowAgain    | Boolean | N  | false     | "다시 보지 않기" 표시                 |
| actionButtonText     | String  | N  | '시작하기'    | 완료 버튼 텍스트                     |
| backgroundColor      | String  | N  | '#000000' | 배경색                           |
| popupId              | String  | N  | 'default' | 팝업 고유 ID                      |

**팝업 타입:**

| 타입        | 설명       | UI 스타일                    |
| --------- | -------- | ------------------------- |
| tour      | 앱 투어/온보딩 | 풀스크린, 상태바 숨김              |
| promotion | 프로모션 팝업  | 모달 카드 (85% x 70%), 반투명 배경 |
| notice    | 공지 팝업    | 모달 카드, 배경 탭으로 닫기          |

## 플로팅 메뉴 관련 Method <a href="#floating-menu-method" id="floating-menu-method"></a>

### 플로팅 메뉴 표시하기 <a href="#show-floating-menu" id="show-floating-menu"></a>

플로팅 액션 버튼(FAB) 메뉴를 표시하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 기본 플로팅 메뉴
swingWebViewPlugin.app.floatingMenu.show({
    items: [
        { id: 'home', label: '홈', icon: 'https://example.com/home.png' },
        { id: 'cart', label: '장바구니', icon: 'https://example.com/cart.png', color: '#FF5722' },
        { id: 'share', label: '공유', icon: 'https://example.com/share.png' }
    ],
    position: 'bottomRight',
    buttonColor: '#673AB7'
}, function(result) {
    console.log('선택된 메뉴:', result.id);
    if (result.id === 'home') {
        window.location.href = '/';
    }
});

// 드래그 가능한 메뉴
swingWebViewPlugin.app.floatingMenu.show({
    items: [
        { id: 'scroll-top', label: '맨 위로' },
        { id: 'refresh', label: '새로고침' }
    ],
    draggable: true
});
```

| Parameter      | 타입      | 필수 | 기본값           | 설명                                                 |
| -------------- | ------- | -- | ------------- | -------------------------------------------------- |
| items          | Array   | Y  | -             | 메뉴 아이템 배열                                          |
| items\[].id    | String  | Y  | -             | 아이템 고유 ID                                          |
| items\[].label | String  | N  | -             | 아이템 레이블                                            |
| items\[].icon  | String  | N  | -             | 아이콘 URL                                            |
| items\[].color | String  | N  | '#333333'     | 아이템 배경색                                            |
| position       | String  | N  | 'bottomRight' | 'bottomRight', 'bottomLeft', 'topRight', 'topLeft' |
| buttonSize     | Number  | N  | 56            | 메인 버튼 크기 (dp/pt)                                   |
| buttonColor    | String  | N  | '#4CAF50'     | 메인 버튼 배경색                                          |
| buttonIcon     | String  | N  | -             | 메인 버튼 아이콘 URL                                      |
| draggable      | Boolean | N  | false         | 드래그 이동 가능                                          |

### 플로팅 메뉴 숨기기

플로팅 메뉴를 숨기는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.floatingMenu.hide();
```

## 위치 정보 관련 Method <a href="#location-method" id="location-method"></a>

### 현재 위치 가져오기 <a href="#gps-get-location" id="gps-get-location"></a>

현재 디바이스 위치를 가져오는 기능

> \*js lib 2025\_04\_03\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.location.getCurrentPosition({}, function(result) {
    if (result.success) {
        console.log('위도:', result.coords.latitude);
        console.log('경도:', result.coords.longitude);
        console.log('정확도:', result.coords.accuracy, 'm');
    } else {
        console.error('위치 오류:', result.error, result.code);
    }
});
```

| Parameter          | 타입      | 필수 | 기본값  | 설명              |
| ------------------ | ------- | -- | ---- | --------------- |
| enableHighAccuracy | Boolean | N  | true | 고정밀 위치 사용 (GPS) |

**Callback 결과:**

| 파라미터             | 타입      | 설명                                                    |
| ---------------- | ------- | ----------------------------------------------------- |
| success          | Boolean | 성공 여부                                                 |
| coords.latitude  | Number  | 위도                                                    |
| coords.longitude | Number  | 경도                                                    |
| coords.accuracy  | Number  | 정확도 (m)                                               |
| coords.altitude  | Number  | 고도 (m)                                                |
| coords.speed     | Number  | 속도 (m/s)                                              |
| coords.heading   | Number  | 방향 (도)                                                |
| timestamp        | Number  | 타임스탬프                                                 |
| error            | String  | 에러 메시지                                                |
| code             | String  | 에러 코드 (PERMISSION\_DENIED, PROVIDER\_DISABLED, ERROR) |

### 위치 추적 시작하기 <a href="#gps-watch-position" id="gps-watch-position"></a>

위치 변화를 지속적으로 감시하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.location.watchPosition({
    watchId: 'myWatch1'
}, function(result) {
    if (result.success) {
        updateMapMarker(result.coords.latitude, result.coords.longitude);
    }
});
```

| Parameter          | 타입      | 필수 | 기본값  | 설명       |
| ------------------ | ------- | -- | ---- | -------- |
| watchId            | String  | Y  | -    | 고유 감시 ID |
| enableHighAccuracy | Boolean | N  | true | 고정밀 위치   |

### 위치 추적 중지하기

위치 감시를 중지하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.location.clearWatch('myWatch1');
```

## 로컬 푸시 알림 관련 Method <a href="#local-push-notification-method" id="local-push-notification-method"></a>

### 로컬 푸시 알림 예약하기 <a href="#local-push-notification" id="local-push-notification"></a>

로컬 푸시 알림을 예약하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
// 10초 후 알림
swingWebViewPlugin.app.localPush.schedule({
    title: '알림 테스트',
    body: '10초 후 알림입니다.',
    delaySeconds: 10
}, function(result) {
    console.log('알림 예약됨, ID:', result.id);
});

// 특정 시각 알림
swingWebViewPlugin.app.localPush.schedule({
    id: 'morning-alarm',
    title: '좋은 아침입니다!',
    body: '오늘도 좋은 하루 되세요.',
    scheduledTime: '2024-03-15T09:00:00'
});

// 즉시 알림
swingWebViewPlugin.app.localPush.schedule({
    title: '즉시 알림',
    body: '바로 표시되는 알림입니다.',
    delaySeconds: 0
});
```

| Parameter     | 타입      | 필수 | 기본값       | 설명                  |
| ------------- | ------- | -- | --------- | ------------------- |
| id            | String  | N  | auto      | 알림 고유 ID            |
| title         | String  | Y  | -         | 알림 제목               |
| body          | String  | Y  | -         | 알림 내용               |
| delaySeconds  | Number  | N  | 0         | N초 후 발송             |
| scheduledTime | String  | N  | -         | 발송 시각 (ISO 8601 형식) |
| channelId     | String  | N  | 'default' | 알림 채널 ID (Android)  |
| sound         | Boolean | N  | true      | 알림 사운드              |

**scheduledTime 지원 형식:**

* `2024-01-01T12:00:00` - 로컬 시간
* `2024-01-01T12:00:00Z` - UTC
* `2024-01-01T12:00:00.000Z` - UTC (밀리초 포함)

### 로컬 푸시 알림 취소하기 <a href="#cancel-local-push-notification" id="cancel-local-push-notification"></a>

예약된 알림을 취소하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.localPush.cancel('morning-alarm');
```

### 모든 로컬 푸시 알림 취소하기 <a href="#cancel-all-local-push-notification" id="cancel-all-local-push-notification"></a>

모든 예약된 알림을 취소하는 기능

> \*js lib 2026\_03\_31\_001 버전 부터 사용 가능

```javascript
swingWebViewPlugin.app.localPush.cancelAll();
```

## 애드몹 관련 Method

웹사이트에서 직접 앱내의 애드몹 광고를 관리할 수 있는 명령어 입니다.

아래의 내용을 참고하셔서 광고들을 활용해보세요.

{% hint style="info" %}
반드시 애드몹이 활성된 앱의 경우만 동작하는 명령어 입니다.
{% endhint %}

### • 배너광고 노출하기 <a href="#show-admob-banner" id="show-admob-banner"></a>

어플리케이션내에 애드몹 배너 광고를 노출시키는 명령

| Parameter | 설명             | 값 예시                                   |
| --------- | -------------- | -------------------------------------- |
| adId      | 배너광고 단위 아이디 입력 | ca-app-pub-3940256099942544/6300978111 |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showBanner('ca-app-pub-3940256099942544/6300978111');
```

{% endcode %}

### • 배너광고  종료하기 <a href="#close-admob-banner" id="close-admob-banner"></a>

어플리케이션내에 애드몹 배너 광고를 종료시키는 명령

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.closeBanner();
```

{% endcode %}

### • 전면광고 노출하기 <a href="#show-admob-screen-a-ds" id="show-admob-screen-a-ds"></a>

어플리케이션내에 애드몹 전면 광고를 노출시키는 명령

| Parameter | 설명             | 값 예시                                   |
| --------- | -------------- | -------------------------------------- |
| adId      | 전면광고 단위 아이디 입력 | ca-app-pub-3940256099942544/6300978111 |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showInterstitialAd('ca-app-pub-3940256099942544/6300978111');
```

{% endcode %}

### • 보상형 광고 노출하기 <a href="#show-reward-a-d" id="show-reward-a-d"></a>

어플리케이션내에 애드몹 보상형 광고를 노출시키는 명령

| Parameter | 설명               | 값 예시                                   |
| --------- | ---------------- | -------------------------------------- |
| adId      | 리워드 광고 단위 아이디 입력 | ca-app-pub-3940256099942544/5224354917 |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showRewardAd('ca-app-pub-3940256099942544/5224354917');
```

{% endcode %}

### • 보상형 광고 노출하기 - \[선택사항] 서버 측 확인(SSV) 콜백 검사 <a href="#show-reward-a-d-with-customdata" id="show-reward-a-d-with-customdata"></a>

어플리케이션내에 애드몹 보상형 광고를 노출시키는 명령

아래의 코드 샘플에는 광고를 요청하기 전에 보상형 광고 객체에 맞춤 데이터를 설정하는 방법이 나와 있습니다.

<mark style="background-color:blue;">\*js lib 2025\_10\_27\_001 버전 부터 사용 가능(25년 10월28일 이후 제작된 버전부터 동작)</mark>

| Parameter    | 설명                            | 값 예시                                   |
| ------------ | ----------------------------- | -------------------------------------- |
| adId         | 리워드 광고 단위 아이디 입력              | ca-app-pub-3940256099942544/5224354917 |
| custom\_data | SSV 콜백의 `custom_data` 쿼리 매개변수 |                                        |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showRewardAdWithCustomData('ca-app-pub-3940256099942544/5224354917','custom_data');
```

{% endcode %}

### • 보상형 전면 광고 노출하기 <a href="#show-reward-interstitial" id="show-reward-interstitial"></a>

어플리케이션내에 애드몹 보상형 전면 광고를 노출시키는 명령

| Parameter | 설명                  | 값 예시                                   |
| --------- | ------------------- | -------------------------------------- |
| adId      | 보상형 전면 광고 단위 아이디 입력 | ca-app-pub-3940256099942544/5354046379 |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showRewardInterstitial('ca-app-pub-3940256099942544/5354046379');
```

{% endcode %}

### • 보상형 전면 광고 노출하기 - \[선택사항] 서버 측 확인(SSV) 콜백 검사 <a href="#show-reward-interstitial-with-customdata" id="show-reward-interstitial-with-customdata"></a>

어플리케이션내에 애드몹 보상형 전면 광고를 노출시키는 명령

아래의 코드 샘플에는 광고를 요청하기 전에 보상형 광고 객체에 맞춤 데이터를 설정하는 방법이 나와 있습니다.

<mark style="background-color:blue;">\*js lib 2025\_10\_27\_001 버전 부터 사용 가능(25년 10월28일 이후 제작된 버전부터 동작)</mark>

| Parameter    | 설명                            | 값 예시                                   |
| ------------ | ----------------------------- | -------------------------------------- |
| adId         | 보상형 전면 광고 단위 아이디 입력           | ca-app-pub-3940256099942544/5354046379 |
| custom\_data | SSV 콜백의 `custom_data` 쿼리 매개변수 |                                        |

{% code lineNumbers="true" %}

```javascript
swingWebViewPlugin.app.admob.showRewardInterstitialWithCustomData('ca-app-pub-3940256099942544/5354046379','custom_data');
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.swing2app.co.kr/developer/webview/javascript-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
