Cs

34. Cordova Android inappbrowser intent issue!

ITSEONG 2022. 9. 3. 14:33

cordova로 android 앱을 구현 시 푸시 알림을 받으면 inappbrowser로 열리게 된다. 

 

inappbrowser에서 intent를 이용하여 app이 설치되어있으면 앱으로 이동하게 된다.

 

하지만 intent://를 읽지 못해 error가 발생하게 된다.

 

cordova 의 inappbrowser.java intent 기존 부분

} 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 (android.content.ActivityNotFoundException | URISyntaxException e) {
        LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString());
    }
}

이 코드는 앱이 설치되어있는지 패키지로 찾으며 설치되어있는 경우 앱을 아닌 경우는 마켓을 열도록 설정이 되어있다.

 

그리고 만약 앱이 설치되었는데도 마켓으로 이동을 한다면 

 

AndroidManifest.xml에 queries를 추가해주어야 한다.

android 11부터 패키 지명을 숨길수 있어 이용하기 위해서는 

<queries>
	<package android:name="com.example.store" />
</queries>

자세한 사항은 아래를 참고 바란다.

https://developer.android.com/about/versions/11/privacy/package-visibility?hl=ko

 

 

에러 발생 시 )

 

Intent.parseUri 이 부분이 오류가 발생하면 catch 부분에 URISyntaxException을 추가한다.

 

이렇게 해도 cordova build를 하게 되면 수정한 부분이 원래대로 변하게 된다.

그럴 땐 build를 할 때마다 수정을 해주거나

원본을 위 코드로 수정한다.

원본 코드의 위치는 /node_module/cordova-plugin-inappbrowser/src/android/inAppBrowser.java

에 있다.

 

 

https://velog.io/@firsthouse/inappbrowser-%EC%84%A4%EC%B9%98-%EC%95%88%EB%90%9C-%EC%95%B1-intent-%ED%98%B8%EC%B6%9C%EC%8B%9C-%EC%97%90%EB%9F%AC

 

 

 

 

 

반응형