베스트 1170 하이브리드 앱 웹뷰 새로운 업데이트 110 시간 전

주제에 대한 기사를 찾고 있습니까 “하이브리드 앱 웹뷰“? 웹사이트에서 이 주제에 대한 전체 정보를 제공합니다 https://k1.krabirelaxytour.com 탐색에서: 359+ 당신을 위한 팁. 바로 아래에서 이 주제에 대한 자세한 답변을 찾을 수 있습니다. 찾고 있는 주제를 더 잘 이해하려면 끝까지 읽으십시오. 더 많은 관련 검색어: 하이브리드 앱 웹뷰 안드로이드 하이브리드앱 웹뷰, 웹뷰 하이브리드앱 차이, 하이브리드 앱 만들기, 대표적인 하이브리드 앱, 하이브리드 앱 구조, 하이브리드 앱 단점, 하이브리드 앱 예시, 하이브리드 앱 CSS

하이브리드앱, 네이티브앱, 웹앱 차이점 정리! – 일성의일상

카메라, 음성검색 및 인식 등의 스마트폰 기능 사용이 가능하고 HTML로 개발되기 때문에 개발 및 유지 보수가 간단합니다. 하지만 네이티브 앱보다 UI를 구성하는 디자인 부분이 취약하며 속도가 느리고 기능적인 접근에 제한이 있고 성능이 떨어진다는 단점이 있습니다.

카메라, 음성검색 및 인식뿐만 아니라 2D, 3D 증강현실 등의 기능도 가능하기 때문에 활용 법위가 넓으며 실행 속도 역시 다른 것보다 훨씬 빠르고 안정적입니다.

하지만 다른 방식들보다 높은 수준의 기술력이 필요하며, 각기의 모바일 운영체제 별로 어플을 만들어야 하기 때문에 개발 기간이나 비용이 많이 들 수 있습니다.

22 thg 4, 2021 — (좀더 정확하게는 하이브리드는 웹뷰 기반의 앱이고, 크로스플랫폼 프레임워크는 양쪽을 다 빌드해주는 녀석.) 1. 웹뷰를 이용한 앱. (네이티브로 웹뷰 …

  • Source: his-story.tistory.com
  • Views: 96155
  • Publish date: 28 minute ago
  • Downloads: 24923
  • Likes: 5778
  • Dislikes: 1
  • Title Website: 하이브리드앱, 네이티브앱, 웹앱 차이점 정리! – 일성의일상
  • Description Website: 22 thg 4, 2021 — (좀더 정확하게는 하이브리드는 웹뷰 기반의 앱이고, 크로스플랫폼 프레임워크는 양쪽을 다 빌드해주는 녀석.) 1. 웹뷰를 이용한 앱. (네이티브로 웹뷰 …

세부 정보를 보려면 여기를 클릭하십시오.

  • Source: Youtube
  • Views: 8099
  • Date: 21 hours ago
  • Download: 16019
  • Likes: 2290
  • Dislikes: 6

하이브리드앱, 네이티브앱, 웹앱 차이점 정리!

웹앱?

웹+앱?

하이브리드앱?

웹이랑 앱이 섞인게 하이브리드가 아니고 따로 하이브리드 앱이 있다고?

네이티브앱은 또 뭐지?

네이티브네이티브..원시인 같은 개념인가?

🍧 ‘웹 앱’ ?

웹앱이란, 웹페이지 즉 홈페이지와 같은 Web을 스마트폰 화면 크기로 줄인 것이다.(반응형x)

PC나 스마트폰 등 단말기의 기종에 관계없이 모든 단말기에서 같은 콘텐츠를 볼 수 있도록 해주는 어플이다.

사용자 스마트폰에 설치되어있는 인터넷 브라우저를 기반으로 동작하는 앱이다.

모바일 웹앱의 장점, 단점?

1. 웹에서 사용하는 언어로 개발하기 때문에 비용과 시간적 면에서 저렵하다.

2. HTML, CSS, JSP, PHP, .NET 등이 대표적인 개발언어로 웹 기술을 사용한다.

3. 설치를 하지 않고 아이폰/안드로이드 구분 없이 인터넷 브라우저만 있으면 접속 가능하다.

4. 온라인 상태에서 URL접속을 통해 실해오디는 앱이라 인터넷 상태에 따라 접속장애가

발생할 수 있다는 단점이 있다.

5. 마켓에 등록이 불가능 하며 핸드폰에 설치하지 않기 때문에 네이티브 앱에 비해 속도가 느리다.(케바케)

🧁 ‘하이브리드앱’ ?

웹앱의 단점을 보완한 것이 바로 ‘하이브리드앱’

겉으로 보기에는 일반 어플로 보이지만 실제로는 웹을 기반으로 한다.

즉, 어플 안에 웹페이지를 불러오는 방식으로 실제로는 앱이 아닌 웹이 실행되는 것

우리가 잘 알고 있는 네이버, 다음, 크롬 등이 이에 속한다.

하이브리드라고 생각하시는 구현방법에는 크게 3가지가 있다.

(좀더 정확하게는 하이브리드는 웹뷰 기반의 앱이고, 크로스플랫폼 프레임워크는 양쪽을 다 빌드해주는 녀석.)

1.

웹뷰를 이용한 앱

(네이티브로 웹뷰 관련 코드만 구현하고 나머지는 웹에서 모두 구현함, 웹 구현과 동일하고 웹브라우저를 가진 앱이기 때문에 비교적 러닝커브가 적다.)

2.

아이오닉이나 코르도바처럼 웹뷰 기반의 프레임워크 이용.

1번과 거의 같은 수준의 구현방법이지만 프레임워크가 도와주기 때문에 좀더 쉽게 구현할수 있다.

다만 함정은 프레임워크가 주는 제한도 있기 때문에 오히려 위 방법보다 자유도는 떨어진다고 할 수 있다.

3.

리액트네이티브나 플러터 같은 크로스플렛폼 빌드 툴을 이용한 개발

이 친구들은 하나의 소스로 안드/ios 소스를 생성해주는 그런 방식으로 되어있다.

실제로는 네이티브 코드가 생성되는 것이다.

해당 프레임워크가 정해준 범위내에서만 만드는 것이기 때문에 더 제한이 많고 프레임워크 의존성이 가장 크지만

준수한 퍼포먼스와 생산성을 가지고 있다.

– 1, 2, 3번 모두 장단점이 있다.

– 웹기술과 가까운건 1 > 2 > 3

– 1, 2, 3의 차이를 이해하시면 좀더 선택에 도움이 될 수 있다.

1) 웹뷰기반 으로네이티브도 직접 한다.

2) 웹뷰기반으로 쉽게 할 수 있도록 도와줌

3) 다른 언어나 스타일로 코딩하면 네이티브 실행가능한 결과물을 줌

(어떻게 구현하는지는 프레임워크 따라 맘대로… 대부분 웹뷰 형태보다 좋은 퍼포먼스를 강조, 다만 웹기술과는 거리가 커지기 시작함)

카메라, 음성검색 및 인식 등의 스마트폰 기능 사용이 가능하고 HTML로 개발되기 때문에 개발 및 유지 보수가 간단합니다. 하지만 네이티브 앱보다 UI를 구성하는 디자인 부분이 취약하며 속도가 느리고 기능적인 접근에 제한이 있고 성능이 떨어진다는 단점이 있습니다.

처음 하이브리드로 제작됐던 페이스북 역시 이러한 문제로 인해 native로 변경하였습니다.

🌾 ‘네이티브앱’ ?

앞서 두 개의 단점들을 보완한 것이 바로 네이티브앱 입니다.

모바일 기기에 최적화된 언어로 개발되어 유저가 사용하기에 가장 편하고 빠릅니다.

뿐만 아니라 다양한 기능들에 대한 접근이 자유롭습니다.

카메라, 음성검색 및 인식뿐만 아니라 2D, 3D 증강현실 등의 기능도 가능하기 때문에 활용 법위가 넓으며 실행 속도 역시 다른 것보다 훨씬 빠르고 안정적입니다.

우리가 잘 아는 유튜브, 카카오톡, 인스타그램, 페이스북이 이에 속합니다.

하지만 다른 방식들보다 높은 수준의 기술력이 필요하며, 각기의 모바일 운영체제 별로 어플을 만들어야 하기 때문에 개발 기간이나 비용이 많이 들 수 있습니다.

참고:

https://smartmaker.tistory.com/871 [스마트메이커]

okky.kr/article/665071

freemoa-blog.com/622

모바일웹 / 웹앱 / 하이브리드앱 / 네이티브앱 – 브런치

개발 방식에 대한 고민은 솔루션 이전 또는 함께 시작됩니다. 솔루션 실현 가능성에 대한 고민에는 개발 내용까지 포함되기 때문입니다. 주어진 예산과 인력, 시간에 따라 개발 계획이 수정될 수 있습니다. 가장 중요한 것은 주어진 자원으로 최고의 솔루션을 만드는 것 입니다. 따라서 솔루션을 개발에 한정짓기 보다 고객이 겪는 문제를 정확하게 파악했는지, 솔루션에 대한 고객의 반응은 어떠한 지 검증하는데 초점을 맞추어야 합니다. 궁극적으로 개발을 통해 서비스를 만들겠지만, 현재 프로덕트가 없는 상황에서 반드시 개발을 통해 솔루션을 만들 필요는 없습니다.

최근에는 크로스 플랫폼 프레임워크(Cross Platform Framework)가 주목받고 있습니다. 대표적인 크로스 플랫폼 프레임워크는 구글이 만든 Flutter와 페이스북이 만든 React Native가 있습니다. 하나의 소스코드로 iOS, 안드로이드 운영체제 모두에 배포할 수 있다는 특징 때문에 스타트업이 많이 활용하고 있습니다. 두 운영체제 언어를 각각 다루기 보다 두 운영체제를 한 번에 커버할 수 있어 효율적이기 때문입니다.

점차 모바일 환경이 발달하면서 PC기반으로 개발된 웹페이지들이 모바일 환경으로 적응하게 되었고, 이 과정에서 모바일 최적화를 위한 다양한 방법들이 등장했습니다. 반응형과 적응형도 이 과정에서 등장했습니다. 한 개의 URL로 다양한 디바이스 사이즈에 맞게 변동하는 반응형 웹(Responsive Web)과 각 디바이스 별 템플릿을 만들어 접근한 디바이스에 따라 알맞는 템플릿을 제공하는 적응형 웹(Adaptive Web)이 대표적입니다.

4 thg 1, 2022 — 모바일 웹과 웹 앱보다 모바일 환경에 최적화된 개발 방법이 있습니다. 바로, 하이브리드와 네이티브 입니다. 하이브리드 개발은 웹 기반으로 운영체제에 …

  • Source: brunch.co.kr
  • Views: 91315
  • Publish date: 28 minute ago
  • Downloads: 30120
  • Likes: 2228
  • Dislikes: 2
  • Title Website: 모바일웹 / 웹앱 / 하이브리드앱 / 네이티브앱 – 브런치
  • Description Website: 4 thg 1, 2022 — 모바일 웹과 웹 앱보다 모바일 환경에 최적화된 개발 방법이 있습니다. 바로, 하이브리드와 네이티브 입니다. 하이브리드 개발은 웹 기반으로 운영체제에 …

세부 정보를 보려면 여기를 클릭하십시오.

Native vs. Cross-platform vs. Hybrid App

  • Source: Youtube
  • Views: 104021
  • Date: 15 minute ago
  • Download: 62619
  • Likes: 9369
  • Dislikes: 8

모바일웹 / 웹앱 / 하이브리드앱 / 네이티브앱

4가지 대표 개발 방식

IT 서비스를 개발한다면 어떤 방식으로 진행할지를 결정하게 됩니다. 네 가지 대표 개발 방식이 있습니다.

모바일 웹(Mobile Web) : 모바일 화면에 맞게 구성한 웹

웹 앱(Web App) : 모바일 웹과 비슷하지만 구동방식이 앱처럼 보이게 한 앱

하이브리드 앱(Hybrid App) : 웹 앱과 네이티브 앱의 기능을 결합하여 개발된 앱

네이티브 앱(Native App) : 모바일 기기에 최적화된 네이티브 언어로 개발된 앱

개발 방식 비교

개발 방식은 현재 보유 자원(자금, 인력, 시간)과 개발 목적 그리고 사업단계에 따라 결정됩니다. 얼마나 빠르게 개발해야 하는지, 개발 인력이 있는지, 개발 목적은 무엇인지를 고민하면 개발 방식을 선택하는데 도움이 됩니다.

모바일 웹과 웹 앱을 비교해 보겠습니다. 둘은 웹 개발과 동일하게 만들어지기 때문에 모바일 운영체제 별로 개발할 필요가 없어 시간과 비용 측면에서 효율적입니다. 하지만 접속하기 위해선 브라우저를 이용해야 하기 때문에 직접 검색하거나 URL을 통해야 합니다. 이처럼 여러 단계를 거치고, 직접 입력해야 하는 노력이 필요다하는 점에서 접근성이 좋지 않습니다.

브라우저로 접속한 네이버 웹 앱

풀 브라우저 방식 vs 단일 페이지 방식

모바일 웹과 웹 앱은 비슷한 점이 많지만, 실행 방법에 아래와 같은 차이가 있습니다.

• 모바일 웹 ➜ 풀 브라우저 방식 (Full Browsing)

• 웹 앱 ➜ 단일 페이지 방식 (SPA, Single Page Application)

풀 브라우저 방식(Full Browsing)은 화면 일부분이 변경될 때 화면 전체 내용을 서버에서 새로 받아오는 방식입니다. 따라서 페이지 리로드(Page Reload) 할 경우 속도가 느리다는 단점이 있습니다. 또한 모바일 기기 특성상 이동 중에 서버 접속 장애가 발생할 위험이 있습니다. 도식화 하면 아래 그림 중 상단의 ‘Traditional Page Lifecycle’에 가깝습니다.

단일 페이지 방식(SPA)은 브라우저에 최초 한 번 페이지 전체를 받아오고, 화면 일부분이 변경, 요청될 때 해당 부분만 Ajax를 통해 데이터를 바인딩 하는 방식입니다. 아래 그림의 하단 부분 ‘SPA Lifecycle’ 입니다.

Traditional Page Lifecycle(위) / SPA Lifecycle(아래)

용어

• Ajax : 빠르게 동작하는 동적인 웹 페이지를 만들기 위한 개발 기법 중 하나. 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있음

• 데이터 바인딩 : 자바스크립트 웹 애플리케이션의 복잡해지면서 쉬운 코드 관리와 유지보수를 위해 화면에 보이는 데이터와 브라우저 메모리에 있는 데이터를 일치시키는 기법

다시 돌아가면, 모바일 웹은 풀 브라우저 방식으로 실행 속도가 느린 반면, 웹 앱은 단일 페이지 방식으로 실행 속도가 빠릅니다.

점차 모바일 환경이 발달하면서 PC기반으로 개발된 웹페이지들이 모바일 환경으로 적응하게 되었고, 이 과정에서 모바일 최적화를 위한 다양한 방법들이 등장했습니다. 반응형과 적응형도 이 과정에서 등장했습니다. 한 개의 URL로 다양한 디바이스 사이즈에 맞게 변동하는 반응형 웹(Responsive Web)과 각 디바이스 별 템플릿을 만들어 접근한 디바이스에 따라 알맞는 템플릿을 제공하는 적응형 웹(Adaptive Web)이 대표적입니다.

네이티브 앱과 하이브리드 앱

모바일 웹과 웹 앱보다 모바일 환경에 최적화된 개발 방법이 있습니다. 바로, 하이브리드와 네이티브 입니다. 하이브리드 개발은 웹 기반으로 운영체제에 따른 패키징을 달리하여 iOS와 안드로이드에서 실행하는 방법입니다. 하나의 코드로 개발하기 때문에 네이티브 앱에 비해 비용적, 시간적으로 효율적이지만, 그만큼 네이티브 앱보다 기능이 제한적이고, 속도가 느립니다.

네이티브 개발은 각 운영체제(iOS, 안드로이드)에서 제공하는 SDK로 만드는 방법입니다. 각 운영체제에 최적화된 개발이 가능하여 기능과 속도 측면에서도 하이브리드 앱보다 우수합니다. 하지만 개발 범위가 넓고, 많기 때문에 비용이 높고, 시간이 오래 걸립니다.

최근에는 크로스 플랫폼 프레임워크(Cross Platform Framework)가 주목받고 있습니다. 대표적인 크로스 플랫폼 프레임워크는 구글이 만든 Flutter와 페이스북이 만든 React Native가 있습니다. 하나의 소스코드로 iOS, 안드로이드 운영체제 모두에 배포할 수 있다는 특징 때문에 스타트업이 많이 활용하고 있습니다. 두 운영체제 언어를 각각 다루기 보다 두 운영체제를 한 번에 커버할 수 있어 효율적이기 때문입니다.

페이스북 React Native

개발방식을 선택한다면

앞서 논의한 내용을 기반으로 개발 방식을 선택한다면, 몇 가지 기준을 고려해야 합니다. 이 외에도 팀과 상황에 따라 다양한 기준이 존재합니다.

목적 : 무엇을 위해 만드는 것인가. 정말 개발이 필요한가. 어느 정도의 완성도가 필요한가

시간 : 얼마만큼의 시간이 주어져 있는가(시간은 비용과도 직접적으로 연관됨)

인력 : 내부 개발인력이 있는가. 유지・보수는 어떻게 할 계획인가. 이후 개발은 어떻게 할 것인가

개발 방식에 대한 고민은 솔루션 이전 또는 함께 시작됩니다. 솔루션 실현 가능성에 대한 고민에는 개발 내용까지 포함되기 때문입니다. 주어진 예산과 인력, 시간에 따라 개발 계획이 수정될 수 있습니다. 가장 중요한 것은 주어진 자원으로 최고의 솔루션을 만드는 것 입니다. 따라서 솔루션을 개발에 한정짓기 보다 고객이 겪는 문제를 정확하게 파악했는지, 솔루션에 대한 고객의 반응은 어떠한 지 검증하는데 초점을 맞추어야 합니다. 궁극적으로 개발을 통해 서비스를 만들겠지만, 현재 프로덕트가 없는 상황에서 반드시 개발을 통해 솔루션을 만들 필요는 없습니다.

참고자료

[Android] 하이브리드 앱 만들기 (기본편)Hybrid webview default

기본적으로 Ui에서 웹뷰 추가후에 setWebChromeClient, setWebViewClient 와 usesCleartextTraffic, enEnableSafeBrowsing 를 처리하면 http 통신과 https 통신시에 필요한 기본적인 하이브리드 앱을 구현할수 있다.

29 thg 9, 2021 — 앱에서 WebView를 이용하여 웹페이지를 보여주는 앱을 만들 필요가 있다. 기본 적으로 http://www.naver.com을 접속하는 샘플 앱을 만들어 본다.

  • Source: helloit.tistory.com
  • Views: 9552
  • Publish date: 19 hours ago
  • Downloads: 39633
  • Likes: 3776
  • Dislikes: 6
  • Title Website: [Android] 하이브리드 앱 만들기 (기본편)Hybrid webview default
  • Description Website: 29 thg 9, 2021 — 앱에서 WebView를 이용하여 웹페이지를 보여주는 앱을 만들 필요가 있다. 기본 적으로 http://www.naver.com을 접속하는 샘플 앱을 만들어 본다.

세부 정보를 보려면 여기를 클릭하십시오.

WEB VIEW? 웹뷰는 왜 쓰는걸까?

  • Source: Youtube
  • Views: 74291
  • Date: 5 hours ago
  • Download: 99650
  • Likes: 161
  • Dislikes: 1

[Android] 하이브리드 앱 만들기 (기본편)Hybrid webview default

앱에서 WebView를 이용하여 웹페이지를 보여주는 앱을 만들 필요가 있다.

기본 적으로 http://www.naver.com을 접속하는 샘플 앱을 만들어 본다.

구현 방법:

1. 신규 프로젝트 생성.

2. UI를 이용하여 WebView UI 생성

AndroidManifest.xml

코드 구현

private String TAG = “MainActivity”; private WebView mWebView = null; //웹뷰 private EditText mEtxtUrlAddress = null; //웹뷰 Url private Button mBtnUrlGo= null; //url 이동 @Override protected void onCreate(Bundle savedInstanceState) { MyLog.i(TAG,”onCreate()”); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); // 웹뷰의 디버깅 모드 활성화 } } this.mWebView = findViewById(R.id.webView); this.mBtnUrlGo = findViewById(R.id.btnGoUrl); this.mEtxtUrlAddress = findViewById(R.id.etxtUrlAddress); this.mBtnUrlGo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mWebView.loadUrl(mEtxtUrlAddress.getText().toString()); } }); //sub webView 처리 this.mWebView.setWebChromeClient(new WebChromeClient(){ }); //WebView 처리 (처리하지 않으면 http 접속시 외부뷰어 실행) this.mWebView.setWebViewClient(new WebViewClient(){ }); //this.mWebView.loadUrl(“http://www.naver.com”); mWebView.loadUrl(mEtxtUrlAddress.getText().toString()); }

3. http 통신 가능 하도록 설정.

4. 웹뷰 디버깅.

안드로이드 코드상에 아래를 추가 한후, 크롬 브라우저 상에서

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); // 웹뷰의 디버깅 모드 활성화 } }

크롬 브라우저상에서 chrome://inspect/#devices로 접속하면 아래와 같이 디버깅이 가능하다.

결론:

기본적으로 Ui에서 웹뷰 추가후에 setWebChromeClient, setWebViewClient 와 usesCleartextTraffic, enEnableSafeBrowsing 를 처리하면 http 통신과 https 통신시에 필요한 기본적인 하이브리드 앱을 구현할수 있다.

참고 자료:

[1] 안드로이드 webView, developer.android.com/guide/webapps?hl=ko

[2] 웹뷰 자주쓰는 10가지 셋팅, www.blueswt.com/117

[3] Google 세이프 브라우징 서비스, https://developer.android.com/guide/webapps/managing-webview?hl=ko#safe-browsing

[Android] 하이브리드앱의 기본, 웹뷰 세팅과 자바스크립트 연동 …

public void insertAuthNum(final String authNum){ Log.i(“insertAuthNum”, “CALL : ” + authNum); // webView.loadUrl(“javascript:insertAuthNum(‘” + authNum + “‘);”); webView.post(new Runnable() { @Override public void run() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) webView.evaluateJavascript(“javascript:insertAuthNum(‘” + authNum + “‘);”, new ValueCallback () { @Override public void onReceiveValue(String value) { Log.i(“onReceiveValue”, value); } }); } }); }

이 프레임워크들을 사용하면 매우 간단하다. 웹의 js함수 한 두줄로, 네이티브의 카메라 기능을 호출할 수 있는 등.. 매우 코드가 간결해진다. 또한, 기본적으로 프레임워크의 이름을 단 웹뷰를 사용하기 때문에 세팅들도 왠만한건 다 되어있어 편리한 것이 가장 큰 장점이다. 단점이라면 외부의 프레임워크를 넣어서 하기 때문에 용량이 커지고, 프레임워크가 업데이트할 수록 그에 맞춰 코드들도 변경해줘야하는 번거로움이 있다. 즉, 안드로이드 버전 업 + 프레임워크 버전 업까지 신경써야하는 것이다.

[웹뷰]. 말 그대로 웹 페이지를 보여주는 뷰, 안드로이드의 컴포넌트중 하나다. 안드로이드가 iOS에 비해 웹뷰가 좋은 이유는.. 웹뷰의 종류가 기본형 …

  • Source: g-y-e-o-m.tistory.com
  • Views: 46620
  • Publish date: 33 minute ago
  • Downloads: 68952
  • Likes: 3825
  • Dislikes: 9
  • Title Website: [Android] 하이브리드앱의 기본, 웹뷰 세팅과 자바스크립트 연동 …
  • Description Website: [웹뷰]. 말 그대로 웹 페이지를 보여주는 뷰, 안드로이드의 컴포넌트중 하나다. 안드로이드가 iOS에 비해 웹뷰가 좋은 이유는.. 웹뷰의 종류가 기본형 …

세부 정보를 보려면 여기를 클릭하십시오.

세션3 웹뷰 기반의 하이브리드 앱 개발 노하우

  • Source: Youtube
  • Views: 69886
  • Date: 26 minute ago
  • Download: 105124
  • Likes: 5187
  • Dislikes: 7

[Android] 하이브리드앱의 기본, 웹뷰 세팅과 자바스크립트 연동 방법

[웹뷰]

말 그대로 웹 페이지를 보여주는 뷰, 안드로이드의 컴포넌트중 하나다. 안드로이드가 iOS에 비해 웹뷰가 좋은 이유는.. 웹뷰의 종류가 기본형 하나이기 때문일 것이다. iOS는 UIWebView라고 있지만, WKWebView라고 좀 더 진보된 웹뷰를 권장하는데, 이 웹뷰가 기본형이 아니라서 import를 하고 그런 작업들이 있기 때문이다. 그렇기에 처음 접하는 사람에겐 iOS가 귀찮다.

어쨌든, 앱의 기본이 웹페이지를 띄워주는 것이고.. 여기에 플레이스토어에 출시하기 위한 껍데기, 네이티브의 기능을 덧붙여주면 하이브리드앱이 된다. 물론, 웹이 주가 아니라 네이티브가 주면서 웹은 거드는 것도 하이브리드 앱이라 할 수 있다. 정의를 굳이 딱 정하려 하기 보다는 네이티브의 기능(카메라, 지도 등)과 웹의 기능이 혼합되어있는 것으로 생각하면 된다. 그렇다면 이 기능을 어떻게 연결할 수 있는가,

바로 자바스크립트 함수다. 웹 뷰내에 열린 페이지안에 있는 자바스크립트 함수는 네이티브 함수를 호출할 수 있으며, 반대로 네이티브안에서 자바스크립트의 함수를 호출할 수 있다. 또한, 매개변수(파라미터)를 전달할 수 있으며, 그에 대한 리턴값도 얻을 수 있다.

이 네이티브의 기능들을 호출할때 하나 하나 작성하기 귀찮을 경우 생각할 수 있는 것이 하이브리드 프레임워크(라이브러리들의 집합이랄까)이다. 대표적인 예가 폰갭과 코르도바 인데.. 얘네는 원래는 한 뿌리로 시작했지만, 어도비인가가 둘 중하나를 인수해서 갈라진 것으로 알고 있다. 호출 방식이나 이런건 거의 비슷..

이 프레임워크들을 사용하면 매우 간단하다. 웹의 js함수 한 두줄로, 네이티브의 카메라 기능을 호출할 수 있는 등.. 매우 코드가 간결해진다. 또한, 기본적으로 프레임워크의 이름을 단 웹뷰를 사용하기 때문에 세팅들도 왠만한건 다 되어있어 편리한 것이 가장 큰 장점이다. 단점이라면 외부의 프레임워크를 넣어서 하기 때문에 용량이 커지고, 프레임워크가 업데이트할 수록 그에 맞춰 코드들도 변경해줘야하는 번거로움이 있다. 즉, 안드로이드 버전 업 + 프레임워크 버전 업까지 신경써야하는 것이다.

어쨌든, 이 포스팅은 프레임워크가 아닌 안드로이드 내장 웹뷰를 사용하면서, 그에 대한 세팅 몇 가지를 소개할 것이다.

[레이아웃]

처음 말했듯이, 안드로이드에서 제공하는 웹뷰이기 때문에 간단하다.

[코드]

public class ContentActivity extends AppCompatActivity { WebView contentWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_content); contentWebView = (WebView) findViewById(R.id.contentWebView); WebSettings webSettings = contentWebView.getSettings(); webSettings.setSaveFormData(true); // 폼 입력 값 저장 여부 webSettings.setSupportZoom(true); // 줌 사용 여부 : HTML Meta태그에 적어놓은 설정이 우선 됨 webSettings.setBuiltInZoomControls(true); // 줌 사용 여부와 같이 사용해야 하는 설정(안드로이드 내장 기능) webSettings.setDisplayZoomControls(false); // 줌 사용 시 하단에 뜨는 +, – 아이콘 보여주기 여부 webSettings.setJavaScriptEnabled(true); // 자바스크립트 사용 여부 webSettings.setDomStorageEnabled(true); // 웹뷰내의 localStorage 사용 여부 webSettings.setGeolocationEnabled(true); // 웹뷰내의 위치 정보 사용 여부 //webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 웹뷰내의 JS의 window.open()을 허용할 것인지에 대한 여부 if (Build.VERSION.SDK_INT >= 16) { webSettings.setAllowFileAccessFromFileURLs(true); webSettings.setAllowUniversalAccessFromFileURLs(true); } if (Build.VERSION.SDK_INT >= 21){ webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // HTTPS HTTP의 연동, 서로 호출 가능하도록 } contentWebView.setWebViewClient(new MyWebViewClient(ContentActivity.this, refreshLayout)); contentWebView.setWebChromeClient(new MyWebChromeClient(ContentActivity.this)); contentWebView.addJavascriptInterface(new WebAppInterface(ContentActivity.this), “Android”); contentWebView.setDownloadListener(new DownloadListener() { // 웹뷰내 다운로드가 가능한 파일이 있다면! @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { try { Log.i(“DownloadInfo”, “url:” + url + “/userAgent:” + userAgent + “/contentDisposition:” + contentDisposition + “/mimetype:” + mimetype + “/contentLength:” + contentLength); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setMimeType(mimetype); request.addRequestHeader(“User-Agent”, userAgent); request.setDescription(“Downloading file”); String fileName = contentDisposition.replace(“inline; filename=”, “”); fileName = fileName.replaceAll(“\””, “”); request.setTitle(fileName); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); dm.enqueue(request); Toast.makeText(getApplicationContext(), “Downloading File”, Toast.LENGTH_LONG).show(); } catch (Exception e) { Log.e(“Exception”, e.toString()); mainActivity.sendLogMsgPHP(“WebViewDownloadManager:” + e.toString()); } } }); } }

현재 내가 사용하고 있는 웹뷰의 기본 세팅이다.

주석으로 처리된 것이 모든 것의 설명이다. 필요하면 쓰면 되고, 아니면 안쓰면 도

폼 입력값을 저장하거나, 자바스크립트 사용, localStorage 사용, 위치정보, 줌, Http & Https간 연동, 다운로드 리스너 등..

[자바스크립트 연동]

여기서 하이브리드앱의 꽃이 되는 코드는

webSettings.setJavaScriptEnabled(true); // 자바스크립트 사용 여부 webView.addJavascriptInterface(new WebAppInterface(MainActivity.this), “Android”);

이 두 줄이라 할 수 있다. 웹뷰 내에 자바스크립트를 사용가능하게 하는 설정과, 인터페이스.. 즉 웹과 네이티브간의 인터페이스를 Android란 이름으로 명명한다. 여기서 Android는 변수이므로 자유롭게 쓰면 된다.

여기서 사용한 Android.functionName으로 JS에서 호출이 가능하다.

function init(){ var result = JSON.parse(Android.getSystemData()); alert(result.myPhoneNum + ” / ” + result.pushToken); }

이 함수는 웹페이지의 body가 onLoad될 때 호출되는 함수인데, 여기서 result란 변수에는 Android.getSystemData()라는 네이티브 함수를 호출하고, 그에대한 리턴값을 제이슨으로 받아 문자열로 변환하는 것이다.

이처럼, JS -> Native 호출시엔 리턴 뿐만아니라 JSON값 까지 가능하다는 것! 반대로 Native -> JS 호출시엔 어떤 방식일까.

public void insertAuthNum(String authNum){ Log.i(“insertAuthNum”, “CALL : ” + authNum); webView.loadUrl(“javascript:insertAuthNum(‘” + authNum + “‘);”); }

이처럼 웹뷰의 loadUrl에 javascript: 를 사용하여 해당 JS함수를 호출하면 된다. authNum이란 파라미터까지 전달하는 것이다. 그렇다면 해당 URL을 열고 그에 대한 리턴값을 얻어올 수 있을까? 물론 가능하다.

public void insertAuthNum(final String authNum){ Log.i(“insertAuthNum”, “CALL : ” + authNum); // webView.loadUrl(“javascript:insertAuthNum(‘” + authNum + “‘);”); webView.post(new Runnable() { @Override public void run() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) webView.evaluateJavascript(“javascript:insertAuthNum(‘” + authNum + “‘);”, new ValueCallback () { @Override public void onReceiveValue(String value) { Log.i(“onReceiveValue”, value); } }); } }); }

위에 작성한 loadUrl대신 evaluateJavascript를 통해 가능하다. 여기서는 ValueCallBack을 지원하기 때문에 js에서 return한 값을 onReceiveValue에서 가져올 수 있다. 다만 버전이 킷캣 이상인 경우 가능하다는 것을 참고하자.

iOS는 불편하게도, 이게 안된다. 웹 js에서 네이티브 함수를 호출하고 그에대한 리턴값을 받을 수가 없어, 네이티브 쪽에서 js함수를 다시 호출해야한다. 그래서 호출하는 js함수, 값을 리턴받는 js함수 두 개가 필요한 불편함이 있다.

앱 구현 방식 어떻게 할까? 하이브리드, 네이티브, 플러터, RN

23 thg 3, 2022 — 웹뷰를 이용해서 대부분의 컨텐츠를 웹으로 처리하는 하이브리드 앱, 웹이 아니라 네이티브 앱 방식으로 개발하는 네이티브 앱, 그리고 새로운 프레임워크 …

  • Source: starrytheo.tistory.com
  • Views: 18896
  • Publish date: 20 hours ago
  • Downloads: 21590
  • Likes: 7292
  • Dislikes: 2
  • Title Website: 앱 구현 방식 어떻게 할까? 하이브리드, 네이티브, 플러터, RN
  • Description Website: 23 thg 3, 2022 — 웹뷰를 이용해서 대부분의 컨텐츠를 웹으로 처리하는 하이브리드 앱, 웹이 아니라 네이티브 앱 방식으로 개발하는 네이티브 앱, 그리고 새로운 프레임워크 …

세부 정보를 보려면 여기를 클릭하십시오.

6년차 개발자가 알려주는 개발용어 4. 모바일웹, 웹앱, 네이티브앱, 하이브리드앱

  • Source: Youtube
  • Views: 67510
  • Date: 19 hours ago
  • Download: 39853
  • Likes: 4352
  • Dislikes: 5

하이브리드앱 과 네이티브앱,웹뷰(앱뷰)의 개발,제작과 향후 …

때론 웹이 때론 앱이 그 한계성을 드러낼 가능성이 크며, 가장 흔하게는 앱내 기능 자체 구현이 어려운 경우가 발생 될 수 도 있습니다.(웹지원이 불가한 경우) 또한 앱,웹의 기능 개선을 따로이 생각하기가 어렵습니다.

단, cordova나 기타 tool(편의상 툴이라고 표현하겠습니다.)등에서 적절한 앱 환경 대응가능여부가 중요합니다. 대응이 불가능할경우 관리 및 업데이트에 많은 제약이 따를 수 있습니다.

– 웹뷰 타입의 경우는 기존 pc,mobile 웹을 그대로 패키징 하기 때문에 웹뷰부분만을 보완하면 되는 경우가 많습니다.그래서 가장 경제적입니다.

16 thg 6, 2021 — 하이브리드앱 과 네이티브앱,웹뷰(앱뷰) 의 개발,제작과 향후 업데이트에 대한 생각​. 앱개발(어플제작)을 할때 가장 많이 듣게 되는 개발 접근 방식 …

  • Source: blog.naver.com
  • Views: 98097
  • Publish date: 2 hours ago
  • Downloads: 102279
  • Likes: 2804
  • Dislikes: 5
  • Title Website: 하이브리드앱 과 네이티브앱,웹뷰(앱뷰)의 개발,제작과 향후 …
  • Description Website: 16 thg 6, 2021 — 하이브리드앱 과 네이티브앱,웹뷰(앱뷰) 의 개발,제작과 향후 업데이트에 대한 생각​. 앱개발(어플제작)을 할때 가장 많이 듣게 되는 개발 접근 방식 …

세부 정보를 보려면 여기를 클릭하십시오.

Ep3. 앱개발 처음하시는 분 15분만에 웹앱 만들기 소스 제공

  • Source: Youtube
  • Views: 17572
  • Date: 36 minute ago
  • Download: 23980
  • Likes: 3204
  • Dislikes: 4

하이브리드앱 과 네이티브앱,웹뷰(앱뷰)의 개발,제작과 향후 업데이트에 대한 생각

[하이브리드앱과 네이티브앱의 비교?]

다양한 형태의 앱개발 방식이 있습니다.

순수한앱개발, 하이브리드(웹을 기본으로), 단순 웹뷰형-패키징작업(앱을 씌운다고 하지요)등등

기술적인 환경 차이와, 개발에 대한 방법, 언어,환경이 다 다를 수 있습니다.

(개발적인 전문 지식을 논하지는 않겠습니다.^^;; – 복잡한것은 저도 싫기때문에^^_)

우리가 알고 싶은 경제성과 기간에 중점을 두어 차이를 생각해 보려 합니다.

1. 우선 가장 중요한 비용적인 측면에서(곧 기간이죠)

네이티브앱 > 하이브리드앱 > 웹뷰형-패키징작업 순이 됩니다.

– 네이티브앱은 순수한 앱개발이라고 표현합니다.

– 앱(안드로이드,아이폰)을 각각 os 환경에서 알맞게 별도로 제작합니다.(보통 다 이렇게 합니다.^^)

– 요새는 서버환경(웹)을 배제 할 수 없기 때문에 서버 작업이 별도 진행 됩니다.

– 경우에 따라 웹접근 환경(사용자,관리자)을 만들기도 합니다.(보통 관리자는 포함됩니다.)

– 웹뷰 타입의 경우는 기존 pc,mobile 웹을 그대로 패키징 하기 때문에 웹뷰부분만을 보완하면 되는 경우가 많습니다.그래서 가장 경제적입니다.

단, 기본이 되는 웹의 상태가 중요합니다.(기존 쇼핑몰, 홈페이지등에 대한 작업이 많습니다.)

2. 향후 유지관리 편의성 측면에서

웹뷰형-패키징작업 > 하이브리드앱 > 네이티브앱 순이 될 것 같습니다.

(경우와 개발마다 다르기때문에…일반적인 생각입니다. )

– 웹뷰형 패키징은 근간이 되는 웹의 문제가 없다면 앱은 거의 손댈일이 없습니다.(그만큼 특별한 기능이 없습니다.)

– 만약 웹뷰형 패키징에 기능 구현이 많이 되어져 있다면 상기 순서는 반대일 수 있습니다.^^;;(오히려 더 까다로워 집니다.)

– 하이브리드앱은 기본근간이 웹 입니다. 하나만 잘 관리해도 전체적인 관리가 가능합니다.

단, cordova나 기타 tool(편의상 툴이라고 표현하겠습니다.)등에서 적절한 앱 환경 대응가능여부가 중요합니다. 대응이 불가능할경우 관리 및 업데이트에 많은 제약이 따를 수 있습니다.

– 네이티브앱은 각기 앱 개발 환경과, andorid, ios 를 각각 관리해야 합니다.

크게 불편하기 보다는 관리체계가 나뉘어진다는 이야기 입니다.^^ (요새는 보통 개발자들인 두가지 os를 모두 다룹니다.^^)

3. 향후 업데이트에 대하여

이부분이 많은 고민이 되는 부분입니다.

저의 생각은

네이티브앱 > 하이브리드앱 = 웹뷰형-패키징

이 견해는 아마도 개발사,개발자마다의 시각,생각차가 나올 수 있겠지만…

저는 네이티브앱의 향후 확장,수정,업데이트가 가장 우수하다고 생각하는 사람중 하나 입니다.

(하이브리드앱이 나쁘고 네이티브앱이 좋다는 뜻이 아닙니다.^^, 그 목적에 맞는 개발 방식을 찾아야 한다는 이야기를 하고 싶습니다.)

왜냐하면…

하이브리드앱고 웹뷰형 패키징타입의 경우는 모두 웹(메인)서비스에 근간을 두어 개발하게 됩니다.

웹이 기본 시스템이고, 별도 특수한 기능이 많지 않을 경우(앱으로) 추천되는 형태입니다만, 사용자 환경이 많이 변하는 것이 요새이고

그 변화는 ‘스마트기기’에 의한 경우가 많습니다.

앱은 스마트기기에서 사용되는 소프트웨어 입니다.

사용자 환경이 변하면 앱도 변해야 하는 것은 당연한 일이겠지요…

이때, 웹의 근간을 둔 하이브리드앱의 경우는 그 확장과 업데이트에서 어려움이 따를 수 있습니다.

예를 들면, 앱기능을 강화(스마트기기 제어 부분)하기 위해 앱을 수정할때, 기본이 되는 웹과의 시스템 연계가 필수가 됩니다.

때론 웹이 때론 앱이 그 한계성을 드러낼 가능성이 크며, 가장 흔하게는 앱내 기능 자체 구현이 어려운 경우가 발생 될 수 도 있습니다.(웹지원이 불가한 경우) 또한 앱,웹의 기능 개선을 따로이 생각하기가 어렵습니다.

네이티브앱의 경우는…

각각의 앱 환경을 모두 개선해야 하는 번거로움이 따릅니다.

시간과 비용이 더 발생 될 수 있다는 의미이지요…

하지만 앱과 웹서버단을 기능외에 구현형태에 대하여 분리,관리,업데이트를 생각 할 수 있고,

때론 앱 자체만의 기능 개선을 직접 제어 할 수 도있습니다.

무엇보다 사용자 환경이 가장 많이 변하는 앱만을 단독 제어 할 수 도 있습니다.그리고 앱자체 기능 구현에서 문제되는것은 없습니다.(범주내)

웹뷰 타입의 경우는….

이는 근간인 웹서비스에 많은 영향을 받습니다.

하이브리드앱과는 다소 차이가 있는 구조라…보통 웹을 100% 활용하여 제작하기 때문입니다.

앱부분은 네이티브앱에 가깝지만, 기능 및 화면을 구현하는 거의 대부분을 기존 웹에서 차용하여 운용하기 때문입니다.

한마디로 경제성 마저도 복불복인 경우가 많습니다(기본 웹 환경에 대한 앱 대응 범위에 따라 천차만별이 됩니다.)

[iOS]WKWebView를 이용한 하이브리드 앱(Hybrid App) 제작하기

import Foundation import SystemConfiguration class Reachability { class func networkConnected() -> Bool { var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } } var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { return false } let isRachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 let neddsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 return (isRachable && !neddsConnection) } }

class ViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var webView: WKWebView! var popupView: WKWebView? … } extension ViewController{ func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { popupView = WKWebView(frame: UIScreen.main.bounds, configuration: configuration) popupView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] popupView?.uiDelegate = self view.addSubview(popupView!) return popupView } func webViewDidClose(_ webView: WKWebView) { if webView == popupView { popupView?.removeFromSuperview() popupView = nil } } }

17 thg 5, 2021 — Cordova 같은 모바일 개발 프레임워크를 이용하지 않고 직접 웹뷰를 사용하여 구현하였습니다. 하이브리드 앱을 개발 시 제가 생각하는 장단점을 …

  • Source: jingyu.tistory.com
  • Views: 82622
  • Publish date: 47 minute ago
  • Downloads: 43374
  • Likes: 2748
  • Dislikes: 6
  • Title Website: [iOS]WKWebView를 이용한 하이브리드 앱(Hybrid App) 제작하기
  • Description Website: 17 thg 5, 2021 — Cordova 같은 모바일 개발 프레임워크를 이용하지 않고 직접 웹뷰를 사용하여 구현하였습니다. 하이브리드 앱을 개발 시 제가 생각하는 장단점을 …

세부 정보를 보려면 여기를 클릭하십시오.

홈페이지 \u0026 어플 제작, 비용과 시간을 아끼는 방법 1편

  • Source: Youtube
  • Views: 73676
  • Date: 20 minute ago
  • Download: 78448
  • Likes: 1457
  • Dislikes: 8

[iOS]WKWebView를 이용한 하이브리드 앱(Hybrid App) 제작하기

오피스 체크인 모바일 웹 개발 이후 팀 결정에 따라 앱으로 출시하게 되었습니다.

모바일 웹은 이미 하이브리드 앱을 염두에 두고 개발되었고 저희 팀은 안드로이드와, iOS 개발이 가능하여

Cordova 같은 모바일 개발 프레임워크를 이용하지 않고 직접 웹뷰를 사용하여 구현하였습니다.

하이브리드 앱을 개발 시 제가 생각하는 장단점을 정리해보겠습니다.

장점

웹 개발이 완료되어 있는 경우 개발 소요시간이 적다.

이미 웹으로 개발되어 있는 서비스를 앱으로 출시하기만 하면 되기 때문에 네이티브 앱에 비하여 좀 더 빠르게 제작할 수 있습니다.

이미 웹으로 개발되어 있는 서비스를 앱으로 출시하기만 하면 되기 때문에 네이티브 앱에 비하여 좀 더 빠르게 제작할 수 있습니다. 모바일 웹에 푸시 알림, 위치기반 기능을 확장할 수 있다.

하이브리드로 제작된 앱은 네이티브와 마찬가지로 푸시 알림, 외부 앱 연동, 위치기반 기능을 구현할 수 있습니다.

하이브리드로 제작된 앱은 네이티브와 마찬가지로 푸시 알림, 외부 앱 연동, 위치기반 기능을 구현할 수 있습니다. 업데이트 시 매번 심사받을 필요가 없다.

플랫폼 개발 시 초기에 발생하는 UI 변경 및 기능개편이 자주 발생하게 되는데

하이브리드 앱은 네이티브와 관련된 기능이 변경된 것이 아니라면 매번 앱을 심사받을 필요가 없습니다.

단점

네이티브에 비해 매끄럽지 못한 UI

하이브리드 앱은 내부 구현을 전부 웹으로 하기 때문에 네이티브 앱처럼 부드러운 UI전환을 구현하기가 힘듭니다.

하이브리드 앱은 내부 구현을 전부 웹으로 하기 때문에 네이티브 앱처럼 부드러운 UI전환을 구현하기가 힘듭니다. 네트워크가 연결된 상태에서만 사용 가능하다.

우리가 흔히 사용하는 앱들은 네트워크 연결 상태와는 별개로 앱을 사용할 수 있습니다.

하이브리드 앱에 경우 네트워크가 연결되있지 않은 경우 앱에 일부 기능들을 이용하게끔 할 수는 있지만

대부분에 기능들을 웹으로 구현되기 때문에 네트워크 상태에 따라 원활한 서비스 제공이 안될 수 있습니다.

하이브리드 앱을 위한 WKWebView 설정 방법을 알아보겠습니다.

WKWebView를 이용하여 하이브리드 앱 만들기

개발환경

iOS 12.5

Swift5

Xcode12.4

React.js

목차

WKWebView 생성 및 기본 세팅 인터넷 연결 체크 브라우저 경고창 처리 (alert, confirm) javascript와 통신하는 방법 window.open()을 처리하는 방법 카메라, 앨범 접근을 위한 권한 처리

1. WKWebView 생성 및 기본 세팅

오피스 체크인에 모바일 홈페이지를 하이브리드 앱으로 제작하는 과정을 작성하겠습니다.

Url: https://m.officecheckin.com/

우선 앱 설정 화면 General -> Freamworks, Libraries, and Embedded Content에

WebKit.framework를 추가해준 후 프레임워크를 import 합니다.

앱 설정 화면 General -> Freamworks, Libraries, and Embedded Content 에 추가합니다.

import UIKit import WebKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } }

WebKit View를 화면에 추가한 뒤 여백 없이 화면을 꽉 채운 뒤 webView라는 이름으로 아웃렛을 연결한 후

웹뷰에 초기 설정하는 함수를 작성하겠습니다.

위에있는 Web View는 사용하시면 안됩니다.

class ViewController: UIViewController { @IBOutlet weak var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() webViewInit() } func webViewInit(){ WKWebsiteDataStore.default().removeData(ofTypes: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache], modifiedSince: Date(timeIntervalSince1970: 0)) { } webView.allowsBackForwardNavigationGestures = true if let url = URL(string: “https://m.officecheckin.com”) { let request = URLRequest(url: url) webView.load(request) } } }

WKWebsiteDataStore.default()는 WKWebView에 쿠키, 세션, 로컬 스토리지, 캐시 등 데이터를 관리하는 객체입니다.

저는 웹사이트 변경사항이 바로 앱에 반영되기를 원하므로 캐시 데이터는 앱 실행 시 제거되도록 코드를 추가하였습니다.

allowsBackForwardNavigationGestures속성은 좌 우 스와이프 동작시 뒤로 가기 앞으로 가기 기능을 활성화해 줍니다.

오피스 체크인 앱을 제작 예정이기 때문에 URL은 고정된 스트링 값을 전달하였습니다.

해당 함수를 viewDidLoad()에서 호출한 뒤 실행하겠습니다.

문제없이 webView가 로드되었습니다.

2. 인터넷 연결 체크

인터넷 연결이 안 된 경우 앱에 사용할 수 있는 기능이 없으므로 앱을 종료하도록 구현하겠습니다.

우선 연결 체크를 할 수 있는 Reachability클래스를 만들겠습니다.

import Foundation import SystemConfiguration class Reachability { class func networkConnected() -> Bool { var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } } var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { return false } let isRachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 let neddsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 return (isRachable && !neddsConnection) } }

참고 블로그

– https://trendy00develope.tistory.com/19

– https://ithoon.tistory.com/26

인터넷 연결은 viewDidApper에서 체크하겠습니다.

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard Reachability.networkConnected() else { let alert = UIAlertController(title: “NetworkError”, message: “네트워크가 연결되어있지 않습니다.”, preferredStyle: .alert) let okAction = UIAlertAction(title: “종료”, style: .default) { (action) in exit(0) } alert.addAction(okAction) self.present(alert, animated: true, completion: nil) return } }

모바일 비행기모드를 키고 앱 실행시 앱이 종료됩니다.

3. 브라우저 경고창 처리

브라우저에서 띄울 수 있는 경고창은 alert, confirm, prompt 세 가지 형태가 있습니다.

우선 webView에 uiDelegate를 연결해준 뒤 extension으로 WKUIDelegate를 확장하겠습니다.

override func viewDidLoad() { super.viewDidLoad() webView.uiDelegate = self webViewInit() }

세가지 함수를 전부 구현해주셔야 합니다,

extension ViewController: WKUIDelegate{ func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alert = UIAlertController(title: “”, message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: “확인”, style: .default) { (action) in completionHandler() } alert.addAction(okAction) self.present(alert, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { let alert = UIAlertController(title: “”, message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: “확인”, style: .default) { (action) in completionHandler(true) } let cancelAction = UIAlertAction(title: “취소”, style: .default) { (action) in completionHandler(false) } alert.addAction(okAction) alert.addAction(cancelAction) self.present(alert, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alert = UIAlertController(title: “”, message: prompt, preferredStyle: .alert) let okAction = UIAlertAction(title: “확인”, style: .default) { (action) in if let text = alert.textFields?.first?.text { completionHandler(text) } else { completionHandler(defaultText) } } alert.addAction(okAction) self.present(alert, animated: true, completion: nil) } }

구현은 UIAlertController에 delegate로 넘어온 메시지와 completionHandler을 이용하여 구현해주시면 됩니다.

4. Javascript와 통신하기

모바일 웹에서 핸드폰으로 좌표를 요청하는 기능을 만들고자 합니다.

우선 웹 페이지에서 webView로 메시지를 전달해야 됩니다.

window.webkit.messageHandlers로 접근하여 앱에 메시지를 보내실 수 있습니다.

const appLocationSearch = () => { const data = { action: ‘searchLocation’, value: ” } window.webkit.messageHandlers.locationSearch.postMessage(data) }

extension을 통해 WKScriptMessageHandler를 상속받으신 후 userContentController함수를 구현해줍니다.

위 함수는 javascript에서 메시지를 보내는 경우 호출됩니다.

extension ViewController: WKScriptMessageHandler{ func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if(message.name == “locationSearch”){ let data:[String:String] = message.body as! Dictionary //location Event //data[“action”] = searchLocation } } }

locationSearch로 메시지를 받을 경우 위치정보를 획득한 후 웹 페이지로 전달해야 합니다.

(위치정보를 얻어오는 과정은 추후 별도 포스팅으로 다뤄보겠습니다.)

window.OCAPP = { locationSearch : (latitude, longitude) => { if(!latitude && !longitude){ alert(‘위치정보를 가져오지 못했습니다.’) return false } //location search } }

우선 웹페이지 window객체에 OCAPP 객체를 만들어 앱에서 전달하는 이벤트들을 처리할 수 있도록 구현하겠습니다.

func postLocationInfo(){ if let latitude = locationManager.location?.coordinate.latitude, let longitude = locationManager.location?.coordinate.longitude { webView.evaluateJavaScript(“OCAPP.locationSearch(‘\(latitude)’,’\(longitude)’);”) } }

evaluateJavaScript 메서드는 첫 번째 매개변수로 전달된 javascript 코드를 webView에서 실행시켜줍니다.

자세한 스팩은 여기를 참고해주세요

https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript

5. window.open()을 처리하는 방법

웹뷰로 앱을 띄운 뒤 앱에서 새로운 창이 열리는 버튼을 눌러보면 동작하지 않는 것을 확인할 수 있습니다.

sns로그인이 동작하지 않습니다.

새창이 뜰 경우 새로운 웹뷰를 만들어 새로운 창에 띄어주도록 처리해야 합니다.

class ViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var webView: WKWebView! var popupView: WKWebView? … } extension ViewController{ func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { popupView = WKWebView(frame: UIScreen.main.bounds, configuration: configuration) popupView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] popupView?.uiDelegate = self view.addSubview(popupView!) return popupView } func webViewDidClose(_ webView: WKWebView) { if webView == popupView { popupView?.removeFromSuperview() popupView = nil } } }

createWebViewWith 함수는 새로운 인터넷 창이 떠야 될 경우 실행되는 함수입니다.

popupView를 옵셔널 WKWebView타입으로 선언 한 뒤 createWebViewWith 함수가 실행될 경우

새로운 웹뷰를 만들어 할당한 뒤 view에 붙이는 방식입니다.

webViewDidClose는 웹뷰가 종료될 경우 실행되는 함수입니다.

popupView가 종료될 경우 현재 뷰를 제거해주신 뒤 popupView에 nil을 할당합니다.

sns로그인 클릭시 새창에 로그인화면이 표시됩니다.

6. 카메라, 앨범 접근을 위한 권한 처리

아이폰 앱에 경우 카메라, 마이크, 앨범에 접근 시 권한 동의가 이루어져야 합니다.

info.plist에 해당 권한에 접근 정보를 기재하지 않을 경우 앱이 종료됩니다.

파일 업로드시 앨범, 카메라에 접근 가능합니다.

추가해야 될 속성은 세 가지 속성입니다.

Privacy – Camera Usage Description

Privacy – Microphone Usage Description

Privacy – Photo Library Usage Description

위부터 카메라, 카메라 음성, 사진앨범 권한에 대한 정보입니다.

Privacy – Location Whene In Use Usage Description 은 위치정보에 대한 동의입니다.

카메라 접근시 접근허용을 위한 경고창 표시됩니다.

이상 하이브리드 앱을 구동하기 위해 필수적으로 필요하다고 생각하는 부분을 다뤄봤습니다.

이 외에도 하이브리드 앱을 출시하는 데 있어서 신경 써야 할 부분들은 많습니다.

웹이 업데이트되는 것에 따라 앱에 버전 관리가 필요하고

웹이 앱으로 접속한 사용자를 구분할 수 있어야 합니다.

또 로그인 상태를 지속시키기 위해서 쿠키 데이터를 어디에 저장할지도 고민해야 합니다.

최초 사용자에게 튜토리얼 화면을 제공하고 앱이 사용하는 권한을 최초 한번 표시해주어야 합니다.

위 내용들은 추후 오피스 체크인 기술 블로그에서 다뤄보도록 하겠습니다.

이상 글을 마치며 지속적으로 개발 과정을 공유할 수 있도록 노력하겠습니다.

WebView에서 웹 앱 빌드 | Android 개발자

Kotlin private class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading (view: WebView?, url: String?): Boolean { if (Uri.parse(url).host == “www.example.com”) { // This is my web site, so do not override; let my WebView load the page return false } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { startActivity(this) } return true } } 자바 private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading (WebView view, String url) { if (“www.example.com”.equals(Uri.parse(url).getHost())) { // This is my website, so do not override; let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } }

Kotlin override fun onKeyDown (keyCode: Int, event: KeyEvent?): Boolean { // Check if the key event was the Back button and if there’s history if (keyCode == KeyEvent.KEYCODE_BACK && myWebView. canGoBack ()) { myWebView.goBack() return true } // If it wasn’t the Back key or there’s no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event) } 자바 @Override public boolean onKeyDown (int keyCode, KeyEvent event) { // Check if the key event was the Back button and if there’s history if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView. canGoBack ()) { myWebView. goBack (); return true; } // If it wasn’t the Back key or there’s no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event); } }

Kotlin // Create an unencoded HTML string // then convert the unencoded HTML string into bytes, encode // it with Base64, and load the data. val unencodedHtml = “‘%23’ is the percent code for ‘#‘ ” val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING) myWebView.loadData(encodedHtml, “text/html”, “base64”) 자바 // Create an unencoded HTML string // then convert the unencoded HTML string into bytes, encode // it with Base64, and load the data. String unencodedHtml = “‘%23’ is the percent code for ‘#‘ “; String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING); myWebView.loadData(encodedHtml, “text/html”, “base64”);

이 문서에서는 WebView 를 시작하는 방법과 추가 작업을 수행하는 방법(예: 페이지 탐색 처리, 웹페이지에서 Android 앱의 클라이언트 측 코드로 자바스크립트를 결합)을 …

  • Source: developer.android.com
  • Views: 35305
  • Publish date: 59 minute ago
  • Downloads: 103559
  • Likes: 5282
  • Dislikes: 4
  • Title Website: WebView에서 웹 앱 빌드 | Android 개발자
  • Description Website: 이 문서에서는 WebView 를 시작하는 방법과 추가 작업을 수행하는 방법(예: 페이지 탐색 처리, 웹페이지에서 Android 앱의 클라이언트 측 코드로 자바스크립트를 결합)을 …

세부 정보를 보려면 여기를 클릭하십시오.

Easily create hybrid apps and web apps. 🤓 (How to easily code front end using JQuery Mobile)

  • Source: Youtube
  • Views: 108523
  • Date: 16 minute ago
  • Download: 27854
  • Likes: 3775
  • Dislikes: 4

WebView에서 웹 앱 빌드

내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

웹 애플리케이션 또는 웹페이지만 클라이언트 애플리케이션의 일부로 제공하려는 경우 WebView 를 사용하면 됩니다. WebView 클래스는 Android의 View 클래스의 확장으로, 웹페이지를 활동 레이아웃의 일부로 표시할 수 있게 해 줍니다. 탐색 컨트롤이나 주소 표시줄 등 완전히 개발된 웹브라우저의 기능은 전혀 포함되어 있지 않습니다. WebView 의 모든 작업은 기본적으로 웹페이지를 표시하는 것입니다.

일반적으로 WebView 를 사용하는 것이 도움이 되는 상황은 최종 사용자 계약이나 사용자 가이드 같은 업데이트해야 할 정보를 앱에서 제공하려는 경우입니다. Android 앱 내에서는 WebView 를 포함하는 Activity 를 만들어 온라인으로 호스팅된 문서를 표시하는 데 사용할 수 있습니다.

WebView 가 도움이 되는 또 다른 상황은 이메일과 같은 데이터를 가져오기 위해 항상 인터넷이 연결되어 있어야 하는 사용자에게 앱에서 데이터를 제공하는 경우입니다. 이 경우 네트워크 요청을 수행한 다음 데이터를 파싱하고 Android 레이아웃에서 렌더링하는 것보다 모든 사용자 데이터가 포함된 웹페이지를 표시하는 WebView 를 Android 앱에 빌드하는 것이 더 쉽습니다. 대신에 Android 기기에 맞춤화된 웹페이지를 설계한 다음 웹페이지를 로드하는 WebView 을 Android 앱에 구현할 수 있습니다.

이 문서에서는 WebView 를 시작하는 방법과 추가 작업을 수행하는 방법(예: 페이지 탐색 처리, 웹페이지에서 Android 앱의 클라이언트 측 코드로 자바스크립트를 결합)을 설명합니다.

앱에 WebView 추가

WebView 를 앱에 추가하려면 활동 레이아웃에서 요소를 포함하거나 onCreate() 에서 전체 활동 창을 WebView 로 설정하면 됩니다.

활동 레이아웃에서 WebView 추가

레이아웃에서 WebView 을 앱에 추가하려면 다음 코드를 활동의 레이아웃 XML 파일에 추가합니다.

WebView 에서 웹페이지를 로드하려면 loadUrl() 을 사용합니다. 예:

Kotlin val myWebView: WebView = findViewById(R.id.webview) myWebView.loadUrl(“http://www.example.com”) 자바 WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl(“http://www.example.com”);

onCreate()에서 WebView 추가

대신 활동의 onCreate() 메서드에서 WebView 를 앱에 추가하려면 다음과 유사한 로직을 사용합니다.

Kotlin val myWebView = WebView(activityContext) setContentView(myWebView) 자바 WebView myWebView = new WebView(activityContext); setContentView(myWebView);

그런 다음 아래와 같이 페이지를 로드합니다.

Kotlin myWebView.loadUrl(“http://www.example.com”) 자바 myWebView.loadUrl(“https://www.example.com”);

또는 HTML 문자열에서 URL을 로드합니다.

Kotlin // Create an unencoded HTML string // then convert the unencoded HTML string into bytes, encode // it with Base64, and load the data. val unencodedHtml = “‘%23’ is the percent code for ‘#‘ ” val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING) myWebView.loadData(encodedHtml, “text/html”, “base64”) 자바 // Create an unencoded HTML string // then convert the unencoded HTML string into bytes, encode // it with Base64, and load the data. String unencodedHtml = “‘%23’ is the percent code for ‘#‘ “; String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING); myWebView.loadData(encodedHtml, “text/html”, “base64”);

참고: 이 HTML로 수행할 수 있는 작업에는 제한이 있습니다. 인코딩 옵션에 관한 자세한 내용은 loadData() 및 loadDataWithBaseURL() 을 참조하세요.

그러나 이 작업을 수행하려면 앱이 인터넷에 액세스할 수 있어야 합니다. 인터넷 액세스 권한을 받으려면 manifest 파일에서 INTERNET 권한을 요청합니다. 예:

이러한 작업이 웹페이지를 표시하는 기본 WebView 에 필요한 모든 사항입니다. 이 외에도 다음을 수정하여 WebView 를 맞춤설정할 수 있습니다.

WebChromeClient 로 전체 화면 지원 사용 설정. 이 클래스는 WebView 가 창을 만들거나 닫고 자바스크립트 대화상자를 사용자에게 전송하는 등 호스트 앱의 UI를 변경하기 위한 권한을 필요로 할 때도 호출됩니다. 이 같은 상황에서 디버깅하는 방법을 자세히 알아보려면 웹 앱 디버깅을 참조하세요.

로 전체 화면 지원 사용 설정. 이 클래스는 가 창을 만들거나 닫고 자바스크립트 대화상자를 사용자에게 전송하는 등 호스트 앱의 UI를 변경하기 위한 권한을 필요로 할 때도 호출됩니다. 이 같은 상황에서 디버깅하는 방법을 자세히 알아보려면 웹 앱 디버깅을 참조하세요. WebViewClient 를 사용한 탐색 오류 또는 양식 제출 오류 등 콘텐츠 렌더링에 영향을 미치는 이벤트 처리. 이 서브클래스를 사용하여 URL 로드를 가로챌 수도 있습니다.

를 사용한 탐색 오류 또는 양식 제출 오류 등 콘텐츠 렌더링에 영향을 미치는 이벤트 처리. 이 서브클래스를 사용하여 URL 로드를 가로챌 수도 있습니다. WebSettings 를 수정하여 자바스크립트 사용 설정.

를 수정하여 자바스크립트 사용 설정. WebView 에 삽입된 Android 프레임워크 객체에 자바스크립트를 사용하여 액세스.

WebView에서 자바스크립트 사용

WebView 에 로드하려는 웹페이지가 자바스크립트를 사용하는 경우 에 자바스크립트를 사용하도록 설정해야 합니다. 자바스크립트가 사용 설정되면 앱 코드와 자바스크립트 코드 간에 인터페이스를 만들 수도 있습니다.

자바스크립트 사용 설정

기본적으로 자바스크립트는 WebView 에서 사용 중지됩니다. 자바스크립트는 WebView 에 연결된 WebSettings 를 통해 사용 설정할 수 있습니다. getSettings() 로 WebSettings 를 가져온 다음 setJavaScriptEnabled() 로 자바스크립트를 사용 설정할 수 있습니다.

예:

Kotlin val myWebView: WebView = findViewById(R.id.webview) myWebView.settings.javaScriptEnabled = true 자바 WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);

WebSettings 를 사용하면 다양하고 유용한 기타 설정에 액세스할 수 있습니다. 예를 들어 Android 앱의 WebView 전용으로 설계된 웹 애플리케이션을 개발하는 경우 setUserAgentString() 을 사용하여 맞춤 사용자 에이전트 문자열을 정의한 다음, 웹페이지에서 맞춤 사용자 에이전트를 쿼리하여 웹페이지를 요청하는 클라이언트가 실제로 Android 앱인지 확인할 수 있습니다.

자바스크립트 코드를 Android 코드에 결합

Android 앱의 WebView 전용으로 설계된 웹 애플리케이션을 개발하는 경우 자바스크립트 코드와 클라이언트 측 Android 코드 간에 인터페이스를 만들 수 있습니다. 예를 들어 자바스크립트 코드는 Dialog 를 표시할 때 자바스크립트의 alert() 함수를 사용하는 대신 Android 코드에서 메서드를 호출할 수 있습니다.

자바스크립트 코드와 Android 코드 간의 새 인터페이스를 결합하려면 addJavascriptInterface() 를 호출한 다음, 자바스크립트에 결합할 클래스 인스턴스와 자바스크립트가 클래스 액세스를 위해 호출할 수 있는 인터페이스 이름에 전달합니다.

예를 들어 Android 앱에 다음 클래스를 포함할 수 있습니다.

Kotlin /** Instantiate the interface and set the context */ class WebAppInterface(private val mContext: Context) { /** Show a toast from the web page */ @JavascriptInterface fun showToast(toast: String) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show() } } 자바 public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }

주의: targetSdkVersion 을 17 이상으로 설정한 경우 자바스크립트에 사용 가능하게 할 모든 메서드에 @JavascriptInterface 주석을 추가해야 합니다(메서드도 공개 메서드여야 함). 주석을 제공하지 않으면 Android 4.2 이상에서 실행될 때 웹페이지가 메서드에 액세스할 수 없습니다.

이 예에서는 WebAppInterface 클래스에서 showToast() 메서드를 사용하여 웹페이지에 Toast 메시지를 만들 수 있도록 허용합니다.

addJavascriptInterface() 를 사용하여 WebView 에서 실행되는 자바스크립트에 이 클래스를 결합하고 인터페이스에 Android 라는 이름을 지정할 수 있습니다. 예:

Kotlin val webView: WebView = findViewById(R.id.webview) webView.addJavascriptInterface(WebAppInterface(this), “Android”) 자바 WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), “Android”);

이렇게 하면 WebView 에서 실행되는 자바스크립트를 위한 Android 라는 인터페이스가 만들어집니다. 이제 웹 애플리케이션은 WebAppInterface 클래스에 액세스할 수 있습니다. 예를 들어 다음은 사용자가 버튼을 클릭하면 새 인터페이스를 사용하여 알림 메시지를 만드는 자바스크립트 및 HTML입니다.

자바스크립트에서 Android 인터페이스를 초기화할 필요가 없습니다. WebView 가 이 인터페이스를 웹페이지에 사용할 수 있도록 자동으로 설정합니다. 따라서 버튼을 클릭하면 showAndroidToast() 함수가 Android 인터페이스를 사용하여 WebAppInterface.showToast() 메서드를 호출합니다.

참고: 자바스크립트에 결합된 객체는 객체가 생성된 스레드가 아닌 다른 스레드에서 실행됩니다.

주의: addJavascriptInterface() 를 사용하면 자바스크립트가 Android 앱을 제어할 수 있게 됩니다. 이는 유용한 기능일 수 있지만 동시에 위험한 보안 문제가 될 수 있습니다. WebView 에 포함된 HTML이 신뢰할 수 없는 HTML인 경우(예: HTML의 일부 또는 전체가 알 수 없는 사람이나 프로세스에 의해 제공된 경우) 공격자가 클라이언트 측 코드와 공격자가 선택한 모든 코드를 실행하는 HTML을 포함할 수 있습니다. 따라서 개발자는 WebView 에 표시되는 HTML 및 자바스크립트를 모두 작성한 경우가 아니면 addJavascriptInterface() 를 사용해서는 안 됩니다. 또한 사용자에게 WebView 내에서 개발자 소유가 아닌 다른 웹페이지로 이동하도록 허용해서는 안 됩니다. 대신 사용자의 기본 브라우저 애플리케이션에서 외부 링크를 열 수 있도록 허용합니다. 기본적으로 사용자의 웹브라우저는 모든 URL 링크를 엽니다. 따라서 위 섹션에서 설명한 것처럼 페이지 탐색을 처리하는 경우에만 주의합니다.

페이지 탐색 처리

사용자가 WebView 에서 웹페이지의 링크를 클릭하면 URL을 처리하는 앱이 Android에서 실행되는 것이 기본 동작입니다. 대개 기본 웹브라우저에 도착 URL이 열리고 로드됩니다. 하지만 링크가 WebView 내에서 열리도록 WebView 의 이 동작을 재정의할 수 있습니다. 그러면 WebView 에 의해 유지 관리되는 웹페이지 방문 기록을 통해 사용자가 앞뒤로 탐색할 수 있습니다.

참고: 보안상의 이유로 시스템의 브라우저 앱은 앱과 애플리케이션 데이터를 공유하지 않습니다.

사용자가 클릭한 링크를 열려면 setWebViewClient() 를 사용하여 WebView 에 WebViewClient 를 제공합니다. 예:

Kotlin val myWebView: WebView = findViewById(R.id.webview) myWebView. webViewClient = WebViewClient() 자바 WebView myWebView = (WebView) findViewById(R.id.webview); myWebView. setWebViewClient (MyWebViewClient);

이상입니다. 이제 사용자가 클릭한 모든 링크가 WebView 에 로드되었습니다.

클릭한 링크가 로드되는 위치를 좀더 세부적으로 설정하려면 shouldOverrideUrlLoading() 메서드보다 우선 적용되는 고유한 WebViewClient 를 만듭니다. 예:

Kotlin private class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading (view: WebView?, url: String?): Boolean { if (Uri.parse(url).host == “www.example.com”) { // This is my web site, so do not override; let my WebView load the page return false } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { startActivity(this) } return true } } 자바 private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading (WebView view, String url) { if (“www.example.com”.equals(Uri.parse(url).getHost())) { // This is my website, so do not override; let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } }

그런 다음 WebView 에 이 새 WebViewClient 의 인스턴스를 만듭니다.

Kotlin val myWebView: WebView = findViewById(R.id.webview) myWebView. webViewClient = MyWebViewClient() 자바 WebView myWebView = (WebView) findViewById(R.id.webview); myWebView. setWebViewClient (new MyWebViewClient());

이제 사용자가 링크를 클릭하면 시스템은 URL 호스트가 위에 정의된 대로 특정 도메인과 일치하는지 확인하는 shouldOverrideUrlLoading() 을 호출합니다. 일치하는 경우 메서드는 URL 로드를 재정의하지 않도록 false를 반환합니다(따라서 WebView 가 정상적으로 URL을 로드함). URL 호스트가 일치하지 않으면 URL(사용자의 기본 웹브라우저로 확인됨) 처리에 관한 기본 활동을 실행하기 위한 Intent 가 생성됩니다.

웹페이지 방문 기록 탐색

WebView 가 URL 로드를 재정의하면 방문한 웹페이지의 방문 기록이 자동으로 누적됩니다. goBack() 및 goForward() 를 사용하여 방문 기록을 통해 앞뒤로 탐색할 수 있습니다.

예를 들면 다음은 Activity 가 기기 뒤로 버튼을 사용하여 뒤로 탐색하는 방법입니다.

Kotlin override fun onKeyDown (keyCode: Int, event: KeyEvent?): Boolean { // Check if the key event was the Back button and if there’s history if (keyCode == KeyEvent.KEYCODE_BACK && myWebView. canGoBack ()) { myWebView.goBack() return true } // If it wasn’t the Back key or there’s no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event) } 자바 @Override public boolean onKeyDown (int keyCode, KeyEvent event) { // Check if the key event was the Back button and if there’s history if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView. canGoBack ()) { myWebView. goBack (); return true; } // If it wasn’t the Back key or there’s no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event); } }

canGoBack() 메서드는 사용자가 방문할 웹페이지 방문 기록이 실제로 있으면 true를 반환합니다. 마찬가지로 개발자는 canGoForward() 를 사용하여 이전 페이지 방문 기록이 있는지 확인할 수 있습니다. 개발자가 이 확인을 하지 않으면 사용자가 마지막 방문 기록에 도달했을 때 goBack() 또는 goForward() 는 아무 반응을 하지 않습니다.

기기 구성 변경 처리

런타임 중에 사용자가 기기를 회전하거나 IME(입력 방식 편집기)를 닫는 등 기기의 구성이 변경되면 액티비티 상태가 변경됩니다. 이 변경으로 인해 WebView 객체의 액티비티가 삭제하고 새 액티비티가 생성될 뿐 아니라 삭제된 객체의 URL을 로드하는 새 WebView 객체도 생성됩니다. 액티비티의 기본 동작을 수정하려면 manifest에서 액티비티가 orientation 변경을 처리하는 방법을 변경하면 됩니다. 런타임 시 구성 변경을 처리하는 방법에 관한 자세한 내용은 구성 변경 처리를 참조하세요.

창 관리

기본적으로 새 창을 열어 달라는 요청은 무시됩니다. 이 점은 창이 자바스크립트에 의해 열리든지 링크의 타겟 속성에 의해 열리든지 관계없습니다. WebChromeClient 를 맞춤설정하여 창을 여러 개 열기 위한 고유 동작을 제공할 수 있습니다.

[Android] 안드로이드 앱 내 웹뷰(Webview) 구현하기 – 김컴공랩

5번째 코드를 입력함으로써 전체 화면 지원 사용을 설정할 수 있습니다. 이 클래스는 웹뷰가 새로운 창을 띄우거나 자바스크립트를 통해 생성된 대화상자를 이용자에게 전달하는 등의 권한을 필요로 할 때도 호출 합니다. 웹크롬클라이언트에 관련된 문서가 있으니 참고하시기 바랍니다. (developer.android.com/reference/android/webkit/WebChromeClient)

webview = (WebView)findViewById(R.id.webview); webview.loadUrl(url); WebSettings webSettings = webview.getSettings(); webSettings.setJavaScriptEnabled(true); webview.setWebChromeClient(new WebChromeClient());

현재 저는 제가 호스팅하고 있는 웹 어플리케이션을 url 변수로 넣어놓았기 때문에, 보안이 적용된 https 가 아닌 http 주소이기 때문에 다음과 같은 오류가 발생하였습니다. (https:// 로 시작하는 주소를 넣은 분들은 작동이 될 겁니다.)

3 thg 9, 2020 — 헬로월드! 김컴공입니다. 오늘은 하이브리드 앱을 구현하기 위한 기초로, 안드로이드 앱 내에서 웹 페이지를 띄우는 작업을 해보겠습니다.

  • Source: kimce.tistory.com
  • Views: 93328
  • Publish date: 57 minute ago
  • Downloads: 23514
  • Likes: 712
  • Dislikes: 2
  • Title Website: [Android] 안드로이드 앱 내 웹뷰(Webview) 구현하기 – 김컴공랩
  • Description Website: 3 thg 9, 2020 — 헬로월드! 김컴공입니다. 오늘은 하이브리드 앱을 구현하기 위한 기초로, 안드로이드 앱 내에서 웹 페이지를 띄우는 작업을 해보겠습니다.

세부 정보를 보려면 여기를 클릭하십시오.

요즘 앱개발은 플러터로 해도 충분한듯 (플러터 설명과 장단점)

  • Source: Youtube
  • Views: 34623
  • Date: 19 hours ago
  • Download: 6941
  • Likes: 3682
  • Dislikes: 7

[Android] 안드로이드 앱 내 웹뷰(Webview) 구현하기

헬로월드! 김컴공입니다.

오늘은 하이브리드 앱을 구현하기 위한 기초로, 안드로이드 앱 내에서 웹 페이지를 띄우는 작업을 해보겠습니다.

안드로이드 내 웹뷰는 웹페이지의 자바스크립트가 앱의 API를 호출하여 웹 기반 애플리케이션에 Android API 를 제공할 수 있습니다.

하지만 대신 탐색 컨트롤이나 주소표시줄 등 완전히 개발된 웹브라우저의 기능은 전혀 포함되지 않습니다.

검색창이 없는 웹브라우저라고 생각하시면 되겠습니다.

저같은 경우에는 Vue 로 만든 웹 어플리케이션을 안드로이드 어플리케이션에서 볼 수 있게 하려고 합니다. 따라서 제 작업을 기준으로 설명을 드리도록 하겠습니다.

우선 안드로이드 스튜디오로 안드로이드 프로젝트를 하나 만들어 주세요. 그 후에

activity_main.xml 이라는 레이아웃 XML 파일에 위 사진과 같이 다음 웹뷰 코드를 추가하겠습니다.

그리고 MainActivity.java 의 MainActivity 클래스에서 웹뷰를 보이게 하도록 코드를 짜겠습니다.

아래 코드를 onCreate 함수 위에 입력해주세요. 이 함수를 호출하기 전에 먼저 선언을 하고 이 함수 안에서 선언한 변수를 호출 할 예정입니다.

private WebView webview; private String url = “접속할 주소”;

url 변수에는 접속할 웹 주소를 입력하시면 됩니다. 저 같은 경우에는 보여줄 웹 어플리케이션의 주소를 입력했습니다.

그 후 onCreate 함수 내에서 setContentView(R.layout.activity_main); 이후로 다음과 같은 코드를 입력해주세요.

webview = (WebView)findViewById(R.id.webview); webview.loadUrl(url); WebSettings webSettings = webview.getSettings(); webSettings.setJavaScriptEnabled(true); webview.setWebChromeClient(new WebChromeClient());

1번째 코드는 아까 위에서 선언했던 웹뷰를 이용해서, xml 에서 생성했던 웹뷰를 지정한 것이고,

2번째 코드는 입력한 url 주소를 웹뷰에서 보여주는 것입니다.

기본적으로 자바스크립트는 웹뷰에서 사용이 불가능하게 되어있습니다.

3~4번째 코드는 우리가 선언한 웹뷰를 설정하는 것으로, 자바스크립트가 허용되도록 합니다.

5번째 코드를 입력함으로써 전체 화면 지원 사용을 설정할 수 있습니다. 이 클래스는 웹뷰가 새로운 창을 띄우거나 자바스크립트를 통해 생성된 대화상자를 이용자에게 전달하는 등의 권한을 필요로 할 때도 호출 합니다. 웹크롬클라이언트에 관련된 문서가 있으니 참고하시기 바랍니다. (developer.android.com/reference/android/webkit/WebChromeClient)

이렇게 코드를 짰다하더라도, 이 어플리케이션에 인터넷 액세스 권한이 없다면 웹뷰가 정상적으로 동작하지 않습니다.

이 어플리케이션의 매니페스트(AndroidManifestm.xml) 로 가서, 내에 다음과 같은 인터넷 액세스 권한 허용 코드를 입력합니다.

자 이제 빌드해서 안드로이드 가상머신에 실행시켜보겠습니다.

오류 메세지가 뜨는 것을 확인했습니다.

현재 저는 제가 호스팅하고 있는 웹 어플리케이션을 url 변수로 넣어놓았기 때문에, 보안이 적용된 https 가 아닌 http 주소이기 때문에 다음과 같은 오류가 발생하였습니다. (https:// 로 시작하는 주소를 넣은 분들은 작동이 될 겁니다.)

에러메세지에도 나와있듯, CLEARTEXT 에 대한 액세스 권한 허용이 필요한 듯 보입니다. 따라서 아까 인터넷 액세스 권한을 입력했던 안드로이드 매니페스트 파일로 다시 돌아가서, 내에 다음과 같은 코드를 입력합니다.

android:usesCleartextTraffic=”true” …

그렇다면 정상적으로 http 주소도 접속할 수 있게 됩니다.

이렇게 안드로이드 앱 내에서 웹뷰를 구현하는 것을 마치겠습니다. 오류 사항이나 문제점이 발견되면 댓글 부탁드리겠습니다.

[React Native] WebView만 있는 하이브리드 앱 만들기 – 만족

/** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow strict-local */ import React from ‘react’; import { SafeAreaView, StatusBar, StyleSheet, useColorScheme, Alert, BackHandler } from ‘react-native’; import MyWebView from ‘./components/MyWebView’; const App = () => { const isDarkMode = useColorScheme() === ‘dark’; return ( <> { Alert.alert(‘앱 종료’, ‘앱을 종료하시겠습니까?’, [ { text: ‘아니오’, onPress: () => null, }, {text: ‘예’, onPress: () => BackHandler.exitApp()}, ]); }}/> ); }; const styles = StyleSheet.create({ root: { flex: 1 }, }); export default App;

ios의 경우 /ios/[PROJECT_NAME]/Images.xassets/AppIcon.appiconset/에 Assets.xassets폴더 내용물들을 붙여넣기한다.

14 thg 7, 2021 — RN에서는 기본 컴포넌트로 웹뷰를 제공하지 않는다. 따라서 webview모듈을 설치할 것이다. npm install –save react-native-webview.

  • Source: satisfactoryplace.tistory.com
  • Views: 106083
  • Publish date: 13 hours ago
  • Downloads: 67725
  • Likes: 1529
  • Dislikes: 2
  • Title Website: [React Native] WebView만 있는 하이브리드 앱 만들기 – 만족
  • Description Website: 14 thg 7, 2021 — RN에서는 기본 컴포넌트로 웹뷰를 제공하지 않는다. 따라서 webview모듈을 설치할 것이다. npm install –save react-native-webview.

세부 정보를 보려면 여기를 클릭하십시오.

[Core코인] Satoshi 채굴앱 새버젼 출시. 업데이트 하세요.

  • Source: Youtube
  • Views: 41692
  • Date: 9 hours ago
  • Download: 91645
  • Likes: 8926
  • Dislikes: 7

[React Native] WebView만 있는 하이브리드 앱 만들기

사전 준비

시작하기 전에 아래 링크를 읽고 환경설정과 프로젝트 생성을 완료한다.

https://satisfactoryplace.tistory.com/138?category=872124

https://satisfactoryplace.tistory.com/139?category=872124

react-native-webview 설치

https://github.com/react-native-webview/react-native-webview

RN에서는 기본 컴포넌트로 웹뷰를 제공하지 않는다.

따라서 webview모듈을 설치할 것이다.

npm install –save react-native-webview

이제 설치한 모듈을 네이티브 컴포넌트와 링킹하기 위해 아래 명령어를 실행한다

react-native link react-native-webview

준비: Android

android를 빌드할 예정이라면 이 과정을 따른다.

android 디렉터리의 gradle.properies로 들어가서 아래 라인을 추가한다.

(이미 존재한다면 이 단계는 건너뛴다)

android.useAndroidX=true android.enableJetifier=true

준비: IOS

IOS도 빌드할 예정이라면, ios디렉터리로 이동한 다음 아래 명령어를 실행한다.

pod install

만약 설치된 cocoapod의 버전이 낮다는 오류 메시지가 나올 경우

sudo gem install cocoapods pod install

를 실행한다.

WebView컴포넌트 추가

component폴더를 생성하고, 그 안에 MyWebView.js 파일을 생성한 후 아래 내용을 붙여넣는다.

import React, {useEffect, useState} from ‘react’; import { BackHandler, } from ‘react-native’; import {WebView} from ‘react-native-webview’; const MyWebView= ({handleClose}) => { const BASE_URL = ‘YOUR_WEBSITE_URL’; const [webview, setWebview] = useState(); const [goBackable, setGoBackable] = useState(false); useEffect(() => { const backHandler = BackHandler.addEventListener( ‘hardwareBackPress’, () => { console.log(‘goBackable’, goBackable); if (goBackable) webview.goBack(); else handleClose(); return true; }, ); return () => backHandler.remove(); }, [goBackable]); useEffect(() => { if (webview && webview.clearCache) webview.clearCache(); }, [webview]); return ( setWebview(ref)} injectedJavaScript={` (function() { function wrap(fn) { return function wrapper() { var res = fn.apply(this, arguments); window.ReactNativeWebView.postMessage(window.location.href); return res; } } history.pushState = wrap(history.pushState); history.replaceState = wrap(history.replaceState); window.addEventListener(‘popstate’, function() { window.ReactNativeWebView.postMessage(window.location.href); }); })(); true; `} onMessage={(event) => { const url = event.nativeEvent.data; setGoBackable(url !== BASE_URL); console.log(‘onMessage’, event.nativeEvent.data); }} /> ); }; export default MyWebView;

const BASE_URL= “YOUR_WEBSITE_URL” 부분을 원하는 주소로 변경한다.

https://test.com 이라면 const BASE_URL= “https://test.com”으로 변경한다.

App.js는 다음과 같이 변경한다.

/** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow strict-local */ import React from ‘react’; import { SafeAreaView, StatusBar, StyleSheet, useColorScheme, Alert, BackHandler } from ‘react-native’; import MyWebView from ‘./components/MyWebView’; const App = () => { const isDarkMode = useColorScheme() === ‘dark’; return ( <> { Alert.alert(‘앱 종료’, ‘앱을 종료하시겠습니까?’, [ { text: ‘아니오’, onPress: () => null, }, {text: ‘예’, onPress: () => BackHandler.exitApp()}, ]); }}/> ); }; const styles = StyleSheet.create({ root: { flex: 1 }, }); export default App;

내부 화면 작성은 끝났다!

앱 아이콘 생성 및 설정

아이콘 리소스 파일이 준비되었다면

https://satisfactoryplace.tistory.com/143?category=872124

를 참고하여 각 디바이스별 리소스를 생성한다.

결과물은 위와 같다.

android의 경우 /android/app/src/main/res 에 존재하는 각 폴더에 위 내용물들을 넣는다.

ios의 경우 /ios/[PROJECT_NAME]/Images.xassets/AppIcon.appiconset/에 Assets.xassets폴더 내용물들을 붙여넣기한다.

이제 yarn android 또는 yarn ios로 실행시켜서 정상적으로 적용되는지 검사한다

잘 된다.

앱 이름 변경

기본적으로는 앱 이름이 프로젝트 이름과 동일하다.

앱 이름을 변경해 보자.

android의 경우 /android/app/src/main/res/values/strings.xml로 들어가서

원하는 앱 이름

처럼 변경한다.

ios의 경우 /ios/[PROJECT_NAME]/info.plist 를 편집기로 열어서

CFBundleDisplayName 원하는 앱 이름

CFBundleDisplayName을 찾아 ~에 원하는 이름을 입력한다.

마찬가지로 yarn android 또는 yarn ios로 실행시켜서 정상적으로 적용되는지 검사한다

정상적으로 적용되었다.

주제에 대한 관련 정보 하이브리드 앱 웹뷰

Bing에서 하이브리드 앱 웹뷰 주제에 대한 최신 정보를 볼 수 있습니다.


주제에 대한 기사 보기를 마쳤습니다 하이브리드 앱 웹뷰. 이 기사가 유용했다면 공유하십시오. 매우 감사합니다. 사람들이 이 주제와 관련하여 자주 검색하는 키워드: 하이브리드 앱 웹뷰 안드로이드 하이브리드앱 웹뷰, 웹뷰 하이브리드앱 차이, 하이브리드 앱 만들기, 대표적인 하이브리드 앱, 하이브리드 앱 구조, 하이브리드 앱 단점, 하이브리드 앱 예시, 하이브리드 앱 CSS

See also  베스트 1712 팔콘 앤 윈터 솔져 6 화 새로운 업데이트 85 분 전

Leave a Comment