https://github.com/britannio/in_app_review

 

GitHub - britannio/in_app_review: A Flutter plugin for showing the In-App Review/System Rating pop up on Android, IOS, and MacOS

A Flutter plugin for showing the In-App Review/System Rating pop up on Android, IOS, and MacOS. It makes it easy for users to rate your app. - britannio/in_app_review

github.com

 

사용법

in app review 패키지를 활용해서 앱 내에서 팝업창을 띄워 리뷰를 요청하는 로직을 짰다.

패키지 설명대로 간단하게 requestReview()만 요청하면 된다. 

import 'package:in_app_review/in_app_review.dart';

final InAppReview inAppReview = InAppReview.instance;

if (await inAppReview.isAvailable()) {
    inAppReview.requestReview();
}



문제

패키지 가이드라인에 해당 링크들을 참고하라고 되어있는데

대충 팝업창을 너무 자주 요청하지 말라는 게 핵심 

많이 요청해 봤자 안드로이드와 ios 둘 다 내부 조건에 따라 일정 횟수 이상 요청을 하면 아무것도 안 띄운다. 

 

근데 팝업이 뜨지 않는 정확한 조건은 없다. 

대략 뭐 어느정도~ 얘기해 주는 건 있는데 정확하지가 않아서 그냥 알아서 이쯤이면 되겠지 하고 짜야 된다.😑

여튼 이런 이유로 requestReview()를 했을 때 아무런 동작도 하지 않는 경우가 생길 수 있다.
(inAppReview.isAvailable()가 true여서 요청을 보넀을때도 무반응이 일어날 수 있다는 말)

그래서 in app review를 활용하려면 사용자가 버그처럼 느끼지 않도록 주의해야 한다.

 

그 와중에 안드로이드에서 요청했을 때 반응이 없다는 이슈가 있어서 참고했는데

https://github.com/britannio/in_app_review/issues/127

 

`requestReview` does nothing on Android · Issue #127 · britannio/in_app_review

requestReview does nothing on Android. Here are the logs: I/InAppReviewPlugin(22895): cacheReviewInfo: Requesting review flow I/PlayCore(22895): UID: [10195] PID: [22895] ReviewService : Initiate b...

github.com

여기서 다른 사람들이 제안한 방법들을 봐도 뭐 딱히 명쾌한 해결 방법이 없어 보인다.


요청을 했을 때 사용자한테 팝업이 떴는지 안 떴는지도 정확히 알 수가 없으니

팝업이 안 떴을 때 무언가를 실행시키는 로직을 짜기가 어렵다.

다들 가정해서 로직을 짜고 있는 거다. 

 

해결 방법

여튼 그래서 이걸 어떻게 해결했는가?하면

그냥 가이드라인에 맞춰
기획한 트리거의 조건에 달하면 앱 내에서 다이얼로그를 한 번 띄우고

다이얼로그의 버튼을 누르는 추가적인 동작을 했을 때 팝업 요청을 하되, 

팝업이 뜨지 않아도 이상하지 않도록 UI/UX를 구성하고 문구로 커버를 하는 거다.. 🙄

요청을 했을 때 팝업이 뜨지 않는 경우를 완벽하게 잡아낼 방법이 없으니
이렇게라도 해서 사용자가 느끼기에 아무 이상 없도록 구현하는 거다. 

이렇게 하면 요청이 제대로 갔는데 팝업이 뜨지 않아도 버그처럼 느껴지진 않는다.

 

 

스토어로 이동시키기

inAppReview 패키지에서 또 제공하는 기능이 있는데,

앱에서 스토어 리뷰 쓰는 페이지로 바로 이동시키는 거다. 

사용자가 느끼기에 팝업보단 간단하지 않겠지만

그래도 확실하게 스토어 이동을 시킬 수 있으니 활용하면 좋다. 

 

  final InAppReview inAppReview = InAppReview.instance;

                  if (Platform.isIOS) {
                    await inAppReview.openStoreListing(appStoreId: IOS_APP_ID);
                  } else {
                    await inAppReview.openStoreListing();
                  }

 

이것도 로직은 간단하다. 

다만 주의할 점은 app store는 id가 필요하다. 

id는 앱스토어 connect 일반정보>앱정보 들어가면 Apple ID라고 나와있다.

id 정보를 자동으로 받아오면 좋겠어서 알아봤는데 하드코딩 해야 된다고 하길래 

그냥 const 선언해 놓고 쓴다. (그래서 패키지에서도 ios만 id를 입력하라고 했나..)

 

그리고 너무나 당연하게도 앱이 모두 스토어에 배포가 되어있어야 한다.

현재 앱을 dev / prod 두 가지 나누어서 관리하는데

ios는 prod 버전의 앱 id를 넣어놔서 dev 앱으로 실행해도 배포된 앱으로 이동이 가능한데 안드로이드는 안된다.

안드로이드는 앱 정보를 기입하지 않고 이동하는걸 보아 실행 중인 앱 정보를 받아와서 이동시키는 것 같다. 
그래서 dev 버전 앱은 스토어에 등록이 안되어있으니 스토어로 이동해도 페이지가 없다.

방법으론 그냥 prod 버전으로 빌드해서 확인했는데 (목적은 사용자가 사용하는 버전에서 잘 되는 거니까)

이런 방법이 싫다면 그냥 아래와 같이 url_launcher 활용해서 스토어 주소를 넣어놓고 이동시켜도 된다.

launchUrl(Uri.parse(Platform.isAndroid
        ? 'https://play.google.com/store/apps/details?id=$androidPackageName'
        : 'https://apps.apple.com/us/app/click-social/id$appStoreId'));

-git issue 인용

 

 

나는 공통 코드 + 브랜치 별로 나누어서 여러 개의 앱을 운영하고 있는 형태를 가지고 있어서

저렇게 하면 패키지네임까지 모두 따로 지정을 해주어야 하고 이 또한 하드코딩이 되는 부분이 있어서 사용하지 않았는데

인앱리뷰 팝업을 띄울 거 아니면 inAppReview 패키지 안 쓰고 저렇게만 사용해도 괜찮을 것 같다. 

 

 

복사했습니다!