iamport / iamport_flutter

Flutter App에서 아임포트 결제서비스 연동을 위한 모듈입니다.
MIT License
68 stars 37 forks source link

플레이스토어 QUERY_ALL_PACKAGES 권한 정책 변경 대응 #23

Closed jeiea closed 3 years ago

jeiea commented 3 years ago

Upcoming new policy The Package Visibility policy introduces an approval process for the new QUERY_ALL_PACKAGES permission which controls access to the inventory of installed apps on a device. We'll send you 60-day advance notice before you need to comply with changes.

안드로이드 API 30+을 타겟팅한 앱을 해당 버전 기기에서 구동했을 때 저 QUERY_ALL_PACKAGES 권한을 포함시켜주지 않으면 농협 카드 결제가 오동작하는 걸 확인한 적이 있습니다. 그런데 플레이스토어 정책변경으로 저 권한을 앞으로 넣으려면 따로 절차가 필요해지는 것 같습니다. 여기처럼 아임포트 패키지에서 의존하는 앱을 명시하면 문제가 없을 것 같습니다. 8월 이후로는 30+앱만 업데이트가 가능하다는 것 같아 타겟 버전을 내리는 건 괜찮은 선택지가 안 될 듯 합니다.

SoleeChoi commented 3 years ago

안녕하세요 아임포트 기술지원팀입니다.

iamport_flutter 패키지는 내부적으로 url_launcher 패키지를 사용하고 있으며 디바이스에 특정 앱이 설치되어있는지 여부를 해당 패키지의 canLaunch 함수를 통해 판단하고 있습니다.

canLaunch 함수는 말씀하신 조치를 취하지 않으면 Android 30+부터 무조건 false를 리턴하도록 구현되어 있는 것으로 확인됩니다. 내부적으로 QUERY_ALL_PACKAGES 권한을 필요로하는 네이티브 로직을 사용하고 있기 때문입니다.

해서 말씀하신 조치를 취하는 것도 하나의 방법일 수 있으나 생각보다 고려해야할 것이 많은 것으로 확인되어 우선적으로 url_launcher의 canLaunch 함수를 걷어내고 네이티브 코드로 대체하는 방법을 생각하고 있습니다. 최대한 빨리 작업 후 테스트를 거쳐 배포하고 안내드리도록 하겠습니다.

감사합니다.

SoleeChoi commented 3 years ago

안녕하세요 아임포트 기술지원팀입니다.

앞서 안내드린바와 같이 조치를 취한 후 패키지를 v0.9.14로 업데이트 하였습니다. 패키지 업그레이드 후 다시 시도해보시길 바랍니다.

감사합니다.

jeiea commented 3 years ago

해당 버전으로 카카오페이 결제 시도한 결과 아래 에러가 발생했습니다.

I/flutter ( 6150):    INFO [I]  Navigate to /payment/proceed
I/flutter ( 6150): data: Instance of 'PaymentData'
I/WebViewFactory( 6150): Loading com.google.android.webview version 90.0.4430.82 (code 443008234)
W/example.app( 6150): Accessing hidden method Landroid/os/Trace;->isTagEnabled(J)Z (greylist, reflection, allowed)
W/example.app( 6150): Accessing hidden method Landroid/os/Trace;->traceBegin(JLjava/lang/String;)V (greylist, reflection, allowed)
W/example.app( 6150): Accessing hidden method Landroid/os/Trace;->traceEnd(J)V (greylist, reflection, allowed)
W/example.app( 6150): Accessing hidden method Landroid/os/Trace;->asyncTraceBegin(JLjava/lang/String;I)V (greylist, reflection, allowed)
W/example.app( 6150): Accessing hidden method Landroid/os/Trace;->asyncTraceEnd(JLjava/lang/String;I)V (greylist, reflection, allowed)
I/cr_LibraryLoader( 6150): Loaded native library version number "90.0.4430.82"
I/cr_CachingUmaRecorder( 6150): Flushed 4 samples from 4 histograms.
W/example.app( 6150): Accessing hidden method Landroid/media/AudioManager;->getOutputLatency(I)I (greylist, reflection, allowed)
W/cr_media( 6150): Requires BLUETOOTH permission
I/chromium( 6150): [INFO:CONSOLE(1)] "Uncaught ReferenceError: IMP is not defined", source: https://mockup-pg-web.kakao.com/v1/4b935311c79d17c55503fb11800cba137f406e8b7f434479041058848a78055b/mInfo? (1)
I/ViewRootImpl@b8b0f22[MainActivity]( 6150): ViewPostIme pointer 0
I/ViewRootImpl@b8b0f22[MainActivity]( 6150): ViewPostIme pointer 1
D/InputMethodManager( 6150): prepareNavigationBarInfo() DecorView@40a9d58[MainActivity]
D/InputMethodManager( 6150): getNavigationBarColor() -1
V/InputMethodManager( 6150): Starting input: tba=example.app ic=null mNaviBarColor -1 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
D/InputMethodManager( 6150): startInputInner - Id : 0
I/InputMethodManager( 6150): startInputInner - mService.startInputOrWindowGainedFocus
D/InputTransport( 6150): Input channel constructed: 'ClientS', fd=203
D/InputTransport( 6150): Input channel destroyed: 'ClientS', fd=117
D/InputMethodManager( 6150): HSIFW - flag : 0
D/InputMethodManager( 6150): HSIFW - flag : 0
E/MethodChannel#iamport_flutter( 6150): Failed to handle method call
E/MethodChannel#iamport_flutter( 6150): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Activity.startActivity(android.content.Intent)' on a null object reference
E/MethodChannel#iamport_flutter( 6150):     at kr.iamport.iamport_flutter.IamportFlutterPlugin.startNewActivity(IamportFlutterPlugin.java:93)
E/MethodChannel#iamport_flutter( 6150):     at kr.iamport.iamport_flutter.IamportFlutterPlugin.onMethodCall(IamportFlutterPlugin.java:63)
E/MethodChannel#iamport_flutter( 6150):     at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#iamport_flutter( 6150):     at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#iamport_flutter( 6150):     at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/MethodChannel#iamport_flutter( 6150):     at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#iamport_flutter( 6150):     at android.os.MessageQueue.next(MessageQueue.java:335)
E/MethodChannel#iamport_flutter( 6150):     at android.os.Looper.loop(Looper.java:206)
E/MethodChannel#iamport_flutter( 6150):     at android.app.ActivityThread.main(ActivityThread.java:8462)
E/MethodChannel#iamport_flutter( 6150):     at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#iamport_flutter( 6150):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596)
E/MethodChannel#iamport_flutter( 6150):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
SoleeChoi commented 3 years ago

안녕하세요 아임포트 기술지원팀입니다.

음 일단 저희 example 앱에서 테스트 해봤을때는 재현이 되지 않아서 몇가지 더 질문 드립니다.

첨부주신 에러 로그로 봐서는, 첫 화면에서 카카오페이 결제를 위해 "다음" 버튼을 클릭하라고 나오실텐데 이 "다음" 버튼을 클릭해 카카오톡(카카오페이) 앱으로 이동할때 발생하는 에러로 추정됩니다만

  1. 혹시 정확히 어떤 단계에서 에러가 발생하시는 걸까요? (동영상 첨부 주시면 가장 좋습니다)
  2. 테스트하고 계신 기기에 카카오톡 앱이 설치는 되어 있으신가요?
  3. 간헐적으로 나타나는 이슈이신가요 아니면 한 번도 된 적이 없으신가요?
  4. 카카오페이 테스트 모드이신가요 운영 모드이신가요? (가맹점 식별코드 - 아임포트 관리자페이지 > 시스템설정 > 내정보에서 확인 가능 전달 주시면 좋습니다)

감사합니다.

jeiea commented 3 years ago
  1. https://linksharing.samsungcloud.com/contents/view?contentsToken=1619574396867L6bA17d&currentIndex=1&linkUrlVersion=V1 다음 버튼 터치 후 카카오톡 앱이 열리지 않습니다.
  2. 재현 가능합니다. 그냥 재현될 줄 알고 제가 정보를 불충분하게 드린 것 같네요. https://github.com/jeiea/flutter_example/tree/iamport 이 저장소에 올려주신 예제 코드를 복사해서 재현되었습니다(iamport 브랜치를 사용해주세요). 올려주신 프로젝트는 그대로 실행하니
    
    ➜  example git:(master) ✗ flutter pub get
    Running "flutter pub get" in example...                            558ms
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Warning
    ──────────────────────────────────────────────────────────────────────────────
    Your Flutter application is created using an older version of the Android
    embedding. It's being deprecated in favor of Android embedding v2. Follow the
    steps at

https://flutter.dev/go/android-project-migration

to migrate your project. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


위 경고가 발생했습니다. 아마 이게 단서가 되지 않을까 싶습니다. 실행 환경은 flutter 2.0.5, Android API 30, 갤럭시 S21입니다.
4. 테스트 모드입니다.
SoleeChoi commented 3 years ago

안녕하세요 아임포트 기술지원팀입니다.

아, 현재 고객님의 flutter앱이 V2이군요. 현재 저희 iamport_flutter앱이 아직 V2를 지원하고 있지 않아 발생하는 문제로 생각됩니다 ㅠㅠ 다른 고객님들도 많이 요청을 주셔서 V2 지원을 위해 iamport_flutter앱 마이그레이션 작업을 진행하고 있는데, 메인 버전을 올리는 만큼 확인해야할 사항이 많아 다소 지연되고 있습니다.

V2 마이그레이션이 끝나면 별도 안내드리도록 하겠습니다. 혹시 배포 일정이 어떻게 되실까요? 최대한 그전에 완성되도록 맞춰보려고 합니다.

감사합니다.

jeiea commented 3 years ago

V2 지원이 안 되는 줄은 몰랐네요. 카카오페이랑 농협 앱카드만 테스트해보고 잘 되는 줄 알았거든요. 이전 버전에선 문제가 안 보여서요. 배포는 비정기적입니다.

readme에 안 적혀있는 것 같아 여쭈는데 현재 V2를 사용하고 있으면 예상 문제점이 있을까요?

SoleeChoi commented 3 years ago

안녕하세요 아임포트 기술지원팀입니다.

안내가 되어있지 않아 이용에 혼란을 드린 것 같습니다. 죄송합니다.

v0.9.14로 패키지 업그레이드시 외부 앱으로 이동하는 로직을 dart 단에서 native 단으로 옮겼기 때문에 영향이 있는 것 같습니다. 다만 해당 코드가 V1에서는 잘 동작하고 V2에서는 이슈가 있는 것으로 추정되는데, 이거는 저희가 저희 패키지와 내장하고 있는 example 앱을 V2로 마이그레이션을 해봐야 정확히 알 것 같습니다.

flutter는 V2를 런칭하면서 많은 기능이 추가되었는데 대개 새로운 기능들이나 안정화된 기능들 뿐이고 문제가 될 수 있는 것은 dart단의 null safety가 유일한 것 같긴 합니다. 따라서 현재 flutter V2 앱에서 어떤 패키지든 V1을 사용하는 것은 안정성을 보장할 수 없어보입니다.

감사합니다.