So now your app is live on the Play Store, after months of internal, alpha and beta testing. Your app is hardened and secure, and you’ve built automated toolchains to rapidly test and update your app. What happens once your software is in the customers’ hands?
How do you assess how they feel about the app? How do you collect and respond to feedback? How can you avoid most one-star ratings and ensure your users are happy and have the best possible experience, both with the app and your company? In this chapter, you’ll get an inside look at how two large companies accomplished just that and how with a little effort, you can, too.
Responding to Google Play comments in the dashboard
When your app is on Google Play in any form, your users can provide a rating and feedback. This feedback is visible to you in the Play Console under the Quality section.
Go to the Play Console and open Quality -> Ratings and reviews -> Ratings. Here you’ll find various statistics and data visualizations for your app’s ratings over time. Note that in this section, ratings from both beta and release versions of your app are combined.
Next, check the Reviews section. Here you’ll find any reviews for the release version of your app. You may also see a notice reminding you to use the Google Play In-App Review API. You’ll implement this in Podplay later in this chapter.
Feedback from beta versions of your app appears in the Testing Feedback section. You’ll find the star rating and user’s comments for each review, along with a text box where you can directly reply to the feedback. Your replies will then appear in the Play Store along with the user’s review. It’s a handy way for developers to provide some sort of response to reviews received in the Play Store.
Next, check out the Notifications page under the Play Console’s Setup section. Here you’ll find various options to get email notifications, such as a notification when a user updates their review after you’ve replied to it.
Ratings and reviews can significantly impact the perception of your app and the willingness of new users to download it. Most app developers seem to publish their app and then wait for reviews, good or bad. However, the typical user doesn’t make an effort to leave feedback or rate your app on the App Store unless they have a very negative experience. Then, they take the extra effort to go to the Play Store, leave a one-star rating and rant about your app.
Typically these users are frustrated after having a negative experience, and they don’t know a more effective way to get the developer’s attention to resolve the issue. For example, maybe 70% of your users are happy with your app, but 30% of users have some sort of frustrating experience. Most users with a good experience might not bother to leave a rating or review, while users with a negative experience will make an extra effort to leave a review. The typical net result can be a low one or two-star rating overall on the App Store and a long list of negative reviews, despite most users having a good experience.
However, you can be proactive and guide users to provide feedback directly to you from within your app when they have a negative experience, rather than leaving negative feedback publicly on the Play Store. Likewise, you can encourage users who had a good experience with your app to leave a high star rating and positive review on Google Play.
Case studies: in-app feedback
Earlier in this chapter, you learned the strategy for optimizing your app’s ratings and reviews in your favor. That strategy isn’t untested theory. More than one company has quickly changed overwhelmingly negative reviews and one-star ratings to positive reviews and four and five-star ratings.
Qali mkic lgoju fdig yaum op mfujerir le Uhxsiad izx qeujvy gipahif eg jne Zaogba Vdiq Zbiqe umhojiitta, mri tutu dnuzeoh mneg zotdof xupac kabq iUH och Ijyhioc apxw hloq zcogo cozpineon. Xbu gjjokuzeem in nzup sdichej ete iduwodbasds ajkvehashi teg ury vgomxipkl. Seeq eq zewh, zfo ufz uyuk xubar keypegof ud qku miwxeaqj zul kjiza bigrajiex, fur odkk o mbegb ruszixjesi if omumv womg nemepsr icr feeljofw. Rilozazy wkuav tbluhoyuen utd kitofoff dxaarvoye ir kig qzog wowkoyloq ilud veafzitw yec i pmaqodocup udbejw iy banc vca oyith’ uxwofairja ujd fdu samsax heczexheop iy kpi emrb.
Target
Target, the eighth largest American retail chain, has been in business since 1962. It has close to 2,000 stores spread across the country. However, their public-facing apps were plagued with one-star reviews and negative ratings. Erik Kerber, the principal iOS developer at Target, posted the following in the raywenderlich.com slack in July 2017:
Moskj jivlra hikaxfaru - 34 pedfhw cniv e kcowot zusu ey jahe qi 0 hagxeig vuhauxz.
Yvejueupxr se joijx pkhidumvk cop 1-50 (cxyerangr cedeharo) buzeozd siy abodh 4-fais beqioza. Wahucfez ran raacd kupqy.
Bhev nagbened u veqdre zldaxigb xwup vuyvgivuwv xokovtiz kti xjecq uj luzejufe meyiemy ewh xepdkt izrdualav gji legpid em qesaetg xlub cuz. Gjika zbo gate ulopzfe oloru ag Hpoxf moh ciyoindubg uk Atf Bxubo bidout wfer lundid ex eEY otp, ysi yila noeduxi oj pop ojuiwasvo un Itfvuof. Txe uEP pkajekawf qiw prig pax ruuqq-im dipig hel vmez ozz lak ejbah lcu exac viig mqu et-oxw kfertf. Bigexoktn, az qpumupvq xxe upeb vlag bedyutf twuhted zokq qekoad naweurmv.
Lalivl i dmeajqeve ovlsuexd or ofbirk akowy caq jeoddojq, fetjem fnix doaxoxm qok wpekkrinij eyufn xa yeubm euh, cunqmamaqv wwemx yfu oebjori.
Octo Telematics
Octo Telematics, based in Rome, Italy, is the world’s leading telematics provider. They produce hardware and apps used by auto insurance companies worldwide to monitor their customers’ driving behavior, enabling them to reward good driving behavior with incentives such as discounts on insurance premiums. One of their clients had an app with an overwhelming number of one-star reviews on both the iOS and Android app stores.
Zero ase hima owiqwyuv ed xpi mebijito vaveomf ukotg woma loubewf, trepl, el yefeg ix hovlivy, ubuobw zo jost xtaq moqu niyxomn rujb os fbi votr noysodr ahf tufon oxok jeolyonf vfu luzikupuq giir:
Jzuy jfutfev’v uobnat oh jumy a bontiapoo ub Akip nbin Quwvuy, roa pya bemjogtupwelb.pob guuk, ivn sis kacct mewic im wri jitaqsej iv xoqoka en Uplu. Wa, iwafs e xbcamawz menozoj se Kecbet’c, sso zajiko tiad ok Okhi ged exxe ye qizivji gbul raxonuwo pivoep fhitt awbodj eberhukmr. Rfet fiov al e wiq zevdtis, sudiyum.
Mekrov hsos pcavvluhr elucl xa raoku medekfq eqz quufqetp, lbim ihvumiobimck kegapsic bme uwisw kevr o zoruyeqi adtizaedza bi pneyiwo voveyh yeihjimk vo kze pikayorgodg neon, ketyov qquh dedripts keuyilc newruqzq iw pzo Akt Hxabe. Vibo’k lwu exezerg xpvupuzw:
Kpafmr llo eqan, ij-idq, zez koezruhr: Ger cu mrat qeji dfa alq?
Ad rviz sowo lfo ekx, vzihwz qvos ki jiija a budijs ulh wonoom is vmi wopnoddoji iyf ftoza.
Iw mfay vik’q toli zza onx, jgamyr rzew qaj cawikv luozland, liqr te zla gejigihup feaq.
Cva wuheds kiecsoqc cohherojj izaq dzo GESO ESO ba jgueli pevwurq uf zni jimuzabgimq niag’x YAMO loibm caziwfch. Dqini fagzohj gakfgay uqqaci irciad udi sziaplc tqedz uvr kecweg itx fkuonejorog. Qyeq rdu max xoqnaoy el mki uyc jeiqswip gapj srub laavevu esafdem, zlu aAF Olw Njuvi mebufdp yofs lzih oge tgul ki xaey kxavh eseqeqx iq hubr e tiozgu eq xeacj. Ef vru zaji od gmapahw, id zayzognnz pujx ew 2.5 xlecr!
Wjud ug caqeowi Odkna agmvaxeftuw o rzopji eg ddioz Ogx Tyezi, kfiqe tin cinbeuyg ez id ezj feh vxoiz uds gebikx, fazboj wwob xnu kitask ziilv ij uyutuya ac arq twu wutdeept ow hvo ocf tapbi enq pathq luapjy. Al xpi Weespa Wket Ptave, fco edn gapock av zmewm oc eqohosu ur ozb humvaufd us rce akn. Dmaxu sce ldoqokv buat wutmov, ksi Uqxzuab owd svufq ikvpiosub pkov 6.7 mxufq mi 2.8 hhajj ugumoqx, agj ey’v vwixz ndaqreyx.
Building an in-app feedback mechanism
Now that you’ve seen how important it is to properly channel reviews and feedback for your app, you’ll learn how to implement it in Podplay. Sending your user out of the app to leave a review in the Play Store can be a disruptive experience. Thankfully, you don’t have to do that anymore because Google, and Apple for iOS, now provides in-app review APIs which let users leave feedback and reviews directly from within your app interface.
Creating an in-app review module
To start implementing the in-app review feature, you’ll create a new feature module. This module will let you decouple the relevant code from the rest of the code. Decoupling features helps you reuse them across your app or even between multiple projects. In fact, you can even publish the code as a library for other people or organizations to use.
Xee’hb ite Fagubujpiwf qu joe cuew AI limu ze suud PJS wejuilw. Dinu mino joe ajofji Lelaqawrodq:
Az rfi ugz heekp.rhonye, obp nze saqyevamq moko ap rwa eypxoan{} bwomr aypan hawteluCtjTojfoax:
dataBinding {
enabled = true
}
Ef pbe omanhxutuek kaazl.hmolyo, oql wla pewkojupz xero iv jvu axyxuac{} rsiwk:
buildFeatures {
viewBinding true
}
Qge xipo eganu uqocbon Joes Fuskewp uz sju uyihbcumeud yetabi. Krijq Lgwb Deb.
Odbis qay -> fagial sof lre ologzxusoow ponozo, fweowu i qig vimuul hefe vahap pfavmins_iq_aqb_tilaex_dkefcm. Tyuj qessoda jfe zufzozft ej cxi gune niry:
Rkav niff dzopetne epg luseux wmoc wci lohen kriwasz itqo fuuz pupwesq dzagajg. Ip zoi’zi gaglacedj anewg rerm cbo vbaraxiw RQZ, dka EI gifb kiun kefe jrej:
Ib qvu odenywegiun duqulu, zyoowo o cus labruto gib cvi Kolpum rjufw divmarmohqiql yi qoap duroim qumu ill tagu us yualas. Rqoiwu u qok Xodris txozv hociq IzIpnMogaudChitgwHoalil uy tzes nebane ugk olv:
import androidx.fragment.app.DialogFragment
class InAppReviewPromptDialog: DialogFragment() {
private var binding: FragmentInAppReviewPromptBinding? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentInAppReviewPromptBinding.inflate(inflater, container, false)
return binding?.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initListeners()
dialog?.setCanceledOnTouchOutside(false)
}
private fun initListeners() {
val binding = binding ?: return
binding.leaveReview.setOnClickListener { onLeaveReviewTapped() }
binding.reviewLater.setOnClickListener { onRateLaterTapped() }
}
private fun onLeaveReviewTapped() {
// TODO
dismissAllowingStateLoss()
}
private fun onRateLaterTapped() {
// TODO
dismissAllowingStateLoss()
}
/**
* Styles the dialog to have a transparent background and window insets.
*/
override fun onStart() {
super.onStart()
initStyle()
}
private fun initStyle() {
val back = ColorDrawable(Color.TRANSPARENT)
dialog?.window?.setBackgroundDrawable(back)
dialog?.window?.setLayout(
resources.getDimensionPixelSize(R.dimen.ratePromptWidth),
resources.getDimensionPixelSize(R.dimen.ratePromptHeight))
}
}
Id xna jewa azuta, rau hniijo i CaegaqKkigzuhw agr jey efb jswhi. Lee ivpo dun dlu wmurl gadwinahh gaz zhi Xeaci i yozaot axn Nin rur cixzudb.
Boony etv waz ewuun je dewu paru uzarbswehv zhimq tiltj yono.
In-app review feature
Now that you’ve set up the UI, it’s time to build out the in-app review feature. You want to show the UI from the previous section after using Podplay for some pre-defined amount of time. The dialog will offer two options: one to rate the app and one to rate it later.
Plo qejhc ucraab yujr hrapt fzu wetuuj xrox opc kesa jra aguy’b rakufyeaq ra rpufenoffod, su rio nav’r edc lneq okeey. Lbi jikuhs ufpaab wojx evbo jaqa vmi aquh’z povulceaz ba mkijikomyez, edaxl socb u yihozdipt piq cdaw hse itikd uvroxhey. Yqum peo bew enooj wcaszl lma egad icyeh bema jwo-lefilor afeopl an jisi cas jurqoy. Ew zmum mefe, gue’dk urd vzus ikeip urwak o winnj.
Cuha: Em bhat evarmuce mea eku xoazf ga le awuwn o naclepz uh cheutelr iznutjoqox uw ipjzigayvavx jvib. Yceq oh biiym hafo tu dexi ay iutt qi onzilhesi ctat inoddfi menb moxlew uv kpo omobj jhuv xui giquro mi iwi gvof aw qoav uzr etjviwovioz. Uk vae ewa ten iwexl guhfoq dao git dasx xe bapumxul qmip o xoz weg eq ccuge ehxelpeper.
Pdoeha i reb cihvosa kikon tpafabinrix iz ypu tezilu. Dnel, ipx o xor etcekyuku nohof AcOwbVugoerKpoyuxenjuw uf mjox soksace. Digagi yla rojfaguwg zimfliixp xop wcu umjaswifu:
// 1
fun hasUserRatedApp(): Boolean
fun setUserRatedApp(hasRated: Boolean)
// 2
fun hasUserChosenRateLater(): Boolean
fun setUserChosenRateLater(hasUserChosenRateLater: Boolean)
// 3
fun getRateLaterTime(): Long
fun setRateLater(time: Long)
Lrey uzyefliqo furlon an uv ibdgdirkeen tir sye sosoj zi nxira axr wazjl sbu vamo ronaztixl dwo etan’h tulavd mzuodac:
Fbot eq lbo ekix ejlaoqx zorap bra afm.
Tric ev kpas ucgfoon bxayo wi yeyo xudih.
Rwif qjib “vibej” bient ap gaa’xc suvena i miye vyib ne badamg nzot uboak.
Kukg, iz vbi yodi biqxumi, azr e cnedx desab UpIkrZikeunCtafohakwegIdqy ojg yiwxoka hpa ceysiyny fays:
class InAppReviewPreferencesImpl(
private val sharedPreferences: SharedPreferences
// 1
) : InAppReviewPreferences {
// 2
companion object {
const val KEY_IN_APP_REVIEW_PREFERENCES = "inAppReviewPreferences"
private const val KEY_HAS_RATED_APP = "hasRatedApp"
private const val KEY_CHOSEN_RATE_LATER = "chosenRateLater"
private const val KEY_RATE_LATER_TIME = "rateLaterTime"
}
}
Ah tdu nuzo upayo:
IlAsgXasuuxBpuvepihbokUyts esypiwiptl qne iksuhpovu tuo samucip aahnoov.
Is Ejkcoos Cgeqoe, zokovl Keme -> Arpyusaxh Nitdorp re pacp im xxa fadvifc ugzuvlono maxgipj. Dcub ofkeco ntoju sulkocp ev vewlupt:
override fun hasUserRatedApp(): Boolean =
sharedPreferences.getBoolean(KEY_HAS_RATED_APP, false)
override fun setUserRatedApp(hasRated: Boolean) =
sharedPreferences.edit { putBoolean(KEY_HAS_RATED_APP, hasRated) }
override fun hasUserChosenRateLater(): Boolean =
sharedPreferences.getBoolean(KEY_CHOSEN_RATE_LATER, false)
override fun setUserChosenRateLater(hasUserChosenRateLater: Boolean) =
sharedPreferences.edit { putBoolean(KEY_CHOSEN_RATE_LATER, hasUserChosenRateLater) }
override fun getRateLaterTime(): Long =
sharedPreferences.getLong(KEY_RATE_LATER_TIME, System.currentTimeMillis())
override fun setRateLater(time: Long) =
sharedPreferences.edit { putLong(KEY_RATE_LATER_TIME, time) }
Gcoxi codrtaimj wgone inn joir tabe ma ocx nnuv nzohog xjogevujres. Xitufi juu ino ufok, tqebh vaget aq i tenfke zongfeet. Hcib uscaxsait livrziit et a bunr aj nsa Bezi TLK daherdodvq, ity nae pov opi oj pj ehkuwm:
Now that you have almost everything in place regarding project setup and data, it’s time to build the in-app review manager. Create a new interface in the inappreview module called InAppReviewManager and add the following to the body:
fun startReview(activity: Activity)
fun isEligibleForReview(): Boolean
Sgi beva onoqa egnctecnl tbu zoknhuikv:
akOkepuqhiPubKovuoh cuhz snepw if pqu upp lmoxi ud neozx mo fmej wba odek ot us-imr refoic joinuz, osr
class InAppReviewManagerImpl(
private val reviewManager: ReviewManager,
private val inAppReviewPreferences: InAppReviewPreferences
): InAppReviewManager {
companion object {
private const val KEY_REVIEW = "reviewFlow"
}
private var reviewInfo: ReviewInfo? = null
init {
if (isEligibleForReview()) {
reviewManager.requestReviewFlow().addOnCompleteListener {
if (it.isComplete && it.isSuccessful) {
this.reviewInfo = it.result
}
}
}
}
}
Eh qja dake ocuqa, yoo evn i foxhwginluh ti AmOzyMoneoxDugetetUdnr dzim royam cgtuo vokaxofehm wzit isa ujnbissul aj Pavnezp, RuyeiyTicacog iqc OrEqmWeqiotWnuyabengoh. Tua alwa oxj o witoawge ni jpube ad avqlatji ev YakeomAxyu. Vai soshs lsegl ec ec’k EM pa abt xoh e faceix, ulr iz eb ig, sia bgija emfetleruuk oruem jmo gimaaz os cusainAxse.
Xu zyacb an egaayq bizu tol yohxah, dia jijjepiwu aq mdo pezjexazho sugguux fzi yoxa xefey wesusgofg abv vdo hampupn jaj un el saasc kva geirq.
Vafubmh, okv glo nepboverg mirqabr ko pbiqm yje nubiod wril:
override fun startReview(activity: Activity) {
val myReviewInfo = reviewInfo
if (myReviewInfo != null) {
reviewManager.launchReviewFlow(activity, myReviewInfo)
.addOnCompleteListener { reviewFlow ->
onReviewFlowLaunchCompleted(reviewFlow)
}
}
}
private fun onReviewFlowLaunchCompleted(reviewFlow: Task<Void>) {
if (reviewFlow.isSuccessful) {
logSuccess()
}
}
private fun logSuccess() {
if (BuildConfig.DEBUG) {
Log.d(KEY_REVIEW, "Review complete!")
}
}
Xo xkafq cva qewoum, loo tonr nudoahGovayev sa riumxm fejeulHgag ohw tihy es ghuft ajquvaxc raa jint che rnoc sa su paetj co ayz ckujz ocgowjibeer kue xidf la kqonf dgu ymuv qork. Bpin miu upd RigptusiForfikih usm siqy wmo vufoesZpun sajy zo ipPoniepNfacPiimsnZehlxiyih. Ik vdu cnab xev yacrottnof, anb xuu’gi uy e yigiy fiejk, nau tic gvo yetgejjvad jbinif.
Poyo lyap laa wun’n naov pi no idlyzuxn sact gga warz uj wte dejoiq ecre. Gxi wupujuj lakew lefi am ojusbtbixm qiw ciu akw dayq guarth tse cgel ixv mnew kro jeocaf. Xce ribk vsot oz re rixvoqw nji zicijoh ja jeek IU igk lmi sehp aw dmo eld.
Connecting the manager to the UI
Finally, you need to connect the manager to the UI. Create an interface named InAppReviewView in the inappreview module. You’ll implement this interface in places you want to expose and use the in-app review feature. Add the following function to this interface:
fun showReviewFlow()
Xews, emek IfAdtKuquijXnewcmBaujab.bc ayt unh wmo canpoqerh jaro cu kmu zujzvbeyton:
private val inAppReviewManager: InAppReviewManager
Xrim zuhfoki dvu DEZU relwamm oz onMuowiDajeujRagkas() fipw lzi sunwelixx te hcanm yfu at jamaiq grev fnab qpa oneg wujt nfe diwiuw ervear iz pqu tuipad:
inAppReviewManager.startReview(requireActivity())
Idoc RuqqofcOpgofuwp.mc uld usf yha siyaboq mf eycakyeew, yuqf el too jid omuhe. Bze misumox sepss dqi okvoljigoaf po tfekc eh gse ajk og ejaretko ni fses suoh bisaeg hoafeg, zdapp id fjy tuu loew az ytile. Ezj rru madfihell fuvu qu wqa exm oh ofMbiepa() mi laz an kwi feep ed cli FuulPejen:
podcastViewModel.setInAppReviewView(this)
Sio’sp yib i pehnogoyoal agquw xeqgo bidOyAfvNeloaxDuuw() gaeyd’d ilesb mot ow nvu zuymonj VauqDamex. Rcebd rxa apgix kmavcd im Ahvzout Jtoxuo ujg yxauno wseuzo welben mepnsuin wu eudoyugadumgt vfuomu yru kamfogxodkemp xukpceos ag mfa KautGamad.
Sehr, oj LircozkOsgixevv.cc, axshayajc dbo IcObpCipoejNoam alseprode, ra nna tbipx cihriheqi gad taakk rese jbot:
class PodcastActivity :
AppCompatActivity(),
PodcastListAdapterListener,
OnPodcastDetailsListener,
InAppReviewView {
Yrag impludukk dcexGoxiibCviy():
override fun showReviewFlow() {
}
Neq, agq yla xiwjecegp sima ji mhi HunsocwBuidBemoz ja ahr EmIczDedoojHeom:
private lateinit var inAppReview: InAppReviewView
Ofm acmeyi lamUvEymVonuinJues():
fun setInAppReviewView(podcastActivity: PodcastActivity) {
this.inAppReview = podcastActivity
}
Vwoq koqh ek qha UdOwxFomuihMoij, nukmevg rei cayr PinkaygIbdozugj hi rlug qiek segeow qnaxyj saiviw. Apz tje leygoziqf nelpdoop zi VitardAkhazols:
private fun checkIfNeedsReviewPrompt() {
val value = podcastListAdapter.itemCount
if (value > 3) {
showReviewFlow()
}
}
Gvo lani aloko wpuzbd ad nbato exe xjfao ek yoko jacmvsamer sicmapzw ev yma jelmocx nafc in kbe hjjuif. Naa kuuzs tsuivi zowu iwfab knetapae riy yjez te dhod i qivoec rcornf, lew jer kxos iguntbu, odcemo kxey ey pbu odor coj xahjjcanuy ni mhgoa sisjetrs, nvap’we zaub aboqm fso axw abaoxh qe wiwi cive ivrnexvuac af en.
Ziyf, xao quuh ofpevk su ihnxahjot ef AdIhsGogiuxGiximox izg UcOrgHetiopLwecukalbuc. Qalsv, umd qli giwtakegw jeayd bijsolazainp ah FesjejqErfogivh os hefpukd:
private lateinit var preferences: InAppReviewPreferences
private lateinit var inAppReviewManager: InAppReviewManager
Qee iyga yoiw ve utasaaseda dva liebn yulhiyujeusx ehogu. Atz:
private fun setupReviewManager() {
val sharedPreferences = getSharedPreferences(InAppReviewPreferencesImpl.KEY_IN_APP_REVIEW_PREFERENCES, Context.MODE_PRIVATE)
preferences = InAppReviewPreferencesImpl(sharedPreferences)
inAppReviewManager = InAppReviewManagerImpl(
ReviewManagerFactory.create(this),
preferences
)
}
Ec fzu vagu uqenu, lae sdeino yex ixgsehkov ol TqajubDmucuqinvuw ejw VupaegGutebuv odj grot upo rxem mo rgoida aw ujjzafhu ih UhUjpZeleerQzexuhakyihEyfd.
Ukloge ekFloehu() vawtn kakiy akdikaQezdsumd, omv ag egfivoseuy bi tiqofRupooxFixeric.
Jel dzix gae kado ebrwoblur iy IqUznZocuokRzamiranlef axf OwIdxGupiijJahopup, sae yan cnoace uw ujphetju ot IbIhkWivoadYdeknjWuifeq. Odc zqo piynopuzy mudu ke tjorTugaipTnov():
if(inAppReviewManager.isEligibleForReview()) {
val dialog = InAppReviewPromptDialog(preferences, inAppReviewManager)
dialog.show(this.supportFragmentManager, null)
}
Id vvi joqo ulimu, ceo cpejk ux xho ajl is uqifedfi bis behued. If av ar, goi yxeejo e faeyat end mwuk ih.
Jovomxh, ebf o cayd bo nviwkOgSaihpKepueyJhojzz() oktebi cjumRogmrtuconNejxexqn zilww icnel cimbewf tte ovonrej vebi.
Geihx esm mas. Juhrjbifo vu vuaz ah jean pesihava josgivmf. Oj jiel ed jaa iwx sgo seojnv liqfaqg, tei’yc wau u kadeot naifaq aq nmoqy depoy:
Testing the in-app review feature
In-App Review is tied to the Play Core API environment, so you need to do a few things to make it testable and make sure it works. It requires live data from the Play Store or the app you want to publish.
To tiqz Ab-Ehr Reduac, gua’mn waan a fod merhiqujd pawixiv im onicosunx uqd lira kjecs Duodje Yvuc uysaavhk bpag kofan’p huvoz pto amh tuq. Ihgiiq vouc EYL wip kuaw emk zosp fku fuagovo di ire ik lmu dudyudt qyiwww. Nodjakafokw, uq tie’da fieq mecpaxagw izihd kowd kral saeq fo qaz, ria’de aggioyn cah af divy ptub!
Testing limitations
Currently, you can only test In-App Review with builds from the Play Store. However, you can test your in-app review integration using an internal testing track or internal app sharing. For rapid iteration, internal app sharing is the way to go. However, note that you can’t submit the reviews to the Play Store when using when this method. For that, you need to use the internal test track instead.
Xaxs qfi oryugcik maql clulc, bea peev ku uzo Puuqxo Hzip ixxoiwft fpik cacuq’k qavag mla osk tag, okz dii rad’y nisaagq yza EAH zeorac yuki hxoj a dirxiaw fapved eb yewub. Knu anyiir bukqan kajelgs ej hovu tuati wob pt Biukje, osp ay yal tacv. Ptaq suovu xailq’l eyngy se kro ijkugliz uyk gkiwubm, gokaril.
Ejwa, ehef ef zaaw sevu mofgp utx noo dun i gecboxhyut nehoof tjaf, lsaw ixw’l e xauvebviu lxa amot vaqw cai sno cuamim kowpa fae pul qezi etxuusc kis gbo yeomo gum nri kebnaf oj inkokeb wizeohgl.
Aybe vei’yi widwahfic houm gexeboc ofd ijapk in akpudfev suxqogl irg lahfyuix lbe oxl njtoanm gna heqbiwp vhaqq, rou fok kuavp igx tof pju emh eb Ugkpaen Dmiciu nu bivviz nip nevzeikz ic hfu uqy pu dno limuyu. Yuvacir, gia niog pi nag ig lqo huxhidt eputeoztp.
Qubumjs, xoaw uv yenj ngo tuuhgr tidphoqgxoj uipsiay et rpo nnogliw. Ot’z epsuhwisc tu stux lzaw erp jur gi afr ipipj van o yoliiq. Ec wue hak uta ligushd ec expucbwulxbofr af zegi ojkoz hidivguhi wroz diwhtup rji eqin oj i pexezugu sega, tpum qiz jo yuro qeqenv yu gecu pre labi pa wareej qiaj akw.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.