inappbrowser 설치 안된 앱 intent 호출시 에러

임종필·2022년 7월 28일
0

inappbrowser 설치안된 앱 intent 호출시 에러

cordova inappbrowser 에서 타앱 주로 결제하려할때 결제 카드앱 등이 설치되어 있지 않을시 플레이스토어 마켓으로 바로가기 해주면 좋은데, 이부분이 설정되어있지 않아서 아래와 같이 에러 페이지를 뱉어낸다.

웹페이지를 사용할 수 없음
다음 이유로 intent://~~~
의 웹페이지를 로드할 수 없습니다.

net::ERR_UNKNOWN_URL_SCHEME

inAppBorwser.java 파일을 수정해 주어야 한다.

cordova 환경에서는

/platforms/android/app/src/main/java/org/apache/cordova/inappbrowser/inAppBorwser.java

capacitor 환경에서는

/android/capacitor-cordova-plugins/src/main/java/org/apache/cordova/inppbrowser/inAppBorwser.java

파일을 아래와 같이 수정해준다.

"intent:" 로 검색하면 1203 번째줄 정도에 아래와 같이나온다.

} else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:") || url.startsWith("intent:")) {
                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    cordova.getActivity().startActivity(intent);
                    override = true;
                } catch (android.content.ActivityNotFoundException e) {
                    LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString());
                }
            }

이 부분을 아래와 같이 변경해준다.

} else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:") || url.startsWith("intent:")) {
                try {
                     //url 주소로 intent 생성                
                    Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                    // 패키지명 
                    String packgeName = String.valueOf(intent.getPackage());
						
                    if (packgeName != null && packgeName.length()>0 && !packgeName.equals("") && !packgeName.contains("null")) {
                    // 팩키지가 설치되어 있는지 확인
                    Intent existPackage = cordova.getActivity().getPackageManager().getLaunchIntentForPackage(intent.getPackage());

                    if (existPackage != null) {
                       //앱설치되어 있을때는 앱실행
                       cordova.getActivity().startActivity(intent);
                       override = true;
                    }else{
                        //앱설이 안되있으면 마켓으로 이동
                        Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                        marketIntent.setData(Uri.parse("market://details?id="+packgeName));
                        cordova.getActivity().startActivity(marketIntent);
                        override = true;
                    }
                    }
                } catch (ActivityNotFoundException | URISyntaxException e) {
                    LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString());
                }
}

PS 1
이렇게 바꾸면 에러가 난다. java 자주 하던 사람은 import 해주면 되는 것을 아는데, java잘 안하던 사람은
1. Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
parseUri 부분에 마우스 올리면 파일 add 해줄꺼냐고 물어보는데 눌러서 import 해주소
2. } catch (ActivityNotFoundException | URISyntaxException e) {
에서 ActivityNotFoundException, URISyntaxException 도 똑같이 import 해주는 설정 적용하면 에러 없어진다.

PS 2
이렇게해서 적용하고 cordova build 또는 capacitor 에서 npx cap sync 해주면
파일이 다시 초기 파일로 변경된다. 다시 수정해서 변경해도 되고, 파일을 복사해오는 원폰 폴더의 파일들을 변경해놓으면 복사해도 변경되지 않으니 계속 사용할 수 있다.
그런데 원본을 수정할때 추가된 import 도 확인해서 추가해 줘야 한다.

import android.content.ActivityNotFoundException;
import java.net.URISyntaxException;

cordova 또는 capacitor 에서 설정하는 원본 파일의 위치는
/node_module/cordova-plugin-inappbrowser/src/android/inAppBrowser.java

앱 호출시 앱 설치유무 판단하여 미설치시 마켓설치 페이지로 요청을 변경하는 내용이다.
자바가 익숙하지 않아서 메모해 둔다.
검색해도 바로 안나오는게, 아마 너무 쉬운 설정이라 그런 것 같다.

그래도 나같이 가끔 자바 다루는 사람에게는 바로 바로 설정하기 힘드니
이렇게 적어둔다.

profile
프롭테크 프로그래머

0개의 댓글