2017-09-21 11 views
0

Google 자습서에 따라 Play 청구 라이브러리 1.0으로 앱내 구매를 구현했습니다. 구매할 상품이 하나 뿐이며 잠금 해제되면 Toast.LENGTH_SHORT 길이의 토스트 메시지를 보여줍니다. 그러나 Toast는 10 초 동안 거기에 머물러 있기 때문에 여러 번 호출됩니다. queryPurchases를 통해 잠금을 해제하면 발생하지 않습니다 (다른 사용자가 먼저 구입하여 그 동안 앱을 다시 설치 한 경우).앱 구매시 여러 번 호출 된 것 같습니다

누구나 토스트가 왜 그렇게 오래 머물러 있는지/여러 번 호출되는 이유를 알 수 있습니까?

@Override 
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { 
    if (responseCode == BillingClient.BillingResponse.OK) { 
     for (Purchase purchase : purchases) { 
      handlePurchases(purchase); 
     } 
     mBillingUpdatesListener.onPurchasesUpdated(mPurchases); 
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) { 

    } else { 

    } 
} 

public void handlePurchases(Purchase purchase) { 
    //here could be validation on own server 

    mPurchases.add(purchase); 
} 

주요 활동은 BillingUpdatesListener 구현 : 내 BillingManager 클래스 내부

@Override 
public void onPurchasesUpdated(List<Purchase> purchases) { 
    for (Purchase purchase : purchases) { 
     switch (purchase.getSku()) { 
      case "premium": 
       unlockPremium(); 
       break; 
     } 
    } 
} 

public void unlockPremium() { 
    mPremiumUnlocked = true; 
    savePremiumUnlocked(); 
    Toast.makeText(this, getResources().getString(R.string.premium_congrats), Toast.LENGTH_SHORT).show(); 
    mAdView.setVisibility(GONE); 
} 
+1

여러 번 호출했는지 여부를 확인할 수 있도록 디버그하십시오. – Pelocho

+0

어떻게? Android Studio 대신 Play 스토어에서 다운로드 한 실제 앱으로 만 구매할 수 있습니다. –

+1

쓰레기. 테스트 구매도 할 수 있습니다. RTFM –

답변

3

난 당신이 정확하게, 당신은 당신이 처음에 인앱 상품을 구입하면, 당신이지고 있다고 이해한다면 여러 토스트?

결제 라이브러리의 현재 버전 (1.0)에서 시스템에서 여러 번 브로드 캐스트 중이기 때문에 이러한 현상이 발생합니다.

예를 들어, onPurchaseFinishedReceiver을 1208 행의 라이브러리에서 BillingClientImpl.java 번으로 보았을 때 구매 후 적어도 두 번 호출됩니다. 두 번 모두 인앱 구매 데이터가 첨부되었지만 Action 의도가 각 브로드 캐스트마다 다른 것으로 나타났습니다.

첫 번째 브로드 캐스트에서 동작은 com.android.vending.billing.PURCHASES_UPDATED 이었지만 두 번째는 proxy_activity_response_intent_action이었습니다. 라이브러리는 작업 값을 필터링하지 않으므로 이러한 모든 브로드 캐스트가 호출되어 purchasesUpdatedListener이 호출됩니다.

나는 더 이상 조사하지는 않았지만, 우리가 취할 수있는 것은 변화가 발생했기 때문에 그러한 변화를 방송해야한다고 생각한 것입니다.

여러 토스트를 피하려면 프리미엄 기능이 잠금 해제되어 있지 않으면 토스트를 표시하지 마십시오. 즉, 이미 잠금 해제되어있는 경우 변경 알림을 무시하십시오.

그런데 Android Studio에서 구매 흐름을 완전히 디버깅 할 수 있습니다. 릴리스 키를 사용하여 디버그 apk에 서명하고 apk 버전이 Play 스토어의 버전보다 높지 않은지 확인하십시오.

buildTypes { 

    debug { 
     minifyEnabled false 
     debuggable true 
     signingConfig signingConfigs.release 
    } 


    release { 
     minifyEnabled false 
     signingConfig signingConfigs.release 
    } 
} 
+0

와우, 놀라운 통찰력, 감사합니다! –

+0

어쩌면 당신은 내 다른 질문에 대한 아이디어도 가지고있을 것입니다. https://stackoverflow.com/questions/46341550/can-billingclients-querypurchases-give-me-a-reliable-statement-about-the-owners –

+0

설명을 위해서 : onPurchaseUpdated를 여러 번 호출하는 데 신경 쓰지 않아도됩니까? 방금 내 unlockPremium 메서드를 둘러싼 프리미엄에 대한 확인이 이미 잠금 해제되어 있습니다 (그래서 내가 건너 뛸 수 있습니다). –

1

위대한 대답과 @ 키프로 깊이 찾고!

구글은 곧 여러 통화를 해결됩니다 : 어쨌든 일어날 수 있기 때문에 https://issuetracker.google.com/issues/66054158

그러나, 청구 흐름과의 통합은 onPurchasesUpdate 여러 번 트리거 된 경우에도 작동합니다. 예를 들어 누군가가 동일한 @gmail 계정으로 다른 기기에서 동시에 구매했다면 일부 국가 (예 : 스페인)의 사람들은 @ Gmail 계정을 많은 친구 및 가족과 자주 공유합니다.

TrivialDrive_v2 구현을 확인하여 이러한 상황을 정상적으로 처리하는 방법을 확인하십시오.

1

정확한 시나리오에 해당되는지는 잘 모르겠지만 동일한 문제가 발생하며 Google 측의 버그입니다.

자세한 내용은 https://issuetracker.google.com/issues/66054158을 참조하십시오.

편집 : 난 그냥 @goRGon 같은 일 :

스페인에서 여러 사람의 예는 위에서 설명한 무슨와 같은 상황이되지 않습니다 게시 것을 보았다. 스페인 시나리오에서 사용자는 실제로 IAP 사본 두 부를 구입하므로 두 개의 별도 영수증을 갖게되며 사용자는 구매 한 항목의 두 사본으로 보상을 받아야합니다. 버그 시나리오에서는 하나의 영수증이 사용자에게 두 번 표시되므로 복제본을 실제로 잡을 수 있습니다. 그러나 어느 쪽이든, 백엔드 검증 시스템은 해커/버그를 코드에 수용해야하므로 동일한 영수증을 두 번 연속 전송할 수 있습니다.