안녕하세요. 아임포트 기술지원팀입니다.
Android 11 (SDK 30) 부터 패키지 가시성 정책이 변경되어
기존 사용하시던 로직에서 문제가 발생할 수 있습니다.
2021년 11월부터 구글 플레이 스토어에 새로 등록하거나,
업데이트 되는 앱 모두 targetSdkVersion 30 이상의 반영이 강제되기 때문에
본 가이드를 보시고 조치를 취하시기 바랍니다.
이슈
앱 targetSdkVersion 30 에서 패키지 가시성을 요구하는 함수(queryIntentActivities(), getInstalledApplications(), getInstalledApplications(), resolveActivity() 등) 호출시,
패키지 가시성이 확보 되지 않았다면 null 로 return 되어 정상적인 비즈니스 로직을 수행할 수 없음.
조치방안
•
Android 에서 아임포트 제공 앱 플러그인(SDK) 사용 가맹점
iamport-android, iamport-flutter, iamport-react-native 등
◦
SDK 내에서 패키지 가시성을 요구하지 않기 때문에 별도의 조치사항이 없습니다.
•
Android 에서 아임포트 javascript SDK 을 직접 연동하는 가맹점
아래 두가지 방안에서 선택하여 처리하시기 바랍니다.
◦
WebViewClient shouldOverrideUrlLoading() 에서 예외처리 로직 추가 방안
별도의 앱패키지 리스트 관리가 필요치 않기에 해당 방식을 권장합니다
▪
결제앱 설치여부 확인 등을 위해 패키지 정보를 조회하는 경우 해당 로직을 제거합니다.
•
queryIntentActivities(), getInstalledApplications(), getInstalledApplications(), resolveActivity() 등의 함수
▪
결제앱 설치 여부의 확인은 startActivity() 호출시 ActivityNotFoundException 발생을 catch 하여 앱 미설치 상황이라 간주하고, 앱마켓 이동 등 앱 미설치시 로직을 처리합니다.
예시코드
// 예시코드이며 가맹점 구현에 따라 다를 수 있습니다.
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
request?.url?.let {
if (it.scheme == "about") {
return true // 이동하지 않음
}
val urlStr = it.toString()
if (!URLUtil.isNetworkUrl(urlStr) && !URLUtil.isJavaScriptUrl(urlStr)) {
openPaymentApp(urlStr) // 앱이동
return true
}
//..기타로직 중략.. (m_redirect_url 결과 체크 등)
}
return super.shouldOverrideUrlLoading(view, request)
}
fun openPaymentApp(url: String) {
Intent.parseUri(url, Intent.URI_INTENT_SCHEME)?.let { intent: Intent ->
runCatching {
startActivity(intent) // 앱 이동
}.recoverCatching {
// 앱이동에 실패(미설치)시 앱스토어로 이동
val packageName = intent.getPackage()
if (!packageName.isNullOrBlank()) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")))
}
}
}
}
Kotlin
복사
◦
AndroidManifest.xml 수정을 통한 패키지 가시성 확보 방안
사용하는 PG 에 따라 다를 수 있으며, 새로운 결제수단의 추가시 매번 추가하여 새로 배포되어야 합니다.
아래 패키지 등록시 패키지 가시성이 확보되어 패키지 가시성을 요구하는 함수에서 정상적인 응답을 받을 수 있습니다.
<queries>
<!--간편결제-->
<package android:name="finance.chai.app" /> <!--차이페이-->
<package android:name="com.nhnent.payapp" /> <!--페이코-->
<package android:name="com.lottemembers.android" /> <!--LPAY-->
<package android:name="com.ssg.serviceapp.android.egiftcertificate" /> <!--SSGPAY-->
<package android:name="com.inicis.kpay" /> <!--KPAY-->
<package android:name="com.tmoney.tmpay" /> <!--티머니페이-->
<package android:name="viva.republica.toss" /> <!--토스페이-->
<package android:name="com.samsung.android.spay" /> <!--삼성페이-->
<package android:name="com.kakao.talk" /> <!--카카오페이-->
<package android:name="com.nhn.android.search" /> <!--네이버-->
<package android:name="com.mysmilepay.app" /> <!--스마일페이-->
<!--카드-->
<package android:name="kvp.jjy.MispAndroid320" /> <!--ISP페이북-->
<package android:name="com.kbcard.cxh.appcard" /> <!--KBPay-->
<package android:name="com.kbstar.liivbank" /> <!--리브-->
<package android:name="com.kbstar.reboot" /> <!--리브-->
<package android:name="com.samsung.android.spaylite" /> <!--삼성페이-->
<package android:name="com.nhnent.payapp" /> <!--페이코-->
<package android:name="com.lge.lgpay" /> <!--엘지페이-->
<package android:name="com.hanaskcard.paycla" /> <!--하나-->
<package android:name="kr.co.hanamembers.hmscustomer" /> <!--하나멤버스-->
<package android:name="com.hanaskcard.rocomo.potal" /> <!--하나공인인증-->
<package android:name="com.citibank.cardapp" /> <!--씨티-->
<package android:name="kr.co.citibank.citimobile" /> <!--씨티모바일-->
<package android:name="com.lcacApp" /> <!--롯데-->
<package android:name="kr.co.samsungcard.mpocket" /><!--삼성-->
<package android:name="com.shcard.smartpay" /> <!--신한-->
<package android:name="com.shinhancard.smartshinhan" /> <!--신한(ARS/일반/smart)-->
<package android:name="com.hyundaicard.appcard" /> <!--현대-->
<package android:name="nh.smart.nhallonepay" /> <!--농협-->
<package android:name="kr.co.citibank.citimobile" /> <!--씨티-->
<package android:name="com.wooricard.smartapp" /> <!--우리WON카드-->
<package android:name="com.wooribank.smart.npib" /> <!--우리WON뱅킹-->
<!--백신-->
<package android:name="com.TouchEn.mVaccine.webs" /> <!--TouchEn-->
<package android:name="com.ahnlab.v3mobileplus" /> <!--V3-->
<package android:name="kr.co.shiftworks.vguardweb" /> <!--vguard-->
<!--신용카드 공인인증-->
<package android:name="com.hanaskcard.rocomo.potal" /> <!--하나-->
<package android:name="com.lumensoft.touchenappfree" /> <!--현대-->
<!--계좌이체-->
<package android:name="com.kftc.bankpay.android" /> <!--뱅크페이-->
<package android:name="kr.co.kfcc.mobilebank" /> <!--MG 새마을금고-->
<package android:name="com.kbstar.liivbank" /> <!--뱅크페이-->
<package android:name="com.nh.cashcardapp" /> <!--뱅크페이-->
<package android:name="com.knb.psb" /> <!--BNK경남은행-->
<package android:name="com.lguplus.paynow" /> <!--페이나우-->
<package android:name="com.kbankwith.smartbank" /> <!--케이뱅크-->
<!--해외결제-->
<package android:name="com.eg.android.AlipayGphone" /> <!--페이나우-->
<!--기타-->
<package android:name="com.sktelecom.tauth" /> <!--PASS-->
<package android:name="com.lguplus.smartotp" /> <!--PASS-->
<package android:name="com.kt.ktauth" /> <!--PASS-->
<package android:name="kr.danal.app.damoum" /> <!--다날 다모음-->
</queries>
XML
복사
주의사항
targetSdkVersion 30 이상 구글 플레이 스토어 배포 전
반드시 앱카드 또는 간편결제 App 이동이 이루어지는지 결제 테스트를 해보시기 바라며,
특이사항 발생시 아임포트 기술지원으로 문의 주시기 바랍니다.
아임포트기술지원
support@iamport.kr
참고