PWA를 구현하기 위해서는 크게 manifest.json
과 Service Workers
라는 2가지의 기술이 필요하다.
manigest.json
은 PWA의 설치와 앱의 구성 정보를 담고 있는 json 설정파일이다.
크게 아래와 같은 작업을 한다.
설정은 JSON으로 설정하며, <head>
태그 안에 배치한다.
index.html
<head> <link rel="manifest" href="manifest.json"> </head>
manifest.json
{ "short_name": "프로젝트 이름(아이콘의 이름으로 표시)", "name": "설치 배너에 표시되는 이름(검색의 키워드로 사용)", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" }, { "src": "images/icon192.png", "sizes": "192x192", "type": "image/png" }, { "src": "images/icon512.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "./index.html", "display": "standalone", "orientation": "portrait", "theme_color": "#000000", "background_color": "#ffffff" }
short_name
: 프로젝트 이름으로 설치된 아이콘의 이름으로 표시된다. (필수 입력사항으로 입력하지 않으면 배너를 설치 할 수 없다.)
name
: 설치 배너에 표시되는 이름으로 검색의 키워드로 사용된다. (마찬가지로 필수 입력사항으로 입력하지않으면 배너를 설치 할 수 없다.)
icons
: 앱에서 필요한 다양한 크기의 아이콘을 지정한다. (스플래시 화면 표시를 위해 192px(128dp)크기의 아이콘은 반드시 있어야 한다.)
Splash screen
: short_name, 아이콘, 배경색 의 설정 조합으로 구성된다.
start_url
: 필수 요소로 웹 앱이 실행될 때 가장 처음 나오는 화면을 지정한다. ( 스플래시 화면 다음에 나오는 화면 )
기본 설정
"start_url": "./index.html",
Query string을 사용하여 통계에 사용
"start_url": "./index.html?qa=homescreen",
display
: 웹 앱이 어떤 모양으로 보여질지 설정하는 값이다.
iOS에서 standalone 사용 시 태그 안에 아래의 메타태그를 추가해야 한다.
<meta name="apple-mobile-web-app-capable" content="yes">
theme_color
: 테마 컬러는 브라우저 상단의 URL 입력바와 시스템 바 까지 포함한 색상을 지정할 수 있다.
orientation
: 기기의 방향을 가로로 할지 세로로 할지 지정하는 값이다.
service-workers
는 캐싱은 어떻게 할 것인지, 요청시 캐시를 먼저 보여줄지 웹 서버를 통해서 먼저 보여줄지, PUSH 등에 대한 프로그래밍을하는 기술이다.
service-workers
에 관해서는 추후에 자세히 다룰 예정이다.
웹 앱을 설정하기 위한 조건
start_url
, short_name
, name
이 설정되어 있어야 한다.192px
크기 이상의 앱 아이콘이 설정되어 있어야 한다.service worker
의 fetch
이벤트가 구현되어 있어야 한다.HTTPS
로 보안 서비스 되어야 한다.원래는 자동으로 설치배너가 보이게 되어 있으나,
아래의 JavaScript 코드를 추가하여 설치 버튼을 클릭하여 설치 가능하게 할 수 있다.
var deferredPrompt; window.addEventListener('beforeinstallprompt', function(e) { console.log('beforeinstallprompt Event fired'); e.preventDefault(); // Stash the event so it can be triggered later. deferredPrompt = e; return false; }); // 특정 버튼 클릭 시 설치 시작 btnSave.addEventListener('click', function() { if(deferredPrompt !== undefined) { // The user has had a postive interaction with our app and Chrome // has tried to prompt previously, so let's show the prompt. deferredPrompt.prompt(); // Follow what the user has done with the prompt. deferredPrompt.userChoice.then(function(choiceResult) { console.log(choiceResult.outcome); if(choiceResult.outcome == 'dismissed') { console.log('User cancelled home screen install'); } else { console.log('User added to home screen'); } // We no longer need the prompt. Clear it up. deferredPrompt = null; }); } });
크롬 브라우저의 주소창에 chrome://flags
입력하고,
설정 옵션 중 사용자 참여 검사 우회(Bypass user engagement checks)를 체크한다.
(이 설정은 웹앱 개발 시 필수요소가 설치되어 있지 않더라도 브라우저에서 인스톨 배너(앱 아이콘 설치)가 뜨는지 확인할 수 있다.)
PWA가 Safari 에서는 잘 인식하지 않는 경우가 있으므로, HTML <haed>
영역에 아래의 meta태그를 입력해 준다.
<link rel="apple-touch-icon" href="touch-icon-iphone.png"> <link rel="apple-touch-icon" sizes="152x152" href="touch-icon-ipad.png"> <link rel="apple-touch-icon" sizes="167x167" href="touch-icon-ipad-retina.png"> <link rel="apple-touch-icon" sizes="180x180" href="touch-icon-iphone-retina.png">