PWA을 구현하기 위해서는 크게 manifest 과 service workers 라는 2가지 기술을 사용합니다.
Progressive Web App의 앱 아이콘, 화면 런쳐방식 및 배경색, 시작 Url 등을 설정할 수 있는 Json형식의 설정파일입니다.
{
"short_name": "앱 아이콘 이름",
"name": "하단 설치 배너에 표기될 이름 & 앱에서 검색시 키워드",
"icons": [
{
"src": "dist/images/icons.icon-32x32.png", // 아이콘 이미지 경로
"type": "images/png", // 아이콘 이미지 파일 확장자
"size": "32x32" // 아이콘 이미지 사이즈
},
{}
],
"background_color": "#1E88E5", // 웹앱의 Splash Screen 배경색
"display": "standalone", // 웹앱의 화면 형태
"start_url": "./" // 앱이 시작 될 때 로딩 될 페이지 위치 지정
}
Display 옵션
standalone: 상단 URL바 제거 하여 네이티브 앱 느낌제공
browser: 해당 OS브라우저에서 웹앱 실행
fullscreen: 크롬이 아닌 기타 브라우저에서 네이티브 앱 느낌 제공
minimul-ui: fullscreen과 비슷하나 네이게이션 관련 최소 UI를 제공
// IOS에서 아이콘을 설정해주기 위해 아래 태그들을 index.html 파일에 추가해줘야합니다.
<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="180x180"
href="touch-icon-iphone-retina.png"
/>
<link
rel="apple-touch-icon"
sizes="167x167"
href="touch-icon-ipad-retina.png"
/>
// IOS에서 standalone 사용시 필요합니다.
<meta name="apple-mobile-web-app-capable" content="yes" />
브라우저가 백그라운드에서 실행하는 스크립트로, 웹페이지와는 별개로 작동하며, 푸시 알림(Push Notification, Android Chrome 한정) 및 백그라운드 동기화(Background Sync, Android Chrome 한정)와 같은 기능 등 웹페이지 또는 사용자 상호작용이 필요하지 않은 기능에 대해 지원합니다.
//index.html
//service worker 등록하기
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register("sw.js")
.then(() => {
console.log("Okey!");
})
.catch((error) => {
cosole.log("FAIL", error);
});
}
//sw.js
const CACHE_NAME = "pwa-offline-v1"; //캐쉬를 담을 파일명 정의
const filesToCache = [
//❗️sw-toolbox 사용가능
//캐쉬 할 웹 자원들 목록
"/", //index.html을 담당
"/public/css/styles.css",
"/public/images/banner.png",
"/public/images/manifest.png",
"/public/images/pwa.png",
];
// 서비스 워커 설치 (웹 자원 캐싱)
self.addEventListener("install", (event) => {
console.dir(event);
event.waitUntil(
//끝나기 전까지는 이벤트가 끝나지 않는다.
//caches 브라우져 예약어
caches
.open(CACHE_NAME)
.then((cache) => {
//캐쉬를 열고 접근 할 수 있는 캐쉬를 얻을 수 있다.
//캐쉬에 넣어라
return cache.addAll(filesToCache);
})
.catch((error) => {
return console.log(error);
})
);
});
// 브라우저와 서버 사이의 미들웨어 역할을 하는 스크립트 이벤트
self.addEventListener("fetch", (event) => {
console.log("fetch", event.request);
event.respondWith(
caches
.match(event.request) //fetch request를 보내는 내용
//값이 있다면 캐쉬 내용을 전달 하고
//없다면 fetch 요청을 보내서 자원을 요청한다.
.then((response) => response || fetch(event.request))
.catch(console.error)
);
});
// 불필요한 캐쉬 제거
self.addEventListener("activate", (event) => {
const newCacheList = [CACHE_NAME];
event.waitUntil(
//promise를 리턴 하기 전짜기 동작을 보당 해준다.
caches
.keys()
.then((cacheList) => {
return Promise.all(
cacheList.map((cacheName) => {
if (newCacheList.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
.catch(console.error)
);
});
https://www.pwabuilder.com/ 를 사용하면 위의 설정들을 좀 더 쉽게 할 수 있습니다.
그러기 위해서는 꼭 https가 적용된 url이여야 합니다.
https://web.dev/progressive-web-apps/
https://velog.io/@jgi0105/PWA
https://uxgjs.tistory.com/224
https://valtwo94.medium.com/pwa-progressive-web-app-15cb4177ab7d
https://www.insilicogen.com/blog/350